Merge m-c to autoland, a=merge
authorWes Kocher <wkocher@mozilla.com>
Thu, 19 Jan 2017 16:47:25 -0800
changeset 375219 ba0d9cdcca152a3417114f427258b6bcc0ef9339
parent 375218 ac18f90da7c0a692fa1300b4f20e62de8e08061b (current diff)
parent 375160 bde3fc40b9b55435d989393d659a60f46b54fd72 (diff)
child 375220 79d111e76fc98325a190cbe634859e67c504cab7
push id6996
push userjlorenzo@mozilla.com
push dateMon, 06 Mar 2017 20:48:21 +0000
treeherdermozilla-beta@d89512dab048 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone53.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge m-c to autoland, a=merge MozReview-Commit-ID: 3pEpsd3DljH
browser/base/content/test/webrtc/browser.ini
python/mozbuild/mozbuild/frontend/emitter.py
testing/firefox-ui/tests/functional/security/manifest.ini
testing/web-platform/meta/2dcontext/compositing/canvas_compositing_globalcompositeoperation_001.htm.ini
testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_1.html.ini
testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_2.html.ini
testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_3.html.ini
testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1.html.ini
testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10.html.ini
testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2.html.ini
testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3.html.ini
testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4.html.ini
testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5.html.ini
testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6.html.ini
testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7.html.ini
testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8.html.ini
testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_9.html.ini
testing/web-platform/meta/2dcontext/line-styles/canvas_linestyles_linecap_001.htm.ini
testing/web-platform/meta/2dcontext/line-styles/lineto_a.html.ini
testing/web-platform/meta/2dcontext/the-canvas-state/canvas_state_restore_001.htm.ini
testing/web-platform/meta/2dcontext/transformations/canvas_transformations_reset_001.html.ini
testing/web-platform/meta/2dcontext/transformations/canvas_transformations_scale_001.htm.ini
testing/web-platform/meta/2dcontext/transformations/transform_a.html.ini
testing/web-platform/meta/ambient-light/AmbientLightSensor_browsing_context.html.ini
testing/web-platform/meta/ambient-light/AmbientLightSensor_onstatechange.html.ini
testing/web-platform/meta/ambient-light/AmbientLightSensor_start.html.ini
testing/web-platform/meta/ambient-light/AmbientLightSensor_stop.html.ini
testing/web-platform/meta/ambient-light/idlharness.html.ini
testing/web-platform/meta/cssom-view/scrollingElement.html.ini
testing/web-platform/meta/encrypted-media/clearkey-mp4-setmediakeys.html.ini
testing/web-platform/meta/fetch/nosniff/image.html.ini
testing/web-platform/meta/html-media-capture/capture_fallback_file_upload.html.ini
testing/web-platform/meta/html/dom/elements/global-attributes/dir_auto-N-EN.html.ini
testing/web-platform/meta/html/semantics/embedded-content/the-embed-element/embed-represent-nothing-03.html.ini
testing/web-platform/meta/html/semantics/embedded-content/the-video-element/video_content_image.htm.ini
testing/web-platform/meta/html/semantics/embedded-content/the-video-element/video_content_text.htm.ini
testing/web-platform/meta/html/semantics/text-level-semantics/the-bdo-element/bdo-override.html.ini
testing/web-platform/meta/html/semantics/text-level-semantics/the-br-element/br-bidi.html.ini
testing/web-platform/meta/service-workers/cache-storage/serviceworker/credentials.html.ini
testing/web-platform/meta/webmessaging/with-ports/023.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/2_tracks.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/align_end.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/align_middle.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/align_middle_position_50.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/align_middle_position_lt_50_size_gt_maximum_size.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/bidi/bidi_ruby.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/bidi/u002E_LF_u05D0.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/bidi/u002E_u2028_u05D0.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/bidi/u002E_u2029_u05D0.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/bidi/u0041_first.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/bidi/u05D0_first.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/bidi/u0628_first.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/decode_escaped_entities.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/evil/size_90.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/evil/size_99.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/one_line_cue_plus_wrapped_cue.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue/background_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue/background_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue/background_shorthand_css_relative_url.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue/color_hex.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue/color_hsla.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue/color_rgba.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue/cue_selector_single_colon.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue/outline_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue/outline_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_line-through.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_overline.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_overline_underline_line-through.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_underline.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-shadow.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_normal_wrapped.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_nowrap_wrapped.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre-line_wrapped.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_box.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_shorthand_css_relative_url.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_animation_with_timestamp.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_background_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_background_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_color.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_font_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_font_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_namespace.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_outline_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_outline_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_text-decoration_line-through.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_text-shadow.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_timestamp_future.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_timestamp_past.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_with_class.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_with_class_object_specific_selector.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_animation_with_timestamp.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_background_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_background_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_color.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_font_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_font_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_namespace.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_outline_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_outline_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_text-decoration_line-through.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_text-shadow.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_timestamp_future.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_timestamp_past.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_transition_with_timestamp.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_with_class.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_with_class_object_specific_selector.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/color_hex.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/color_hsla.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/color_rgba.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/cue_func_selector_single_colon.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/id_color.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_animation_with_timestamp.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_background_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_background_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_color.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_font_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_font_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_namespace.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_outline_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_outline_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_text-decoration_line-through.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_text-shadow.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_timestamp_future.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_timestamp_past.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_transition_with_timestamp.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_with_class.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_with_class_object_specific_selector.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/not_allowed_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/not_root_selector.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/outline_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/outline_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/root_namespace.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/root_selector.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_line-through.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_overline.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_overline_underline_line-through.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_underline.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-shadow.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/type_selector_root.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_animation_with_timestamp.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_background_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_background_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_color.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_font_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_font_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_namespace.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_outline_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_outline_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_text-decoration_line-through.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_text-shadow.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_timestamp_future.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_timestamp_past.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_transition_with_timestamp.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_with_class.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_with_class_object_specific_selector.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_animation_with_timestamp.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_background_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_background_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_color.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_font_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_font_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_namespace.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_outline_properties.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_outline_shorthand.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_text-decoration_line-through.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_text-shadow.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_timestamp_future.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_timestamp_past.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_transition_with_timestamp.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_voice_attribute.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_with_class.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_with_class_object_specific_selector.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_normal_wrapped.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_nowrap_wrapped.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre-line_wrapped.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/default_styles/bold_object_default_font-style.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/default_styles/inherit_as_default_value_inherits_values_from_media_element.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/default_styles/italic_object_default_font-style.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/selectors/default_styles/underline_object_default_font-style.html.ini
testing/web-platform/meta/webvtt/rendering/cues-with-video/processing-model/size_50.html.ini
testing/web-platform/tests/ambient-light/AmbientLightSensor_browsing_context.html
testing/web-platform/tests/ambient-light/AmbientLightSensor_onchange-manual.html
testing/web-platform/tests/ambient-light/AmbientLightSensor_onstatechange.html
testing/web-platform/tests/ambient-light/AmbientLightSensor_start.html
testing/web-platform/tests/ambient-light/AmbientLightSensor_stop.html
testing/web-platform/tests/ambient-light/idlharness.html
testing/web-platform/tests/annotation-model/annotations/bodiesTargets/3.2.7-bodyChoiceSet.json
testing/web-platform/tests/annotation-model/annotations/bodiesTargets/3.2.7-targChoiceSet.json
testing/web-platform/tests/annotation-model/annotations/bodiesTargets/3.2.8-bodyComposite.json
testing/web-platform/tests/annotation-model/annotations/bodiesTargets/3.2.8-bodyIndependents.json
testing/web-platform/tests/annotation-model/annotations/bodiesTargets/3.2.8-bodyList.json
testing/web-platform/tests/annotation-model/annotations/bodiesTargets/3.2.8-targComposite.json
testing/web-platform/tests/annotation-model/annotations/bodiesTargets/3.2.8-targIndependents.json
testing/web-platform/tests/annotation-model/annotations/bodiesTargets/3.2.8-targList.json
testing/web-platform/tests/annotation-model/annotations/bodiesTargets/4-bodyChoiceSetFound.json
testing/web-platform/tests/annotation-model/annotations/bodiesTargets/4-targChoiceSetFound.json
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest-empty-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest-whitespace-only-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/fragment-backslash-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/fragment-contains-hash-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/fragment-contains-pile-of-poo-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/fragment-contains-question-mark-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/fragment-empty-hash-only-no-path-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/fragment-leading-space-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/fragment-non-ascii-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/fragment-semicolon-question-mark-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/fragment-slash-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-192.0x00A80001-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-IP-address-broken-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-IP-address-fullwidth-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-IP-address-percent-encoded-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-cr-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-double-percent-encoded-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-double-percent-encoded-percent-encoded-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-empty-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-empty-userinfo-empty-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-empty-with-userinfo-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-exotic-dot-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-exotic-whitespace-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-fullwidth-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-hostname-in-brackets-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-idn-unicode-han-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-invalid-unicode-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-invalid-unicode-percent-encoded-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-ipv6-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-ipv6-port-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-is-pile-of-poo-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-newline-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-space-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-square-brackets-port-contains-colon-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-tab-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-u0000-percent-encoded-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/host-u0000-percent-encoded-percent-encoded-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-bare-percent-sign-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-colon-colon-number-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-colon-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-contains-pile-of-poo-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-contains-space-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-leading-backslash-at-sign-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-backslash-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-chars-backslash-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-chars-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-colon-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-hash-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-letter-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-number-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-leading-colon-slash-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-leading-space-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-non-ascii-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-dot-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-malformed-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-mixed-case-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-multiple-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-slash-plus-slashes-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-slash-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-space-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-u0000-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-percent-encoded-u0091-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-relative-square-brackets-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-simple-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-slash-colon-number-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-slash-only-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-starts-with-pile-of-poo-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-tab-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-trailing-space-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-u0091-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-u202E-u202D-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-uFEFF-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/path-unicode-han-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/port-0-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/port-00000000000000-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/port-00000000000000000000080-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/port-999999-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/port-cr-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/port-leading-colon-bracket-colon-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/port-leading-colon-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/port-leading-dash-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/port-multiple-letters-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/port-newline-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/port-none-but-colon-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/port-single-letter-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/port-space-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/port-tab-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/query-contains-pile-of-poo-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/query-contains-question-mark-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/query-empty-no-path-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/query-leading-space-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/query-trailing-space-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-data-contains-fragment-haswarn.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-data-no-slash-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-data-single-slash-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-file-backslash-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-file-host-empty-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-file-host-included-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-file-no-slash-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-file-scheme-only-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-file-single-slash-c-bar-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-file-single-slash-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-only-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-slash-abc-bar-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-slash-c-bar-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-slash-only-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-file-slash-slash-slash-only-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-file-triple-slash-c-bar-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-file-uppercase-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-ftp-no-slash-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-ftp-single-slash-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-ftps-no-slash-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-ftps-single-slash-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-gopher-no-slash-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-gopher-single-slash-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-http-backslash-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-http-no-slash-colon-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-http-no-slash-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-http-no-slash-square-bracket-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-http-single-slash-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-https-no-slash-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-https-single-slash-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-javascript-no-slash-malformed-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-javascript-single-slash-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-mailto-no-slash-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-mailto-single-slash-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-none-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-private-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-private-no-slash-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-private-path-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-private-path-leading-slashes-chars-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-private-path-leading-slashes-colon-slashes-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-private-path-leading-slashes-only-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-private-single-letter-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-private-single-slash-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-private-slash-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-private-slash-slash-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-schemeless-relative-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-trailing-cr-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-trailing-newline-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-trailing-space-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-trailing-tab-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-ws-single-slash-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-wss-no-slash-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/scheme-wss-single-slash-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/userinfo-backslash-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/userinfo-empty-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/userinfo-host-port-path-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/userinfo-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/userinfo-password-bad-chars-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/userinfo-password-contains-pile-of-poo-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/userinfo-password-empty-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/userinfo-user-empty-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/userinfo-username-contains-at-sign-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/userinfo-username-contains-percent-encoded-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/userinfo-username-contains-pile-of-poo-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/html/manifest/userinfo-username-non-alpha-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/keygen/challenge-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/keygen/keytype-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/keygen/model-isvalid.html
testing/web-platform/tests/conformance-checkers/html/elements/keygen/no-attributes-isvalid.html
testing/web-platform/tests/conformance-checkers/xhtml/elements/keygen/054-isvalid.xhtml
testing/web-platform/tests/conformance-checkers/xhtml/elements/keygen/055-isvalid.xhtml
testing/web-platform/tests/conformance-checkers/xhtml/elements/keygen/056-isvalid.xhtml
testing/web-platform/tests/conformance-checkers/xhtml/elements/keygen/057-isvalid.xhtml
testing/web-platform/tests/conformance-checkers/xhtml/elements/keygen/058-isvalid.xhtml
testing/web-platform/tests/cookies/secure/set-from-dom.sub.html
testing/web-platform/tests/cookies/secure/set-from-http.sub.html
testing/web-platform/tests/custom-elements/v0/concepts/custom-elements-type-allowed-chars-first-char.html
testing/web-platform/tests/custom-elements/v0/concepts/custom-elements-type-allowed-chars.html
testing/web-platform/tests/custom-elements/v0/concepts/custom-elements-type-naming.html
testing/web-platform/tests/custom-elements/v0/creating-and-passing-registries/new-registry-test.html
testing/web-platform/tests/custom-elements/v0/creating-and-passing-registries/no-registry-test.html
testing/web-platform/tests/custom-elements/v0/creating-and-passing-registries/share-registry-create-document.html
testing/web-platform/tests/custom-elements/v0/creating-and-passing-registries/share-registry-import-document.html
testing/web-platform/tests/custom-elements/v0/custom-element-lifecycle/enqueuing-and-invoking-callbacks/invoke-callbacks.html
testing/web-platform/tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attached-callback-move-element-test.html
testing/web-platform/tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attached-callback-test.html
testing/web-platform/tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attribute-changed-callback-change-attribute-test.html
testing/web-platform/tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attribute-changed-callback-remove-attribute-test.html
testing/web-platform/tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/attribute-changed-callback-set-attribute-test.html
testing/web-platform/tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/created-callback-element-prototype-test.html
testing/web-platform/tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/created-callback-invocation-order-test.html
testing/web-platform/tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/created-callback-invocation-test.html
testing/web-platform/tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/detached-callback-move-element-test.html
testing/web-platform/tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/detached-callback-no-browsing-context-test.html
testing/web-platform/tests/custom-elements/v0/custom-element-lifecycle/types-of-callbacks/detached-callback-with-browsing-context-test.html
testing/web-platform/tests/custom-elements/v0/instantiating/changing-is-attribute.html
testing/web-platform/tests/custom-elements/v0/instantiating/custom-element-constructor-is-attribute.html
testing/web-platform/tests/custom-elements/v0/instantiating/custom-element-constructor-local-name.html
testing/web-platform/tests/custom-elements/v0/instantiating/custom-element-constructor-namespace.html
testing/web-platform/tests/custom-elements/v0/instantiating/custom-element-constructor-node-document.html
testing/web-platform/tests/custom-elements/v0/instantiating/custom-element-constructor-prototype.html
testing/web-platform/tests/custom-elements/v0/instantiating/custom-element-prototype.html
testing/web-platform/tests/custom-elements/v0/instantiating/custom-element-type-is-attribute.html
testing/web-platform/tests/custom-elements/v0/instantiating/custom-element-type-local-name-and-is-attribute.html
testing/web-platform/tests/custom-elements/v0/instantiating/custom-element-type-local-name.html
testing/web-platform/tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-interface-type-is-a-local-name.html
testing/web-platform/tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-interface-type-is-a-type-extension.html
testing/web-platform/tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-is-attribute.html
testing/web-platform/tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-namespace.html
testing/web-platform/tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-type-extension-is-a-type.html
testing/web-platform/tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-type-extension-unresolved.html
testing/web-platform/tests/custom-elements/v0/instantiating/extensions-to-document-interface/create-element-type-is-a-local-name.html
testing/web-platform/tests/custom-elements/v0/instantiating/extensions-to-document-interface/created-callback-create-element-ns.html
testing/web-platform/tests/custom-elements/v0/instantiating/extensions-to-document-interface/created-callback-create-element.html
testing/web-platform/tests/custom-elements/v0/instantiating/non-configurable-constructor-property.html
testing/web-platform/tests/custom-elements/v0/instantiating/prototype-is-interface-prototype-object.html
testing/web-platform/tests/custom-elements/v0/instantiating/unchanged-attribute.html
testing/web-platform/tests/custom-elements/v0/registering/definition-construction-algorithm-default-namespace.html
testing/web-platform/tests/custom-elements/v0/registering/definition-construction-algorithm-duplicate-definition.html
testing/web-platform/tests/custom-elements/v0/registering/definition-construction-algorithm-invalid-type.html
testing/web-platform/tests/custom-elements/v0/registering/definition-construction-algorithm-local-name-lowercased.html
testing/web-platform/tests/custom-elements/v0/registering/definition-construction-algorithm-name-is-null.html
testing/web-platform/tests/custom-elements/v0/registering/definition-construction-algorithm-no-interface-for-name.html
testing/web-platform/tests/custom-elements/v0/registering/definition-construction-algorithm-svg-namespace-name-is-null.html
testing/web-platform/tests/custom-elements/v0/registering/definition-construction-algorithm-svg-namespace.html
testing/web-platform/tests/custom-elements/v0/registering/definition-construction-algorithm-type-name-lowercased.html
testing/web-platform/tests/custom-elements/v0/registering/element-registration-algorithm-no-registry.html
testing/web-platform/tests/custom-elements/v0/registering/extensions-to-document-interface/custom-element-name.html
testing/web-platform/tests/custom-elements/v0/registering/extensions-to-document-interface/custom-element-prototype.html
testing/web-platform/tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-custom-tag-ref.html
testing/web-platform/tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-custom-tag.html
testing/web-platform/tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-custom-tag-ref.html
testing/web-platform/tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-custom-tag.html
testing/web-platform/tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-type-extension-ref.html
testing/web-platform/tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-registered-type-extension.html
testing/web-platform/tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-type-extension-ref.html
testing/web-platform/tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-type-extension.html
testing/web-platform/tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-matching-query-selector-all.html
testing/web-platform/tests/custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-matching-query-selector.html
testing/web-platform/tests/custom-elements/v0/registering/unresolved-elements-interface-html-element.html
testing/web-platform/tests/custom-elements/v0/registering/unresolved-elements-interface-html-unknown-element.html
testing/web-platform/tests/custom-elements/v0/registering/unresolved-elements-interface-svg-element.html
testing/web-platform/tests/custom-elements/v0/resources/blank.html
testing/web-platform/tests/custom-elements/v0/resources/import-master-async.html
testing/web-platform/tests/custom-elements/v0/resources/import-master.html
testing/web-platform/tests/custom-elements/v0/resources/import.html
testing/web-platform/tests/custom-elements/v0/resources/register-and-create-custom-element.html
testing/web-platform/tests/custom-elements/v0/resources/x-element.html
testing/web-platform/tests/custom-elements/v0/resources/x-mathml-element.html
testing/web-platform/tests/custom-elements/v0/resources/x-svg-element.html
testing/web-platform/tests/custom-elements/v0/testcommon.js
testing/web-platform/tests/html-media-capture/capture_fallback_file_upload.html
testing/web-platform/tests/html/editing/dnd/canvas/cross-domain/001.xhtml
testing/web-platform/tests/html/editing/dnd/cross-document/002.html
testing/web-platform/tests/html/editing/dnd/images/cross-domain/001.xhtml
testing/web-platform/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-start.html
testing/web-platform/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-stop.html
testing/web-platform/tests/html/semantics/grouping-content/.gitkeep
testing/web-platform/tests/html/semantics/grouping-content/the-li-element/.gitkeep
testing/web-platform/tests/html/semantics/grouping-content/the-ol-element/.gitkeep
testing/web-platform/tests/html/webappapis/scripting/events/messageevent-constructor.html
testing/web-platform/tests/pointerevents/pointerevent_gotpointercapture_before_first_pointerevent-manual.html
testing/web-platform/tests/presentation-api/controlling-ua/reconnectToPresentation_error-manual.html
testing/web-platform/tests/service-workers/cache-storage/resources/testharness-helpers.js
testing/web-platform/tests/service-workers/cache-storage/serviceworker/credentials.html
testing/web-platform/tests/tools/manifest/tests/test_utils.py
testing/web-platform/tests/tools/manifest/tree.py
--- a/.eslintignore
+++ b/.eslintignore
@@ -63,17 +63,17 @@ browser/base/content/test/general/file_c
 browser/base/content/test/urlbar/file_blank_but_not_blank.html
 browser/base/content/newtab/**
 browser/components/downloads/**
 browser/components/privatebrowsing/**
 browser/components/sessionstore/**
 browser/components/tabview/**
 # generated files in cld2
 browser/components/translation/cld2/cld-worker.js
-browser/extensions/pdfjs/**
+browser/extensions/pdfjs/content/**
 # generated or library files in pocket
 browser/extensions/pocket/content/panels/js/tmpl.js
 browser/extensions/pocket/content/panels/js/vendor/**
 browser/locales/**
 # imported from chromium
 browser/extensions/mortar/**
 
 # devtools/ exclusions
--- a/browser/base/content/browser-sets.inc
+++ b/browser/base/content/browser-sets.inc
@@ -11,36 +11,36 @@
 
   <stringbundleset id="stringbundleset">
     <stringbundle id="bundle_brand" src="chrome://branding/locale/brand.properties"/>
     <stringbundle id="bundle_shell" src="chrome://browser/locale/shellservice.properties"/>
     <stringbundle id="bundle_preferences" src="chrome://browser/locale/preferences/preferences.properties"/>
   </stringbundleset>
 
   <commandset id="mainCommandSet">
-    <command id="cmd_newNavigator" oncommand="OpenBrowserWindow()" reserved="true"/>
+    <command id="cmd_newNavigator" oncommand="OpenBrowserWindow()"/>
     <command id="cmd_handleBackspace" oncommand="BrowserHandleBackspace();" />
     <command id="cmd_handleShiftBackspace" oncommand="BrowserHandleShiftBackspace();" />
 
-    <command id="cmd_newNavigatorTab" oncommand="BrowserOpenTab(event);" reserved="true"/>
-    <command id="cmd_newNavigatorTabNoEvent" oncommand="BrowserOpenTab();" reserved="true"/>
+    <command id="cmd_newNavigatorTab" oncommand="BrowserOpenTab(event);"/>
+    <command id="cmd_newNavigatorTabNoEvent" oncommand="BrowserOpenTab();"/>
     <command id="Browser:OpenFile"  oncommand="BrowserOpenFileWindow();"/>
     <command id="Browser:SavePage" oncommand="saveBrowser(gBrowser.selectedBrowser);"/>
 
     <command id="Browser:SendLink"
              oncommand="MailIntegration.sendLinkForBrowser(gBrowser.selectedBrowser);"/>
 
     <command id="cmd_pageSetup" oncommand="PrintUtils.showPageSetup();"/>
     <command id="cmd_print" oncommand="PrintUtils.printWindow(window.gBrowser.selectedBrowser.outerWindowID, window.gBrowser.selectedBrowser);"/>
     <command id="cmd_printPreview" oncommand="PrintUtils.printPreview(PrintPreviewListener);"/>
-    <command id="cmd_close" oncommand="BrowserCloseTabOrWindow()" reserved="true"/>
-    <command id="cmd_closeWindow" oncommand="BrowserTryToCloseWindow()" reserved="true"/>
+    <command id="cmd_close" oncommand="BrowserCloseTabOrWindow()"/>
+    <command id="cmd_closeWindow" oncommand="BrowserTryToCloseWindow()"/>
     <command id="cmd_toggleMute" oncommand="gBrowser.selectedTab.toggleMuteAudio()"/>
     <command id="cmd_CustomizeToolbars" oncommand="BrowserCustomizeToolbar()"/>
-    <command id="cmd_quitApplication" oncommand="goQuitApplication()" reserved="true"/>
+    <command id="cmd_quitApplication" oncommand="goQuitApplication()"/>
 
 
     <commandset id="editMenuCommands"/>
 
     <command id="View:PageSource" oncommand="BrowserViewSource(window.gBrowser.selectedBrowser);" observes="canViewSource"/>
     <command id="View:PageInfo" oncommand="BrowserPageInfo();"/>
     <command id="View:FullScreen" oncommand="BrowserFullScreen();"/>
     <command id="View:ReaderView" oncommand="ReaderParent.toggleReaderMode(event);"/>
@@ -75,38 +75,38 @@
     <command id="Browser:Stop"    oncommand="BrowserStop();" disabled="true"/>
     <command id="Browser:Reload"  oncommand="if (event.shiftKey) BrowserReloadSkipCache(); else BrowserReload()" disabled="true"/>
     <command id="Browser:ReloadOrDuplicate" oncommand="BrowserReloadOrDuplicate(event)" disabled="true">
       <observes element="Browser:Reload" attribute="disabled"/>
     </command>
     <command id="Browser:ReloadSkipCache" oncommand="BrowserReloadSkipCache()" disabled="true">
       <observes element="Browser:Reload" attribute="disabled"/>
     </command>
-    <command id="Browser:NextTab" oncommand="gBrowser.tabContainer.advanceSelectedTab(1, true);" reserved="true"/>
-    <command id="Browser:PrevTab" oncommand="gBrowser.tabContainer.advanceSelectedTab(-1, true);" reserved="true"/>
+    <command id="Browser:NextTab" oncommand="gBrowser.tabContainer.advanceSelectedTab(1, true);"/>
+    <command id="Browser:PrevTab" oncommand="gBrowser.tabContainer.advanceSelectedTab(-1, true);"/>
     <command id="Browser:ShowAllTabs" oncommand="allTabs.open();"/>
     <command id="cmd_fullZoomReduce"  oncommand="FullZoom.reduce()"/>
     <command id="cmd_fullZoomEnlarge" oncommand="FullZoom.enlarge()"/>
     <command id="cmd_fullZoomReset"   oncommand="FullZoom.reset()"/>
     <command id="cmd_fullZoomToggle"  oncommand="ZoomManager.toggleZoom();"/>
     <command id="cmd_gestureRotateLeft" oncommand="gGestureSupport.rotate(event.sourceEvent)"/>
     <command id="cmd_gestureRotateRight" oncommand="gGestureSupport.rotate(event.sourceEvent)"/>
     <command id="cmd_gestureRotateEnd" oncommand="gGestureSupport.rotateEnd()"/>
     <command id="Browser:OpenLocation" oncommand="openLocation();"/>
     <command id="Browser:RestoreLastSession" oncommand="restoreLastSession();" disabled="true"/>
-    <command id="Browser:NewUserContextTab" oncommand="openNewUserContextTab(event.sourceEvent);" reserved="true"/>
+    <command id="Browser:NewUserContextTab" oncommand="openNewUserContextTab(event.sourceEvent);"/>
     <command id="Browser:OpenAboutContainers" oncommand="openPreferences('paneContainers');"/>
 
     <command id="Tools:Search" oncommand="BrowserSearch.webSearch();"/>
     <command id="Tools:Downloads" oncommand="BrowserDownloadsUI();"/>
     <command id="Tools:Addons" oncommand="BrowserOpenAddonsMgr();"/>
     <command id="Tools:Sanitize"
      oncommand="Cc['@mozilla.org/browser/browserglue;1'].getService(Ci.nsIBrowserGlue).sanitize(window);"/>
     <command id="Tools:PrivateBrowsing"
-      oncommand="OpenBrowserWindow({private: true});" reserved="true"/>
+      oncommand="OpenBrowserWindow({private: true});"/>
 #ifdef E10S_TESTING_ONLY
     <command id="Tools:NonRemoteWindow"
       oncommand="OpenBrowserWindow({remote: false});"/>
 #endif
     <command id="History:UndoCloseTab" oncommand="undoCloseTab();"/>
     <command id="History:UndoCloseWindow" oncommand="undoCloseWindow();"/>
     <command id="Social:SharePage" oncommand="SocialShare.sharePage();"/>
     <command id="Social:Addons" oncommand="BrowserOpenAddonsMgr('addons://list/service');"/>
@@ -188,18 +188,19 @@
       <observes element="canViewSource" attribute="disabled"/>
     </broadcaster>
   </broadcasterset>
 
   <keyset id="mainKeyset">
     <key id="key_newNavigator"
          key="&newNavigatorCmd.key;"
          command="cmd_newNavigator"
-         modifiers="accel"/>
-    <key id="key_newNavigatorTab" key="&tabCmd.commandkey;" modifiers="accel" command="cmd_newNavigatorTabNoEvent"/>
+         modifiers="accel" reserved="true"/>
+    <key id="key_newNavigatorTab" key="&tabCmd.commandkey;" modifiers="accel"
+         command="cmd_newNavigatorTabNoEvent" reserved="true"/>
     <key id="focusURLBar" key="&openCmd.commandkey;" command="Browser:OpenLocation"
          modifiers="accel"/>
 #ifndef XP_MACOSX
     <key id="focusURLBar2" key="&urlbar.accesskey;" command="Browser:OpenLocation"
          modifiers="alt"/>
 #endif
 
 #
@@ -231,18 +232,18 @@
     <key id="key_openDownloads" key="&downloadsUnix.commandkey;" command="Tools:Downloads" modifiers="accel,shift"/>
 #else
     <key id="key_openDownloads" key="&downloads.commandkey;" command="Tools:Downloads" modifiers="accel"/>
 #endif
     <key id="key_openAddons" key="&addons.commandkey;" command="Tools:Addons" modifiers="accel,shift"/>
     <key id="openFileKb" key="&openFileCmd.commandkey;" command="Browser:OpenFile"  modifiers="accel"/>
     <key id="key_savePage" key="&savePageCmd.commandkey;" command="Browser:SavePage" modifiers="accel"/>
     <key id="printKb" key="&printCmd.commandkey;" command="cmd_print"  modifiers="accel"/>
-    <key id="key_close" key="&closeCmd.key;" command="cmd_close" modifiers="accel"/>
-    <key id="key_closeWindow" key="&closeCmd.key;" command="cmd_closeWindow" modifiers="accel,shift"/>
+    <key id="key_close" key="&closeCmd.key;" command="cmd_close" modifiers="accel" reserved="true"/>
+    <key id="key_closeWindow" key="&closeCmd.key;" command="cmd_closeWindow" modifiers="accel,shift" reserved="true"/>
     <key id="key_toggleMute" key="&toggleMuteCmd.key;" command="cmd_toggleMute" modifiers="control"/>
     <key id="key_undo"
          key="&undoCmd.key;"
          modifiers="accel"/>
 #ifdef XP_UNIX
     <key id="key_redo" key="&undoCmd.key;" modifiers="accel,shift"/>
 #else
     <key id="key_redo" key="&redoCmd.key;" modifiers="accel"/>
@@ -336,23 +337,24 @@
     <key                          key="&fullZoomEnlargeCmd.commandkey3;" command="cmd_fullZoomEnlarge" modifiers="accel"/>
     <key id="key_fullZoomReset"   key="&fullZoomResetCmd.commandkey;"    command="cmd_fullZoomReset"   modifiers="accel"/>
     <key                          key="&fullZoomResetCmd.commandkey2;"   command="cmd_fullZoomReset"   modifiers="accel"/>
 
     <key id="key_showAllTabs" command="Browser:ShowAllTabs" keycode="VK_TAB" modifiers="control,shift"/>
 
     <key id="key_switchTextDirection" key="&bidiSwitchTextDirectionItem.commandkey;" command="cmd_switchTextDirection" modifiers="accel,shift" />
 
-    <key id="key_privatebrowsing" command="Tools:PrivateBrowsing" key="&privateBrowsingCmd.commandkey;" modifiers="accel,shift"/>
+    <key id="key_privatebrowsing" command="Tools:PrivateBrowsing" key="&privateBrowsingCmd.commandkey;"
+         modifiers="accel,shift" reserved="true"/>
     <key id="key_sanitize" command="Tools:Sanitize" keycode="VK_DELETE" modifiers="accel,shift"/>
 #ifdef XP_MACOSX
     <key id="key_sanitize_mac" command="Tools:Sanitize" keycode="VK_BACK" modifiers="accel,shift"/>
     <key id="key_quitApplication" key="&quitApplicationCmdUnix.key;" modifiers="accel" reserved="true"/>
 #elifdef XP_UNIX
-    <key id="key_quitApplication" key="&quitApplicationCmdUnix.key;" command="cmd_quitApplication" modifiers="accel"/>
+    <key id="key_quitApplication" key="&quitApplicationCmdUnix.key;" command="cmd_quitApplication" modifiers="accel" reserved="true"/>
 #endif
 
 #ifdef FULL_BROWSER_WINDOW
     <key id="key_undoCloseTab" command="History:UndoCloseTab" key="&tabCmd.commandkey;" modifiers="accel,shift"/>
 #endif
     <key id="key_undoCloseWindow" command="History:UndoCloseWindow" key="&newNavigatorCmd.key;" modifiers="accel,shift"/>
 
 #ifdef XP_GNOME
--- a/browser/base/content/test/general/browser_selectpopup.js
+++ b/browser/base/content/test/general/browser_selectpopup.js
@@ -6,17 +6,18 @@
 // to implement the dropdown list.
 
 requestLongerTimeout(2);
 
 const XHTML_DTD = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">';
 
 const PAGECONTENT =
   "<html xmlns='http://www.w3.org/1999/xhtml'>" +
-  "<body onload='gChangeEvents = 0;gInputEvents = 0; document.body.firstChild.focus()'><select oninput='gInputEvents++' onchange='gChangeEvents++'>" +
+  "<body onload='gChangeEvents = 0;gInputEvents = 0; gClickEvents = 0; document.body.firstChild.focus()'>" +
+  "<select oninput='gInputEvents++' onchange='gChangeEvents++' onclick='if (event.target == this) gClickEvents++'>" +
   "  <optgroup label='First Group'>" +
   "    <option value='One'>One</option>" +
   "    <option value='Two'>Two</option>" +
   "  </optgroup>" +
   "  <option value='Three'>Three</option>" +
   "  <optgroup label='Second Group' disabled='true'>" +
   "    <option value='Four'>Four</option>" +
   "    <option value='Five'>Five</option>" +
@@ -74,22 +75,28 @@ const PAGECONTENT_SOMEHIDDEN =
 const PAGECONTENT_TRANSLATED =
   "<html><body>" +
   "<div id='div'>" +
   "<iframe id='frame' width='320' height='295' style='border: none;'" +
   "        src='data:text/html,<select id=select autofocus><option>he he he</option><option>boo boo</option><option>baz baz</option></select>'" +
   "</iframe>" +
   "</div></body></html>";
 
-function openSelectPopup(selectPopup, withMouse, selector = "select", win = window) {
+function openSelectPopup(selectPopup, mode = "key", selector = "select", win = window) {
   let popupShownPromise = BrowserTestUtils.waitForEvent(selectPopup, "popupshown");
 
-  if (withMouse) {
-    return Promise.all([popupShownPromise,
-                        BrowserTestUtils.synthesizeMouseAtCenter(selector, { }, win.gBrowser.selectedBrowser)]);
+  if (mode == "click" || mode == "mousedown") {
+    let mousePromise;
+    if (mode == "click") {
+      mousePromise = BrowserTestUtils.synthesizeMouseAtCenter(selector, { }, win.gBrowser.selectedBrowser);
+    } else {
+      mousePromise = BrowserTestUtils.synthesizeMouse(selector, 5, 5, { type: "mousedown" }, win.gBrowser.selectedBrowser);
+    }
+
+    return Promise.all([popupShownPromise, mousePromise]);
   }
 
   EventUtils.synthesizeKey("KEY_ArrowDown", { altKey: true, code: "ArrowDown" }, win);
   return popupShownPromise;
 }
 
 function hideSelectPopup(selectPopup, mode = "enter", win = window) {
   let browser = win.gBrowser.selectedBrowser;
@@ -116,16 +123,22 @@ function getInputEvents() {
 }
 
 function getChangeEvents() {
   return ContentTask.spawn(gBrowser.selectedBrowser, {}, function() {
     return content.wrappedJSObject.gChangeEvents;
   });
 }
 
+function getClickEvents() {
+  return ContentTask.spawn(gBrowser.selectedBrowser, {}, function() {
+    return content.wrappedJSObject.gClickEvents;
+  });
+}
+
 function* doSelectTests(contentType, dtd) {
   const pageUrl = "data:" + contentType + "," + escape(dtd + "\n" + PAGECONTENT);
   let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, pageUrl);
 
   let menulist = document.getElementById("ContentSelectDropdown");
   let selectPopup = menulist.menupopup;
 
   yield openSelectPopup(selectPopup);
@@ -158,16 +171,17 @@ function* doSelectTests(contentType, dtd
   }
 
   EventUtils.synthesizeKey("KEY_ArrowUp", { code: "ArrowUp" });
   is(menulist.menuBoxObject.activeChild, menulist.getItemAtIndex(3), "Select item 3 again");
   is(menulist.selectedIndex, isWindows ? 3 : 1, "Select item 3 selectedIndex");
 
   is((yield getInputEvents()), 0, "Before closed - number of input events");
   is((yield getChangeEvents()), 0, "Before closed - number of change events");
+  is((yield getClickEvents()), 0, "Before closed - number of click events");
 
   EventUtils.synthesizeKey("a", { accelKey: true });
   yield ContentTask.spawn(gBrowser.selectedBrowser, { isWindows }, function(args) {
     Assert.equal(String(content.getSelection()), args.isWindows ? "Text" : "",
       "Select all while popup is open");
   });
 
   // Backspace should not go back
@@ -178,36 +192,41 @@ function* doSelectTests(contentType, dtd
   EventUtils.synthesizeKey("VK_BACK_SPACE", { });
   window.removeEventListener("keypress", handleKeyPress);
 
   yield hideSelectPopup(selectPopup);
 
   is(menulist.selectedIndex, 3, "Item 3 still selected");
   is((yield getInputEvents()), 1, "After closed - number of input events");
   is((yield getChangeEvents()), 1, "After closed - number of change events");
+  is((yield getClickEvents()), 0, "After closed - number of click events");
 
   // Opening and closing the popup without changing the value should not fire a change event.
-  yield openSelectPopup(selectPopup, true);
+  yield openSelectPopup(selectPopup, "click");
   yield hideSelectPopup(selectPopup, "escape");
   is((yield getInputEvents()), 1, "Open and close with no change - number of input events");
   is((yield getChangeEvents()), 1, "Open and close with no change - number of change events");
+  is((yield getClickEvents()), 1, "Open and close with no change - number of click events");
   EventUtils.synthesizeKey("VK_TAB", { });
   EventUtils.synthesizeKey("VK_TAB", { shiftKey: true });
   is((yield getInputEvents()), 1, "Tab away from select with no change - number of input events");
   is((yield getChangeEvents()), 1, "Tab away from select with no change - number of change events");
+  is((yield getClickEvents()), 1, "Tab away from select with no change - number of click events");
 
-  yield openSelectPopup(selectPopup, true);
+  yield openSelectPopup(selectPopup, "click");
   EventUtils.synthesizeKey("KEY_ArrowDown", { code: "ArrowDown" });
   yield hideSelectPopup(selectPopup, "escape");
   is((yield getInputEvents()), isWindows ? 2 : 1, "Open and close with change - number of input events");
   is((yield getChangeEvents()), isWindows ? 2 : 1, "Open and close with change - number of change events");
+  is((yield getClickEvents()), 2, "Open and close with change - number of click events");
   EventUtils.synthesizeKey("VK_TAB", { });
   EventUtils.synthesizeKey("VK_TAB", { shiftKey: true });
   is((yield getInputEvents()), isWindows ? 2 : 1, "Tab away from select with change - number of input events");
   is((yield getChangeEvents()), isWindows ? 2 : 1, "Tab away from select with change - number of change events");
+  is((yield getClickEvents()), 2, "Tab away from select with change - number of click events");
 
   is(selectPopup.lastChild.previousSibling.label, "Seven", "Spaces collapsed");
   is(selectPopup.lastChild.label, "\xA0\xA0Eight\xA0\xA0", "Non-breaking spaces not collapsed");
 
   yield BrowserTestUtils.removeTab(tab);
 }
 
 add_task(function* setup() {
@@ -231,42 +250,42 @@ add_task(function*() {
 add_task(function*() {
   const pageUrl = "data:text/html," + escape(PAGECONTENT_SMALL);
   let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, pageUrl);
 
   let menulist = document.getElementById("ContentSelectDropdown");
   let selectPopup = menulist.menupopup;
 
   // First, try it when a different <select> element than the one that is open is removed
-  yield openSelectPopup(selectPopup, true, "#one");
+  yield openSelectPopup(selectPopup, "click", "#one");
 
   yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function() {
     content.document.body.removeChild(content.document.getElementById("two"));
   });
 
   // Wait a bit just to make sure the popup won't close.
   yield new Promise(resolve => setTimeout(resolve, 1000));
 
   is(selectPopup.state, "open", "Different popup did not affect open popup");
 
   yield hideSelectPopup(selectPopup);
 
   // Next, try it when the same <select> element than the one that is open is removed
-  yield openSelectPopup(selectPopup, true, "#three");
+  yield openSelectPopup(selectPopup, "click", "#three");
 
   let popupHiddenPromise = BrowserTestUtils.waitForEvent(selectPopup, "popuphidden");
   yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function() {
     content.document.body.removeChild(content.document.getElementById("three"));
   });
   yield popupHiddenPromise;
 
   ok(true, "Popup hidden when select is removed");
 
   // Finally, try it when the tab is closed while the select popup is open.
-  yield openSelectPopup(selectPopup, true, "#one");
+  yield openSelectPopup(selectPopup, "click", "#one");
 
   popupHiddenPromise = BrowserTestUtils.waitForEvent(selectPopup, "popuphidden");
   yield BrowserTestUtils.removeTab(tab);
   yield popupHiddenPromise;
 
   ok(true, "Popup hidden when tab is closed");
 });
 
@@ -274,17 +293,17 @@ add_task(function*() {
 add_task(function*() {
   const pageUrl = "data:text/html," + escape(PAGECONTENT_TRANSLATED);
   let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, pageUrl);
 
   let menulist = document.getElementById("ContentSelectDropdown");
   let selectPopup = menulist.menupopup;
 
   // First, get the position of the select popup when no translations have been applied.
-  yield openSelectPopup(selectPopup, false);
+  yield openSelectPopup(selectPopup);
 
   let rect = selectPopup.getBoundingClientRect();
   let expectedX = rect.left;
   let expectedY = rect.top;
 
   yield hideSelectPopup(selectPopup);
 
   // Iterate through a set of steps which each add more translation to the select's expected position.
@@ -315,17 +334,17 @@ add_task(function*() {
           resolve();
         });
 
         elem.style = contentStep[1];
         elem.getBoundingClientRect();
       });
     });
 
-    yield openSelectPopup(selectPopup, false);
+    yield openSelectPopup(selectPopup);
 
     expectedX += step[2];
     expectedY += step[3];
 
     let popupRect = selectPopup.getBoundingClientRect();
     is(popupRect.left, expectedX, "step " + (stepIndex + 1) + " x");
     is(popupRect.top, expectedY, "step " + (stepIndex + 1) + " y");
 
@@ -386,17 +405,17 @@ add_task(function* test_event_order() {
         type: "click",
         cancelable: true,
         targetIsOption: true,
       },
     ];
 
     for (let mode of ["enter", "click"]) {
       let expected = mode == "enter" ? expectedEnter : expectedClick;
-      yield openSelectPopup(selectPopup, true, mode == "enter" ? "#one" : "#two");
+      yield openSelectPopup(selectPopup, "click", mode == "enter" ? "#one" : "#two");
 
       let eventsPromise = ContentTask.spawn(browser, [mode, expected], function*([contentMode, contentExpected]) {
         return new Promise((resolve) => {
           function onEvent(event) {
             select.removeEventListener(event.type, onEvent);
             Assert.ok(contentExpected.length, "Unexpected event " + event.type);
             let expectation = contentExpected.shift();
             Assert.equal(event.type, expectation.type,
@@ -438,25 +457,77 @@ function* performLargePopupTests(win) {
 
     select.options[60].selected = true;
     select.focus();
   });
 
   let selectPopup = win.document.getElementById("ContentSelectDropdown").menupopup;
   let browserRect = browser.getBoundingClientRect();
 
+  // Check if a drag-select works and scrolls the list.
+  yield openSelectPopup(selectPopup, "mousedown", "select", win);
+
+  let scrollPos = selectPopup.scrollBox.scrollTop;
+  let popupRect = selectPopup.getBoundingClientRect();
+
+  // First, check that scrolling does not occur when the mouse is moved over the
+  // anchor button but not the popup yet.
+  EventUtils.synthesizeMouseAtPoint(popupRect.left + 5, popupRect.top - 10, { type: "mousemove" }, win);
+  is(selectPopup.scrollBox.scrollTop, scrollPos, "scroll position after mousemove over button should not change");
+
+  EventUtils.synthesizeMouseAtPoint(popupRect.left + 20, popupRect.top + 10, { type: "mousemove" }, win);
+
+  // Dragging above the popup scrolls it up.
+  EventUtils.synthesizeMouseAtPoint(popupRect.left + 20, popupRect.top - 20, { type: "mousemove" }, win);
+  ok(selectPopup.scrollBox.scrollTop < scrollPos - 5, "scroll position at drag up");
+
+  // Dragging below the popup scrolls it down.
+  scrollPos = selectPopup.scrollBox.scrollTop;
+  EventUtils.synthesizeMouseAtPoint(popupRect.left + 20, popupRect.bottom + 20, { type: "mousemove" }, win);
+  ok(selectPopup.scrollBox.scrollTop > scrollPos + 5, "scroll position at drag down");
+
+  // Releasing the mouse button and moving the mouse does not change the scroll position.
+  scrollPos = selectPopup.scrollBox.scrollTop;
+  EventUtils.synthesizeMouseAtPoint(popupRect.left + 20, popupRect.bottom + 25, { type: "mouseup" }, win);
+  is(selectPopup.scrollBox.scrollTop, scrollPos, "scroll position at mouseup should not change");
+
+  EventUtils.synthesizeMouseAtPoint(popupRect.left + 20, popupRect.bottom + 20, { type: "mousemove" }, win);
+  is(selectPopup.scrollBox.scrollTop, scrollPos, "scroll position at mousemove after mouseup should not change");
+
+  // Now check dragging with a mousedown on an item
+  let menuRect = selectPopup.childNodes[51].getBoundingClientRect();
+  EventUtils.synthesizeMouseAtPoint(menuRect.left + 5, menuRect.top + 5, { type: "mousedown" }, win);
+
+  // Dragging below the popup scrolls it down.
+  EventUtils.synthesizeMouseAtPoint(popupRect.left + 20, popupRect.bottom + 20, { type: "mousemove" }, win);
+  ok(selectPopup.scrollBox.scrollTop > scrollPos + 5, "scroll position at drag down from option");
+
+  // Dragging above the popup scrolls it up.
+  EventUtils.synthesizeMouseAtPoint(popupRect.left + 20, popupRect.top - 20, { type: "mousemove" }, win);
+  ok(selectPopup.scrollBox.scrollTop, scrollPos, "scroll position at drag up from option");
+
+  scrollPos = selectPopup.scrollBox.scrollTop;
+  EventUtils.synthesizeMouseAtPoint(popupRect.left + 20, popupRect.bottom + 25, { type: "mouseup" }, win);
+  is(selectPopup.scrollBox.scrollTop, scrollPos, "scroll position at mouseup from option should not change");
+
+  EventUtils.synthesizeMouseAtPoint(popupRect.left + 20, popupRect.bottom + 20, { type: "mousemove" }, win);
+  is(selectPopup.scrollBox.scrollTop, scrollPos, "scroll position at mousemove after mouseup should not change");
+
+
+  yield hideSelectPopup(selectPopup, "escape", win);
+
   let positions = [
     "margin-top: 300px;",
     "position: fixed; bottom: 100px;",
     "width: 100%; height: 9999px;"
   ];
 
   let position;
-  while (true) {
-    yield openSelectPopup(selectPopup, false, "select", win);
+  while (positions.length) {
+    yield openSelectPopup(selectPopup, "key", "select", win);
 
     let rect = selectPopup.getBoundingClientRect();
     ok(rect.top >= browserRect.top, "Popup top position in within browser area");
     ok(rect.bottom <= browserRect.bottom, "Popup bottom position in within browser area");
 
     // Don't check the scroll position for the last step as the popup will be cut off.
     if (positions.length > 0) {
       let cs = win.getComputedStyle(selectPopup);
@@ -476,24 +547,21 @@ function* performLargePopupTests(win) {
       SimpleTest.isfuzzy(selectPopup.childNodes[selectedOption].getBoundingClientRect().bottom,
                          selectPopup.getBoundingClientRect().bottom - bpBottom,
                          1, "Popup scroll at correct position " + bpBottom);
     }
 
     yield hideSelectPopup(selectPopup, "enter", win);
 
     position = positions.shift();
-    if (!position) {
-      break;
-    }
 
     let contentPainted = BrowserTestUtils.contentPainted(browser);
     yield ContentTask.spawn(browser, position, function*(contentPosition) {
       let select = content.document.getElementById("one");
-      select.setAttribute("style", contentPosition);
+      select.setAttribute("style", contentPosition || "");
       select.getBoundingClientRect();
     });
     yield contentPainted;
   }
 }
 
 function* performSelectSearchTests(win) {
   let browser = win.gBrowser.selectedBrowser;
@@ -617,17 +685,17 @@ add_task(function* test_mousemove_correc
   });
 
   yield BrowserTestUtils.synthesizeMouseAtCenter("#one", { type: "mouseup" }, gBrowser.selectedBrowser);
 
   yield hideSelectPopup(selectPopup);
 
   // The popup should be closed when fullscreen mode is entered or exited.
   for (let steps = 0; steps < 2; steps++) {
-    yield openSelectPopup(selectPopup, true);
+    yield openSelectPopup(selectPopup, "click");
     let popupHiddenPromise = BrowserTestUtils.waitForEvent(selectPopup, "popuphidden");
     let sizeModeChanged = BrowserTestUtils.waitForEvent(window, "sizemodechange");
     BrowserFullScreen();
     yield sizeModeChanged;
     yield popupHiddenPromise;
   }
 
   yield BrowserTestUtils.removeTab(tab);
--- a/browser/components/preferences/in-content/subdialogs.js
+++ b/browser/components/preferences/in-content/subdialogs.js
@@ -6,16 +6,17 @@
 
 var gSubDialog = {
   _closingCallback: null,
   _closingEvent: null,
   _isClosing: false,
   _frame: null,
   _overlay: null,
   _box: null,
+  _openedURL: null,
   _injectedStyleSheets: [
     "chrome://browser/skin/preferences/preferences.css",
     "chrome://global/skin/in-content/common.css",
     "chrome://browser/skin/preferences/in-content/preferences.css",
     "chrome://browser/skin/preferences/in-content/dialog.css",
   ],
   _resizeObserver: null,
 
--- a/browser/extensions/pdfjs/test/browser_pdfjs_main.js
+++ b/browser/extensions/pdfjs/test/browser_pdfjs_main.js
@@ -1,66 +1,52 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 const RELATIVE_DIR = "browser/extensions/pdfjs/test/";
 const TESTROOT = "http://example.com/browser/" + RELATIVE_DIR;
 
 add_task(function* test() {
-  let handlerService = Cc["@mozilla.org/uriloader/handler-service;1"].getService(Ci.nsIHandlerService);
   let mimeService = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService);
-  let handlerInfo = mimeService.getFromTypeAndExtension('application/pdf', 'pdf');
+  let handlerInfo = mimeService.getFromTypeAndExtension("application/pdf", "pdf");
 
   // Make sure pdf.js is the default handler.
-  is(handlerInfo.alwaysAskBeforeHandling, false, 'pdf handler defaults to always-ask is false');
-  is(handlerInfo.preferredAction, Ci.nsIHandlerInfo.handleInternally, 'pdf handler defaults to internal');
+  is(handlerInfo.alwaysAskBeforeHandling, false, "pdf handler defaults to always-ask is false");
+  is(handlerInfo.preferredAction, Ci.nsIHandlerInfo.handleInternally, "pdf handler defaults to internal");
 
-  info('Pref action: ' + handlerInfo.preferredAction);
+  info("Pref action: " + handlerInfo.preferredAction);
 
-  yield BrowserTestUtils.withNewTab({ gBrowser: gBrowser, url: "about:blank" },
+  yield BrowserTestUtils.withNewTab({ gBrowser, url: "about:blank" },
     function* (newTabBrowser) {
       yield waitForPdfJS(newTabBrowser, TESTROOT + "file_pdfjs_test.pdf");
 
       ok(gBrowser.isFindBarInitialized(), "Browser FindBar initialized!");
 
       yield ContentTask.spawn(newTabBrowser, null, function* () {
-        //
         // Overall sanity tests
-        //
-        Assert.ok(content.document.querySelector('div#viewer'), "document content has viewer UI");
-        Assert.ok('PDFJS' in content.wrappedJSObject, "window content has PDFJS object");
+        Assert.ok(content.document.querySelector("div#viewer"), "document content has viewer UI");
+        Assert.ok("PDFJS" in content.wrappedJSObject, "window content has PDFJS object");
 
-        //
         // Sidebar: open
-        //
-        var sidebar = content.document.querySelector('button#sidebarToggle'),
-            outerContainer = content.document.querySelector('div#outerContainer');
+        var sidebar = content.document.querySelector("button#sidebarToggle"),
+            outerContainer = content.document.querySelector("div#outerContainer");
 
         sidebar.click();
-        Assert.ok(outerContainer.classList.contains('sidebarOpen'), "sidebar opens on click");
-
-        //
-        // Sidebar: close
-        //
-        sidebar.click();
-        Assert.ok(!outerContainer.classList.contains('sidebarOpen'), "sidebar closes on click");
+        Assert.ok(outerContainer.classList.contains("sidebarOpen"), "sidebar opens on click");
 
-        //
-        // Page change from prev/next buttons
-        //
-        var prevPage = content.document.querySelector('button#previous'),
-            nextPage = content.document.querySelector('button#next');
+        // Sidebar: close
+        sidebar.click();
+        Assert.ok(!outerContainer.classList.contains("sidebarOpen"), "sidebar closes on click");
 
-        var pgNumber = content.document.querySelector('input#pageNumber').value;
+        // Verify that initial page is 1
+        var pgNumber = content.document.querySelector("input#pageNumber").value;
         Assert.equal(parseInt(pgNumber, 10), 1, "initial page is 1");
 
-        //
         // Bookmark button
-        //
-        var viewBookmark = content.document.querySelector('a#viewBookmark');
+        var viewBookmark = content.document.querySelector("a#viewBookmark");
         viewBookmark.click();
 
         Assert.ok(viewBookmark.href.length > 0, "viewBookmark button has href");
 
         var viewer = content.wrappedJSObject.PDFViewerApplication;
         yield viewer.close();
       });
     });
--- a/browser/extensions/pdfjs/test/browser_pdfjs_navigation.js
+++ b/browser/extensions/pdfjs/test/browser_pdfjs_navigation.js
@@ -138,40 +138,40 @@ const TESTS = [
     },
     expectedPage: 5,
     message: "navigated to 5th page using pagenumber"
   }
 ];
 
 add_task(function* test() {
   let mimeService = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService);
-  let handlerInfo = mimeService.getFromTypeAndExtension('application/pdf', 'pdf');
+  let handlerInfo = mimeService.getFromTypeAndExtension("application/pdf", "pdf");
 
   // Make sure pdf.js is the default handler.
-  is(handlerInfo.alwaysAskBeforeHandling, false, 'pdf handler defaults to always-ask is false');
-  is(handlerInfo.preferredAction, Ci.nsIHandlerInfo.handleInternally, 'pdf handler defaults to internal');
+  is(handlerInfo.alwaysAskBeforeHandling, false, "pdf handler defaults to always-ask is false");
+  is(handlerInfo.preferredAction, Ci.nsIHandlerInfo.handleInternally, "pdf handler defaults to internal");
 
-  info('Pref action: ' + handlerInfo.preferredAction);
+  info("Pref action: " + handlerInfo.preferredAction);
 
   yield BrowserTestUtils.withNewTab({ gBrowser, url: "about:blank" },
     function* (newTabBrowser) {
       yield waitForPdfJS(newTabBrowser, TESTROOT + "file_pdfjs_test.pdf");
 
       yield ContentTask.spawn(newTabBrowser, null, function* () {
         // Check if PDF is opened with internal viewer
         Assert.ok(content.document.querySelector("div#viewer"), "document content has viewer UI");
         Assert.ok("PDFJS" in content.wrappedJSObject, "window content has PDFJS object");
       });
 
       yield ContentTask.spawn(newTabBrowser, null, contentSetUp);
 
       yield Task.spawn(runTests(newTabBrowser));
 
       yield ContentTask.spawn(newTabBrowser, null, function*() {
-        let pageNumber = content.document.querySelector('input#pageNumber');
+        let pageNumber = content.document.querySelector("input#pageNumber");
         Assert.equal(pageNumber.value, pageNumber.max, "Document is left on the last page");
       });
     });
 });
 
 function* contentSetUp() {
   /**
    * Outline Items gets appended to the document later on we have to
@@ -225,56 +225,56 @@ function* contentSetUp() {
  * we trigger the action so we will be at the expected page number after each action
  *
  * @param document
  * @param window
  * @param test
  * @param callback
  */
 function* runTests(browser) {
-  yield ContentTask.spawn(browser, TESTS, function* (TESTS) {
+  yield ContentTask.spawn(browser, TESTS, function* (contentTESTS) {
     let window = content;
     let document = window.document;
 
-    for (let test of TESTS) {
+    for (let test of contentTESTS) {
       let deferred = {};
       deferred.promise = new Promise((resolve, reject) => {
         deferred.resolve = resolve;
         deferred.reject = reject;
       });
 
-      let pageNumber = document.querySelector('input#pageNumber');
+      let pageNumber = document.querySelector("input#pageNumber");
 
       // Add an event-listener to wait for page to change, afterwards resolve the promise
       let timeout = window.setTimeout(() => deferred.reject(), 5000);
-      window.addEventListener('pagechange', function pageChange() {
+      window.addEventListener("pagechange", function pageChange() {
         if (pageNumber.value == test.expectedPage) {
-          window.removeEventListener('pagechange', pageChange);
+          window.removeEventListener("pagechange", pageChange);
           window.clearTimeout(timeout);
           deferred.resolve(+pageNumber.value);
         }
       });
 
       // Get the element and trigger the action for changing the page
       var el = document.querySelector(test.action.selector);
       Assert.ok(el, "Element '" + test.action.selector + "' has been found");
 
       // The value option is for input case
       if (test.action.value)
         el.value = test.action.value;
 
       // Dispatch the event for changing the page
+      var ev;
       if (test.action.event == "keydown") {
-        var ev = document.createEvent("KeyboardEvent");
-            ev.initKeyEvent("keydown", true, true, null, false, false, false, false,
-                            test.action.keyCode, 0);
+        ev = document.createEvent("KeyboardEvent");
+        ev.initKeyEvent("keydown", true, true, null, false, false, false, false,
+                        test.action.keyCode, 0);
         el.dispatchEvent(ev);
-      }
-      else {
-        var ev = new Event(test.action.event);
+      } else {
+        ev = new Event(test.action.event);
       }
       el.dispatchEvent(ev);
 
       let pgNumber = yield deferred.promise;
       Assert.equal(pgNumber, test.expectedPage, test.message);
     }
 
     var viewer = content.wrappedJSObject.PDFViewerApplication;
--- a/browser/extensions/pdfjs/test/browser_pdfjs_savedialog.js
+++ b/browser/extensions/pdfjs/test/browser_pdfjs_savedialog.js
@@ -2,64 +2,60 @@
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 const RELATIVE_DIR = "browser/extensions/pdfjs/test/";
 const TESTROOT = "http://example.com/browser/" + RELATIVE_DIR;
 
 function test() {
   var oldAction = changeMimeHandler(Ci.nsIHandlerInfo.useSystemDefault, true);
   var tab = gBrowser.addTab(TESTROOT + "file_pdfjs_test.pdf");
-  //
   // Test: "Open with" dialog comes up when pdf.js is not selected as the default
   // handler.
-  //
-  addWindowListener('chrome://mozapps/content/downloads/unknownContentType.xul', finish);
+  addWindowListener("chrome://mozapps/content/downloads/unknownContentType.xul", finish);
 
   waitForExplicitFinish();
   registerCleanupFunction(function() {
     changeMimeHandler(oldAction[0], oldAction[1]);
     gBrowser.removeTab(tab);
   });
 }
 
 function changeMimeHandler(preferredAction, alwaysAskBeforeHandling) {
   let handlerService = Cc["@mozilla.org/uriloader/handler-service;1"].getService(Ci.nsIHandlerService);
   let mimeService = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService);
-  let handlerInfo = mimeService.getFromTypeAndExtension('application/pdf', 'pdf');
+  let handlerInfo = mimeService.getFromTypeAndExtension("application/pdf", "pdf");
   var oldAction = [handlerInfo.preferredAction, handlerInfo.alwaysAskBeforeHandling];
 
   // Change and save mime handler settings
   handlerInfo.alwaysAskBeforeHandling = alwaysAskBeforeHandling;
   handlerInfo.preferredAction = preferredAction;
   handlerService.store(handlerInfo);
 
-  Services.obs.notifyObservers(null, 'pdfjs:handlerChanged', null);
+  Services.obs.notifyObservers(null, "pdfjs:handlerChanged", null);
 
   // Refresh data
-  handlerInfo = mimeService.getFromTypeAndExtension('application/pdf', 'pdf');
+  handlerInfo = mimeService.getFromTypeAndExtension("application/pdf", "pdf");
 
-  //
   // Test: Mime handler was updated
-  //
-  is(handlerInfo.alwaysAskBeforeHandling, alwaysAskBeforeHandling, 'always-ask prompt change successful');
-  is(handlerInfo.preferredAction, preferredAction, 'mime handler change successful');
+  is(handlerInfo.alwaysAskBeforeHandling, alwaysAskBeforeHandling, "always-ask prompt change successful");
+  is(handlerInfo.preferredAction, preferredAction, "mime handler change successful");
 
   return oldAction;
 }
 
 function addWindowListener(aURL, aCallback) {
   Services.wm.addListener({
-    onOpenWindow: function(aXULWindow) {
+    onOpenWindow(aXULWindow) {
       info("window opened, waiting for focus");
       Services.wm.removeListener(this);
 
       var domwindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor)
                                 .getInterface(Ci.nsIDOMWindow);
       waitForFocus(function() {
         is(domwindow.document.location.href, aURL, "should have seen the right window open");
         domwindow.close();
         aCallback();
       }, domwindow);
     },
-    onCloseWindow: function(aXULWindow) { },
-    onWindowTitleChange: function(aXULWindow, aNewTitle) { }
+    onCloseWindow(aXULWindow) { },
+    onWindowTitleChange(aXULWindow, aNewTitle) { }
   });
 }
--- a/browser/extensions/pdfjs/test/browser_pdfjs_views.js
+++ b/browser/extensions/pdfjs/test/browser_pdfjs_views.js
@@ -1,61 +1,60 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 const RELATIVE_DIR = "browser/extensions/pdfjs/test/";
 const TESTROOT = "http://example.com/browser/" + RELATIVE_DIR;
 
 add_task(function* test() {
-  let handlerService = Cc["@mozilla.org/uriloader/handler-service;1"].getService(Ci.nsIHandlerService);
   let mimeService = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService);
-  let handlerInfo = mimeService.getFromTypeAndExtension('application/pdf', 'pdf');
+  let handlerInfo = mimeService.getFromTypeAndExtension("application/pdf", "pdf");
 
   // Make sure pdf.js is the default handler.
-  is(handlerInfo.alwaysAskBeforeHandling, false, 'pdf handler defaults to always-ask is false');
-  is(handlerInfo.preferredAction, Ci.nsIHandlerInfo.handleInternally, 'pdf handler defaults to internal');
+  is(handlerInfo.alwaysAskBeforeHandling, false, "pdf handler defaults to always-ask is false");
+  is(handlerInfo.preferredAction, Ci.nsIHandlerInfo.handleInternally, "pdf handler defaults to internal");
 
-  info('Pref action: ' + handlerInfo.preferredAction);
+  info("Pref action: " + handlerInfo.preferredAction);
 
   yield BrowserTestUtils.withNewTab({ gBrowser, url: "about:blank" },
     function* (browser) {
       // check that PDF is opened with internal viewer
       yield waitForPdfJS(browser, TESTROOT + "file_pdfjs_test.pdf");
 
       yield ContentTask.spawn(browser, null, function* () {
         Assert.ok(content.document.querySelector("div#viewer"), "document content has viewer UI");
         Assert.ok("PDFJS" in content.wrappedJSObject, "window content has PDFJS object");
 
-        //open sidebar
-        var sidebar = content.document.querySelector('button#sidebarToggle');
-        var outerContainer = content.document.querySelector('div#outerContainer');
+        // open sidebar
+        var sidebar = content.document.querySelector("button#sidebarToggle");
+        var outerContainer = content.document.querySelector("div#outerContainer");
 
         sidebar.click();
         Assert.ok(outerContainer.classList.contains("sidebarOpen"), "sidebar opens on click");
 
         // check that thumbnail view is open
-        var thumbnailView = content.document.querySelector('div#thumbnailView');
-        var outlineView = content.document.querySelector('div#outlineView');
+        var thumbnailView = content.document.querySelector("div#thumbnailView");
+        var outlineView = content.document.querySelector("div#outlineView");
 
         Assert.equal(thumbnailView.getAttribute("class"), null,
           "Initial view is thumbnail view");
         Assert.equal(outlineView.getAttribute("class"), "hidden",
           "Outline view is hidden initially");
 
-        //switch to outline view
-        var viewOutlineButton = content.document.querySelector('button#viewOutline');
+        // switch to outline view
+        var viewOutlineButton = content.document.querySelector("button#viewOutline");
         viewOutlineButton.click();
 
         Assert.equal(thumbnailView.getAttribute("class"), "hidden",
           "Thumbnail view is hidden when outline is selected");
         Assert.equal(outlineView.getAttribute("class"), "",
           "Outline view is visible when selected");
 
-        //switch back to thumbnail view
-        var viewThumbnailButton = content.document.querySelector('button#viewThumbnail');
+        // switch back to thumbnail view
+        var viewThumbnailButton = content.document.querySelector("button#viewThumbnail");
         viewThumbnailButton.click();
 
         Assert.equal(thumbnailView.getAttribute("class"), "",
           "Thumbnail view is visible when selected");
         Assert.equal(outlineView.getAttribute("class"), "hidden",
           "Outline view is hidden when thumbnail is selected");
 
         sidebar.click();
--- a/browser/extensions/pdfjs/test/browser_pdfjs_zoom.js
+++ b/browser/extensions/pdfjs/test/browser_pdfjs_zoom.js
@@ -54,100 +54,97 @@ const TESTS = [
       event: "change"
     },
     expectedZoom: -1, // -1 - zoom out
     message: "Zoomed using the zoom picker"
   }
 ];
 
 add_task(function* test() {
-  let handlerService = Cc["@mozilla.org/uriloader/handler-service;1"]
-                       .getService(Ci.nsIHandlerService);
   let mimeService = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService);
-  let handlerInfo = mimeService.getFromTypeAndExtension('application/pdf', 'pdf');
+  let handlerInfo = mimeService.getFromTypeAndExtension("application/pdf", "pdf");
 
   // Make sure pdf.js is the default handler.
   is(handlerInfo.alwaysAskBeforeHandling, false,
-     'pdf handler defaults to always-ask is false');
+     "pdf handler defaults to always-ask is false");
   is(handlerInfo.preferredAction, Ci.nsIHandlerInfo.handleInternally,
-    'pdf handler defaults to internal');
+    "pdf handler defaults to internal");
 
-  info('Pref action: ' + handlerInfo.preferredAction);
+  info("Pref action: " + handlerInfo.preferredAction);
 
   yield BrowserTestUtils.withNewTab({ gBrowser, url: "about:blank" },
     function* (newTabBrowser) {
       yield waitForPdfJS(newTabBrowser, TESTROOT + "file_pdfjs_test.pdf" + "#zoom=100");
 
-      yield ContentTask.spawn(newTabBrowser, TESTS, function* (TESTS) {
+      yield ContentTask.spawn(newTabBrowser, TESTS, function* (contentTESTS) {
         let document = content.document;
 
         function waitForRender() {
           return new Promise((resolve) => {
             document.addEventListener("pagerendered", function onPageRendered(e) {
-              if(e.detail.pageNumber !== 1) {
+              if (e.detail.pageNumber !== 1) {
                 return;
               }
 
               document.removeEventListener("pagerendered", onPageRendered, true);
               resolve();
             }, true);
           });
         }
 
         // check that PDF is opened with internal viewer
         Assert.ok(content.document.querySelector("div#viewer"), "document content has viewer UI");
         Assert.ok("PDFJS" in content.wrappedJSObject, "window content has PDFJS object");
 
         let initialWidth, previousWidth;
         initialWidth = previousWidth =
-          parseInt(content.document.querySelector('div.page[data-page-number="1"]').style.width);
+          parseInt(content.document.querySelector("div.page[data-page-number='1']").style.width);
 
-        for (let test of TESTS) {
+        for (let subTest of contentTESTS) {
           // We zoom using an UI element
           var ev;
-          if (test.action.selector) {
+          if (subTest.action.selector) {
             // Get the element and trigger the action for changing the zoom
-            var el = document.querySelector(test.action.selector);
-            Assert.ok(el, "Element '" + test.action.selector + "' has been found");
+            var el = document.querySelector(subTest.action.selector);
+            Assert.ok(el, "Element '" + subTest.action.selector + "' has been found");
 
-            if (test.action.index){
-              el.selectedIndex = test.action.index;
+            if (subTest.action.index) {
+              el.selectedIndex = subTest.action.index;
             }
 
             // Dispatch the event for changing the zoom
-            ev = new Event(test.action.event);
-          }
-          // We zoom using keyboard
-          else {
+            ev = new Event(subTest.action.event);
+          } else {
+            // We zoom using keyboard
             // Simulate key press
             ev = new content.KeyboardEvent("keydown",
-                                           { key: test.action.event,
-                                             keyCode: test.action.keyCode,
+                                           { key: subTest.action.event,
+                                             keyCode: subTest.action.keyCode,
                                              ctrlKey: true });
             el = content;
           }
 
           el.dispatchEvent(ev);
           yield waitForRender();
 
-          var pageZoomScale = content.document.querySelector('select#scaleSelect');
+          var pageZoomScale = content.document.querySelector("select#scaleSelect");
 
           // The zoom value displayed in the zoom select
           var zoomValue = pageZoomScale.options[pageZoomScale.selectedIndex].innerHTML;
 
-          let pageContainer = content.document.querySelector('div.page[data-page-number="1"]');
+          let pageContainer = content.document.querySelector("div.page[data-page-number='1']");
           let actualWidth = parseInt(pageContainer.style.width);
 
           // the actual zoom of the PDF document
-          let computedZoomValue = parseInt(((actualWidth/initialWidth).toFixed(2))*100) + "%";
+          let computedZoomValue = parseInt(((actualWidth / initialWidth).toFixed(2)) * 100) + "%";
           Assert.equal(computedZoomValue, zoomValue, "Content has correct zoom");
 
           // Check that document zooms in the expected way (in/out)
-          let zoom = (actualWidth - previousWidth) * test.expectedZoom;
-          Assert.ok(zoom > 0, test.message);
+          let zoom = (actualWidth - previousWidth) * subTest.expectedZoom;
+          Assert.ok(zoom > 0, subTest.message);
 
           previousWidth = actualWidth;
         }
 
         var viewer = content.wrappedJSObject.PDFViewerApplication;
         yield viewer.close();
       });
     });
--- a/browser/extensions/pdfjs/test/head.js
+++ b/browser/extensions/pdfjs/test/head.js
@@ -1,15 +1,15 @@
 function waitForPdfJS(browser, url) {
-  // Runs tests after all 'load' event handlers have fired off
-  return ContentTask.spawn(browser, url, function* (url) {
+  // Runs tests after all "load" event handlers have fired off
+  return ContentTask.spawn(browser, url, function* (contentUrl) {
     yield new Promise((resolve) => {
       // NB: Add the listener to the global object so that we receive the
       // event fired from the new window.
       addEventListener("documentload", function listener() {
         removeEventListener("documentload", listener, false);
         resolve();
       }, false, true);
 
-      content.location = url;
+      content.location = contentUrl;
     });
   });
 }
--- a/devtools/client/framework/toolbox.js
+++ b/devtools/client/framework/toolbox.js
@@ -983,17 +983,24 @@ Toolbox.prototype = {
    * On left/right arrow press, attempt to move the focus inside the toolbar to
    * the previous/next focusable element. This is not in the React component
    * as it is difficult to coordinate between different component elements.
    * The components are responsible for setting the correct tabindex value
    * for if they are the focused element.
    * @param  {KeyboardEvent} event
    */
   _onToolbarArrowKeypress: function (event) {
-    let { key, target } = event;
+    let { key, target, ctrlKey, shiftKey, altKey, metaKey } = event;
+
+    // If any of the modifier keys are pressed do not attempt navigation as it
+    // might conflict with global shortcuts (Bug 1327972).
+    if (ctrlKey || shiftKey || altKey || metaKey) {
+      return;
+    }
+
     let buttons = [...this._componentMount.querySelectorAll("button")];
     let curIndex = buttons.indexOf(target);
 
     if (curIndex === -1) {
       console.warn(target + " is not found among Developer Tools tab bar " +
         "focusable elements.");
       return;
     }
--- a/devtools/client/jar.mn
+++ b/devtools/client/jar.mn
@@ -113,16 +113,17 @@ devtools.jar:
     content/inspector/inspector.xhtml (inspector/inspector.xhtml)
     content/framework/connect/connect.xhtml (framework/connect/connect.xhtml)
     content/framework/connect/connect.css (framework/connect/connect.css)
     content/framework/connect/connect.js (framework/connect/connect.js)
     content/shared/widgets/graphs-frame.xhtml (shared/widgets/graphs-frame.xhtml)
     content/shared/widgets/cubic-bezier.css (shared/widgets/cubic-bezier.css)
     content/shared/widgets/mdn-docs.css (shared/widgets/mdn-docs.css)
     content/shared/widgets/filter-widget.css (shared/widgets/filter-widget.css)
+    content/shared/widgets/color-widget.css (shared/widgets/color-widget.css)
     content/shared/widgets/spectrum.css (shared/widgets/spectrum.css)
     content/aboutdebugging/aboutdebugging.xhtml (aboutdebugging/aboutdebugging.xhtml)
     content/aboutdebugging/aboutdebugging.css (aboutdebugging/aboutdebugging.css)
     content/aboutdebugging/initializer.js (aboutdebugging/initializer.js)
     content/responsive.html/index.xhtml (responsive.html/index.xhtml)
     content/responsive.html/index.js (responsive.html/index.js)
     content/dom/dom.html (dom/dom.html)
     content/dom/main.js (dom/main.js)
--- a/devtools/client/preferences/devtools.js
+++ b/devtools/client/preferences/devtools.js
@@ -59,16 +59,18 @@ pref("devtools.inspector.show_pseudo_ele
 // The default size for image preview tooltips in the rule-view/computed-view/markup-view
 pref("devtools.inspector.imagePreviewTooltipSize", 300);
 // Enable user agent style inspection in rule-view
 pref("devtools.inspector.showUserAgentStyles", false);
 // Show all native anonymous content (like controls in <video> tags)
 pref("devtools.inspector.showAllAnonymousContent", false);
 // Enable the MDN docs tooltip
 pref("devtools.inspector.mdnDocsTooltip.enabled", true);
+// Enable the new color widget
+pref("devtools.inspector.colorWidget.enabled", false);
 
 // Enable the Font Inspector
 pref("devtools.fontinspector.enabled", true);
 
 // Enable the Layout View
 pref("devtools.layoutview.enabled", false);
 
 // Grid highlighter preferences
new file mode 100644
--- /dev/null
+++ b/devtools/client/shared/widgets/ColorWidget.js
@@ -0,0 +1,341 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * This file is a new working copy of Spectrum.js for the purposes of refreshing the color
+ * widget. It is hidden behind a pref("devtools.inspector.colorWidget.enabled").
+ */
+
+"use strict";
+
+const EventEmitter = require("devtools/shared/event-emitter");
+const XHTML_NS = "http://www.w3.org/1999/xhtml";
+
+/**
+ * ColorWidget creates a color picker widget in any container you give it.
+ *
+ * Simple usage example:
+ *
+ * const {ColorWidget} = require("devtools/client/shared/widgets/ColorWidget");
+ * let s = new ColorWidget(containerElement, [255, 126, 255, 1]);
+ * s.on("changed", (event, rgba, color) => {
+ *   console.log("rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ", " +
+ *     rgba[3] + ")");
+ * });
+ * s.show();
+ * s.destroy();
+ *
+ * Note that the color picker is hidden by default and you need to call show to
+ * make it appear. This 2 stages initialization helps in cases you are creating
+ * the color picker in a parent element that hasn't been appended anywhere yet
+ * or that is hidden. Calling show() when the parent element is appended and
+ * visible will allow the color widget to correctly initialize its various parts.
+ *
+ * Fires the following events:
+ * - changed : When the user changes the current color
+ */
+function ColorWidget(parentEl, rgb) {
+  EventEmitter.decorate(this);
+
+  this.element = parentEl.ownerDocument.createElementNS(XHTML_NS, "div");
+  this.parentEl = parentEl;
+
+  this.element.className = "colorwidget-container";
+  this.element.innerHTML = `
+    <div class="colorwidget-top">
+      <div class="colorwidget-fill"></div>
+      <div class="colorwidget-top-inner">
+        <div class="colorwidget-color colorwidget-box">
+          <div class="colorwidget-sat">
+            <div class="colorwidget-val">
+              <div class="colorwidget-dragger"></div>
+            </div>
+          </div>
+        </div>
+        <div class="colorwidget-hue colorwidget-box">
+          <div class="colorwidget-slider colorwidget-slider-control"></div>
+        </div>
+      </div>
+    </div>
+    <div class="colorwidget-alpha colorwidget-checker colorwidget-box">
+      <div class="colorwidget-alpha-inner">
+        <div class="colorwidget-alpha-handle colorwidget-slider-control"></div>
+      </div>
+    </div>
+  `;
+
+  this.onElementClick = this.onElementClick.bind(this);
+  this.element.addEventListener("click", this.onElementClick);
+
+  this.parentEl.appendChild(this.element);
+
+  this.slider = this.element.querySelector(".colorwidget-hue");
+  this.slideHelper = this.element.querySelector(".colorwidget-slider");
+  ColorWidget.draggable(this.slider, this.onSliderMove.bind(this));
+
+  this.dragger = this.element.querySelector(".colorwidget-color");
+  this.dragHelper = this.element.querySelector(".colorwidget-dragger");
+  ColorWidget.draggable(this.dragger, this.onDraggerMove.bind(this));
+
+  this.alphaSlider = this.element.querySelector(".colorwidget-alpha");
+  this.alphaSliderInner = this.element.querySelector(".colorwidget-alpha-inner");
+  this.alphaSliderHelper = this.element.querySelector(".colorwidget-alpha-handle");
+  ColorWidget.draggable(this.alphaSliderInner, this.onAlphaSliderMove.bind(this));
+
+  if (rgb) {
+    this.rgb = rgb;
+    this.updateUI();
+  }
+}
+
+module.exports.ColorWidget = ColorWidget;
+
+ColorWidget.hsvToRgb = function (h, s, v, a) {
+  let r, g, b;
+
+  let i = Math.floor(h * 6);
+  let f = h * 6 - i;
+  let p = v * (1 - s);
+  let q = v * (1 - f * s);
+  let t = v * (1 - (1 - f) * s);
+
+  switch (i % 6) {
+    case 0: r = v; g = t; b = p; break;
+    case 1: r = q; g = v; b = p; break;
+    case 2: r = p; g = v; b = t; break;
+    case 3: r = p; g = q; b = v; break;
+    case 4: r = t; g = p; b = v; break;
+    case 5: r = v; g = p; b = q; break;
+  }
+
+  return [r * 255, g * 255, b * 255, a];
+};
+
+ColorWidget.rgbToHsv = function (r, g, b, a) {
+  r = r / 255;
+  g = g / 255;
+  b = b / 255;
+
+  let max = Math.max(r, g, b), min = Math.min(r, g, b);
+  let h, s, v = max;
+
+  let d = max - min;
+  s = max == 0 ? 0 : d / max;
+
+  if (max == min) {
+    // achromatic
+    h = 0;
+  } else {
+    switch (max) {
+      case r: h = (g - b) / d + (g < b ? 6 : 0); break;
+      case g: h = (b - r) / d + 2; break;
+      case b: h = (r - g) / d + 4; break;
+    }
+    h /= 6;
+  }
+  return [h, s, v, a];
+};
+
+ColorWidget.draggable = function (element, onmove, onstart, onstop) {
+  onmove = onmove || function () {};
+  onstart = onstart || function () {};
+  onstop = onstop || function () {};
+
+  let doc = element.ownerDocument;
+  let dragging = false;
+  let offset = {};
+  let maxHeight = 0;
+  let maxWidth = 0;
+
+  function prevent(e) {
+    e.stopPropagation();
+    e.preventDefault();
+  }
+
+  function move(e) {
+    if (dragging) {
+      if (e.buttons === 0) {
+        // The button is no longer pressed but we did not get a mouseup event.
+        stop();
+        return;
+      }
+      let pageX = e.pageX;
+      let pageY = e.pageY;
+
+      let dragX = Math.max(0, Math.min(pageX - offset.left, maxWidth));
+      let dragY = Math.max(0, Math.min(pageY - offset.top, maxHeight));
+
+      onmove.apply(element, [dragX, dragY]);
+    }
+  }
+
+  function start(e) {
+    let rightclick = e.which === 3;
+
+    if (!rightclick && !dragging) {
+      if (onstart.apply(element, arguments) !== false) {
+        dragging = true;
+        maxHeight = element.offsetHeight;
+        maxWidth = element.offsetWidth;
+
+        offset = element.getBoundingClientRect();
+
+        move(e);
+
+        doc.addEventListener("selectstart", prevent);
+        doc.addEventListener("dragstart", prevent);
+        doc.addEventListener("mousemove", move);
+        doc.addEventListener("mouseup", stop);
+
+        prevent(e);
+      }
+    }
+  }
+
+  function stop() {
+    if (dragging) {
+      doc.removeEventListener("selectstart", prevent);
+      doc.removeEventListener("dragstart", prevent);
+      doc.removeEventListener("mousemove", move);
+      doc.removeEventListener("mouseup", stop);
+      onstop.apply(element, arguments);
+    }
+    dragging = false;
+  }
+
+  element.addEventListener("mousedown", start);
+};
+
+ColorWidget.prototype = {
+  set rgb(color) {
+    this.hsv = ColorWidget.rgbToHsv(color[0], color[1], color[2], color[3]);
+  },
+
+  get rgb() {
+    let rgb = ColorWidget.hsvToRgb(this.hsv[0], this.hsv[1], this.hsv[2],
+      this.hsv[3]);
+    return [Math.round(rgb[0]), Math.round(rgb[1]), Math.round(rgb[2]),
+            Math.round(rgb[3] * 100) / 100];
+  },
+
+  get rgbNoSatVal() {
+    let rgb = ColorWidget.hsvToRgb(this.hsv[0], 1, 1);
+    return [Math.round(rgb[0]), Math.round(rgb[1]), Math.round(rgb[2]), rgb[3]];
+  },
+
+  get rgbCssString() {
+    let rgb = this.rgb;
+    return "rgba(" + rgb[0] + ", " + rgb[1] + ", " + rgb[2] + ", " +
+      rgb[3] + ")";
+  },
+
+  show: function () {
+    this.element.classList.add("colorwidget-show");
+
+    this.slideHeight = this.slider.offsetHeight;
+    this.dragWidth = this.dragger.offsetWidth;
+    this.dragHeight = this.dragger.offsetHeight;
+    this.dragHelperHeight = this.dragHelper.offsetHeight;
+    this.slideHelperHeight = this.slideHelper.offsetHeight;
+    this.alphaSliderWidth = this.alphaSliderInner.offsetWidth;
+    this.alphaSliderHelperWidth = this.alphaSliderHelper.offsetWidth;
+
+    this.updateUI();
+  },
+
+  onElementClick: function (e) {
+    e.stopPropagation();
+  },
+
+  onSliderMove: function (dragX, dragY) {
+    this.hsv[0] = (dragY / this.slideHeight);
+    this.updateUI();
+    this.onChange();
+  },
+
+  onDraggerMove: function (dragX, dragY) {
+    this.hsv[1] = dragX / this.dragWidth;
+    this.hsv[2] = (this.dragHeight - dragY) / this.dragHeight;
+    this.updateUI();
+    this.onChange();
+  },
+
+  onAlphaSliderMove: function (dragX, dragY) {
+    this.hsv[3] = dragX / this.alphaSliderWidth;
+    this.updateUI();
+    this.onChange();
+  },
+
+  onChange: function () {
+    this.emit("changed", this.rgb, this.rgbCssString);
+  },
+
+  updateHelperLocations: function () {
+    // If the UI hasn't been shown yet then none of the dimensions will be
+    // correct
+    if (!this.element.classList.contains("colorwidget-show")) {
+      return;
+    }
+
+    let h = this.hsv[0];
+    let s = this.hsv[1];
+    let v = this.hsv[2];
+
+    // Placing the color dragger
+    let dragX = s * this.dragWidth;
+    let dragY = this.dragHeight - (v * this.dragHeight);
+    let helperDim = this.dragHelperHeight / 2;
+
+    dragX = Math.max(
+      -helperDim,
+      Math.min(this.dragWidth - helperDim, dragX - helperDim)
+    );
+    dragY = Math.max(
+      -helperDim,
+      Math.min(this.dragHeight - helperDim, dragY - helperDim)
+    );
+
+    this.dragHelper.style.top = dragY + "px";
+    this.dragHelper.style.left = dragX + "px";
+
+    // Placing the hue slider
+    let slideY = (h * this.slideHeight) - this.slideHelperHeight / 2;
+    this.slideHelper.style.top = slideY + "px";
+
+    // Placing the alpha slider
+    let alphaSliderX = (this.hsv[3] * this.alphaSliderWidth) -
+      (this.alphaSliderHelperWidth / 2);
+    this.alphaSliderHelper.style.left = alphaSliderX + "px";
+  },
+
+  updateUI: function () {
+    this.updateHelperLocations();
+
+    let rgb = this.rgb;
+    let rgbNoSatVal = this.rgbNoSatVal;
+
+    let flatColor = "rgb(" + rgbNoSatVal[0] + ", " + rgbNoSatVal[1] + ", " +
+      rgbNoSatVal[2] + ")";
+
+    this.dragger.style.backgroundColor = flatColor;
+
+    let rgbNoAlpha = "rgb(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + ")";
+    let rgbAlpha0 = "rgba(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + ", 0)";
+    let alphaGradient = "linear-gradient(to right, " + rgbAlpha0 + ", " +
+      rgbNoAlpha + ")";
+    this.alphaSliderInner.style.background = alphaGradient;
+  },
+
+  destroy: function () {
+    this.element.removeEventListener("click", this.onElementClick);
+
+    this.parentEl.removeChild(this.element);
+
+    this.slider = null;
+    this.dragger = null;
+    this.alphaSlider = this.alphaSliderInner = this.alphaSliderHelper = null;
+    this.parentEl = null;
+    this.element = null;
+  }
+};
new file mode 100644
--- /dev/null
+++ b/devtools/client/shared/widgets/color-widget.css
@@ -0,0 +1,155 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#eyedropper-button {
+  margin-inline-start: 5px;
+  display: block;
+}
+
+#eyedropper-button::before {
+  background-image: url(chrome://devtools/skin/images/command-eyedropper.svg);
+}
+
+/* Mix-in classes */
+
+.colorwidget-checker {
+  background-color: #eee;
+  background-image: linear-gradient(45deg, #ccc 25%, transparent 25%, transparent 75%, #ccc 75%, #ccc),
+    linear-gradient(45deg, #ccc 25%, transparent 25%, transparent 75%, #ccc 75%, #ccc);
+  background-size: 12px 12px;
+  background-position: 0 0, 6px 6px;
+}
+
+.colorwidget-slider-control {
+  cursor: pointer;
+  box-shadow: 0 0 2px rgba(0,0,0,.6);
+  background: #fff;
+  border-radius: 10px;
+  opacity: .8;
+}
+
+.colorwidget-box {
+  border: 1px solid rgba(0,0,0,0.2);
+  border-radius: 2px;
+  background-clip: content-box;
+}
+
+/* Elements */
+
+#colorwidget-tooltip {
+  padding: 4px;
+}
+
+.colorwidget-container {
+  position: relative;
+  display: none;
+  top: 0;
+  left: 0;
+  border-radius: 0;
+  width: 200px;
+  padding: 5px;
+}
+
+.colorwidget-show {
+  display: inline-block;
+}
+
+/* Keep aspect ratio:
+http://www.briangrinstead.com/blog/keep-aspect-ratio-with-html-and-css */
+.colorwidget-top {
+  position: relative;
+  width: 100%;
+  display: inline-block;
+}
+
+.colorwidget-top-inner {
+  position: absolute;
+  top:0;
+  left:0;
+  bottom:0;
+  right:0;
+}
+
+.colorwidget-color {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 20%;
+}
+
+.colorwidget-hue {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 83%;
+}
+
+.colorwidget-fill {
+  /* Same as colorwidget-color width */
+  margin-top: 85%;
+}
+
+.colorwidget-sat, .colorwidget-val {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+}
+
+.colorwidget-dragger, .colorwidget-slider {
+  -moz-user-select: none;
+}
+
+.colorwidget-alpha {
+  position: relative;
+  height: 8px;
+  margin-top: 3px;
+}
+
+.colorwidget-alpha-inner {
+  height: 100%;
+}
+
+.colorwidget-alpha-handle {
+  position: absolute;
+  top: -3px;
+  bottom: -3px;
+  width: 5px;
+  left: 50%;
+}
+
+.colorwidget-sat {
+  background-image: linear-gradient(to right, #FFF, rgba(204, 154, 129, 0));
+}
+
+.colorwidget-val {
+  background-image: linear-gradient(to top, #000000, rgba(204, 154, 129, 0));
+}
+
+.colorwidget-hue {
+  background: linear-gradient(to bottom, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
+}
+
+.colorwidget-dragger {
+  position: absolute;
+  top: 0px;
+  left: 0px;
+  cursor: pointer;
+  border-radius: 50%;
+  height: 8px;
+  width: 8px;
+  border: 1px solid white;
+  box-shadow: 0 0 2px rgba(0,0,0,.6);
+}
+
+.colorwidget-slider {
+  position: absolute;
+  top: 0;
+  height: 5px;
+  left: -3px;
+  right: -3px;
+}
--- a/devtools/client/shared/widgets/moz.build
+++ b/devtools/client/shared/widgets/moz.build
@@ -8,16 +8,17 @@ DIRS += [
     'tooltip',
 ]
 
 DevToolsModules(
     'AbstractTreeItem.jsm',
     'BarGraphWidget.js',
     'BreadcrumbsWidget.jsm',
     'Chart.js',
+    'ColorWidget.js',
     'CubicBezierPresets.js',
     'CubicBezierWidget.js',
     'FastListWidget.js',
     'FilterWidget.js',
     'FlameGraph.js',
     'Graphs.js',
     'GraphsWorker.js',
     'LineGraphWidget.js',
--- a/devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip.js
+++ b/devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip.js
@@ -1,23 +1,26 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
+const Services = require("Services");
 const {Task} = require("devtools/shared/task");
 const {colorUtils} = require("devtools/shared/css/color");
 const {Spectrum} = require("devtools/client/shared/widgets/Spectrum");
 const SwatchBasedEditorTooltip = require("devtools/client/shared/widgets/tooltip/SwatchBasedEditorTooltip");
 const {LocalizationHelper} = require("devtools/shared/l10n");
 const L10N = new LocalizationHelper("devtools/client/locales/inspector.properties");
 
 const Heritage = require("sdk/core/heritage");
 
+const colorWidgetPref = "devtools.inspector.colorWidget.enabled";
+const NEW_COLOR_WIDGET = Services.prefs.getBoolPref(colorWidgetPref);
 const XHTML_NS = "http://www.w3.org/1999/xhtml";
 
 /**
  * The swatch color picker tooltip class is a specific class meant to be used
  * along with output-parser's generated color swatches.
  * It extends the parent SwatchBasedEditorTooltip class.
  * It just wraps a standard Tooltip and sets its content with an instance of a
  * color picker.
@@ -29,17 +32,19 @@ const XHTML_NS = "http://www.w3.org/1999
  * @param {InspectorPanel} inspector
  *        The inspector panel, needed for the eyedropper.
  * @param {Function} supportsCssColor4ColorFunction
  *        A function for checking the supporting of css-color-4 color function.
  */
 function SwatchColorPickerTooltip(document,
                                   inspector,
                                   {supportsCssColor4ColorFunction}) {
-  let stylesheet = "chrome://devtools/content/shared/widgets/spectrum.css";
+  let stylesheet = NEW_COLOR_WIDGET ?
+    "chrome://devtools/content/shared/widgets/color-widget.css" :
+    "chrome://devtools/content/shared/widgets/spectrum.css";
   SwatchBasedEditorTooltip.call(this, document, stylesheet);
 
   this.inspector = inspector;
 
   // Creating a spectrum instance. this.spectrum will always be a promise that
   // resolves to the spectrum instance
   this.spectrum = this.setColorPickerContent([0, 0, 0, 1]);
   this._onSpectrumColorChange = this._onSpectrumColorChange.bind(this);
@@ -66,17 +71,23 @@ SwatchColorPickerTooltip.prototype = Her
     /* pointerEvents for eyedropper has to be set auto to display tooltip when
      * eyedropper is disabled in non-HTML documents.
      */
     eyedropper.style.pointerEvents = "auto";
     container.appendChild(eyedropper);
 
     this.tooltip.setContent(container, { width: 218, height: 224 });
 
-    let spectrum = new Spectrum(spectrumNode, color);
+    let spectrum;
+    if (NEW_COLOR_WIDGET) {
+      const {ColorWidget} = require("devtools/client/shared/widgets/ColorWidget");
+      spectrum = new ColorWidget(spectrumNode, color);
+    } else {
+      spectrum = new Spectrum(spectrumNode, color);
+    }
 
     // Wait for the tooltip to be shown before calling spectrum.show
     // as it expect to be visible in order to compute DOM element sizes.
     this.tooltip.once("shown", () => {
       spectrum.show();
     });
 
     return spectrum;
--- a/docshell/base/nsDocShellTreeOwner.cpp
+++ b/docshell/base/nsDocShellTreeOwner.cpp
@@ -68,16 +68,17 @@
 #include "nsView.h"
 #include "nsIDOMDragEvent.h"
 #include "nsIConstraintValidation.h"
 #include "mozilla/Attributes.h"
 #include "mozilla/EventListenerManager.h"
 #include "mozilla/dom/Event.h" // for nsIDOMEvent::InternalDOMEvent()
 #include "mozilla/dom/File.h" // for input type=file
 #include "mozilla/dom/FileList.h" // for input type=file
+#include "mozilla/TextEvents.h"
 
 using namespace mozilla;
 using namespace mozilla::dom;
 
 // A helper routine that navigates the tricky path from a |nsWebBrowser| to
 // a |EventTarget| via the window root and chrome event handler.
 static nsresult
 GetDOMEventTarget(nsWebBrowser* aInBrowser, EventTarget** aTarget)
@@ -1110,19 +1111,21 @@ ChromeTooltipListener::AddChromeListener
 // for mouseExit, "mouse motion" for mouseMove, and "key" for keyDown. As we
 // add the listeners, keep track of how many succeed so we can clean up
 // correctly in Release().
 NS_IMETHODIMP
 ChromeTooltipListener::AddTooltipListener()
 {
   if (mEventTarget) {
     nsresult rv = NS_OK;
+#ifndef XP_WIN
     rv = mEventTarget->AddSystemEventListener(NS_LITERAL_STRING("keydown"),
                                               this, false, false);
     NS_ENSURE_SUCCESS(rv, rv);
+#endif
     rv = mEventTarget->AddSystemEventListener(NS_LITERAL_STRING("mousedown"),
                                               this, false, false);
     NS_ENSURE_SUCCESS(rv, rv);
     rv = mEventTarget->AddSystemEventListener(NS_LITERAL_STRING("mouseout"),
                                               this, false, false);
     NS_ENSURE_SUCCESS(rv, rv);
     rv = mEventTarget->AddSystemEventListener(NS_LITERAL_STRING("mousemove"),
                                               this, false, false);
@@ -1151,19 +1154,21 @@ ChromeTooltipListener::RemoveChromeListe
 }
 
 // Unsubscribe from all the various tooltip events that we were listening to.
 NS_IMETHODIMP
 ChromeTooltipListener::RemoveTooltipListener()
 {
   if (mEventTarget) {
     nsresult rv = NS_OK;
+#ifndef XP_WIN
     rv = mEventTarget->RemoveSystemEventListener(NS_LITERAL_STRING("keydown"),
                                                  this, false);
     NS_ENSURE_SUCCESS(rv, rv);
+#endif
     rv = mEventTarget->RemoveSystemEventListener(NS_LITERAL_STRING("mousedown"),
                                                  this, false);
     NS_ENSURE_SUCCESS(rv, rv);
     rv = mEventTarget->RemoveSystemEventListener(NS_LITERAL_STRING("mouseout"),
                                                  this, false);
     NS_ENSURE_SUCCESS(rv, rv);
     rv = mEventTarget->RemoveSystemEventListener(NS_LITERAL_STRING("mousemove"),
                                                  this, false);
@@ -1176,19 +1181,25 @@ ChromeTooltipListener::RemoveTooltipList
 }
 
 NS_IMETHODIMP
 ChromeTooltipListener::HandleEvent(nsIDOMEvent* aEvent)
 {
   nsAutoString eventType;
   aEvent->GetType(eventType);
 
-  if (eventType.EqualsLiteral("keydown") ||
-      eventType.EqualsLiteral("mousedown")) {
+  if (eventType.EqualsLiteral("mousedown")) {
     return HideTooltip();
+  } else if (eventType.EqualsLiteral("keydown")) {
+    WidgetKeyboardEvent* keyEvent = aEvent->WidgetEventPtr()->AsKeyboardEvent();
+    if (!keyEvent->IsModifierKeyEvent()) {
+      return HideTooltip();
+    }
+
+    return NS_OK;
   } else if (eventType.EqualsLiteral("mouseout")) {
     // Reset flag so that tooltip will display on the next MouseMove
     mTooltipShownOnce = false;
     return HideTooltip();
   } else if (eventType.EqualsLiteral("mousemove")) {
     return MouseMove(aEvent);
   }
 
--- a/dom/cache/DBSchema.cpp
+++ b/dom/cache/DBSchema.cpp
@@ -2548,17 +2548,17 @@ Migrate(mozIStorageConnection* aConn)
         if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
         if (shouldRewrite) {
           rewriteSchema = true;
         }
         break;
       }
     }
 
-#if !defined(RELEASE_OR_BETA)
+#if defined(DEBUG) || !defined(RELEASE_OR_BETA)
     int32_t lastVersion = currentVersion;
 #endif
     rv = aConn->GetSchemaVersion(&currentVersion);
     if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
     MOZ_DIAGNOSTIC_ASSERT(currentVersion > lastVersion);
   }
 
   MOZ_DIAGNOSTIC_ASSERT(currentVersion == kLatestSchemaVersion);
--- a/dom/cache/Manager.cpp
+++ b/dom/cache/Manager.cpp
@@ -1521,17 +1521,17 @@ Manager::AddRefCacheId(CacheId aCacheId)
 }
 
 void
 Manager::ReleaseCacheId(CacheId aCacheId)
 {
   NS_ASSERT_OWNINGTHREAD(Manager);
   for (uint32_t i = 0; i < mCacheIdRefs.Length(); ++i) {
     if (mCacheIdRefs[i].mCacheId == aCacheId) {
-#if !defined(RELEASE_OR_BETA)
+#if defined(DEBUG) || !defined(RELEASE_OR_BETA)
       uint32_t oldRef = mCacheIdRefs[i].mCount;
 #endif
       mCacheIdRefs[i].mCount -= 1;
       MOZ_DIAGNOSTIC_ASSERT(mCacheIdRefs[i].mCount < oldRef);
       if (mCacheIdRefs[i].mCount == 0) {
         bool orphaned = mCacheIdRefs[i].mOrphaned;
         mCacheIdRefs.RemoveElementAt(i);
         RefPtr<Context> context = mContext;
@@ -1572,17 +1572,17 @@ Manager::AddRefBodyId(const nsID& aBodyI
 }
 
 void
 Manager::ReleaseBodyId(const nsID& aBodyId)
 {
   NS_ASSERT_OWNINGTHREAD(Manager);
   for (uint32_t i = 0; i < mBodyIdRefs.Length(); ++i) {
     if (mBodyIdRefs[i].mBodyId == aBodyId) {
-#if !defined(RELEASE_OR_BETA)
+#if defined(DEBUG) || !defined(RELEASE_OR_BETA)
       uint32_t oldRef = mBodyIdRefs[i].mCount;
 #endif
       mBodyIdRefs[i].mCount -= 1;
       MOZ_DIAGNOSTIC_ASSERT(mBodyIdRefs[i].mCount < oldRef);
       if (mBodyIdRefs[i].mCount < 1) {
         bool orphaned = mBodyIdRefs[i].mOrphaned;
         mBodyIdRefs.RemoveElementAt(i);
         RefPtr<Context> context = mContext;
--- a/dom/cache/StreamControl.cpp
+++ b/dom/cache/StreamControl.cpp
@@ -40,26 +40,28 @@ StreamControl::~StreamControl()
   // owning thread only, but can't call virtual AssertOwningThread in destructor
   MOZ_DIAGNOSTIC_ASSERT(mReadStreamList.IsEmpty());
 }
 
 void
 StreamControl::CloseReadStreams(const nsID& aId)
 {
   AssertOwningThread();
-#if !defined(RELEASE_OR_BETA)
+#if defined(DEBUG) || !defined(RELEASE_OR_BETA)
   uint32_t closedCount = 0;
 #endif
 
   ReadStreamList::ForwardIterator iter(mReadStreamList);
   while (iter.HasMore()) {
     RefPtr<ReadStream::Controllable> stream = iter.GetNext();
     if (stream->MatchId(aId)) {
       stream->CloseStream();
+#if defined(DEBUG) || !defined(RELEASE_OR_BETA)
       closedCount += 1;
+#endif
     }
   }
 
   MOZ_DIAGNOSTIC_ASSERT(closedCount > 0);
 }
 
 void
 StreamControl::CloseAllReadStreams()
new file mode 100644
--- /dev/null
+++ b/dom/svg/crashtests/1329849-1.svg
@@ -0,0 +1,13 @@
+<svg height='600'
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink">
+
+<filter id='f1'>
+<feSpecularLighting kernelUnitLength='-82'>
+<feSpotLight/>
+</feSpecularLighting>
+</filter>
+<filter id='f2' xlink:href='#f1'></filter>
+<polyline filter='url(#f2)' points='10,59 293,88 18,289'/>
+
+</svg>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/dom/svg/crashtests/1329849-2.svg
@@ -0,0 +1,13 @@
+<svg height='600'
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink">
+
+<filter id='f1'>
+<feSpecularLighting kernelUnitLength='-80 10'>
+<feSpotLight/>
+</feSpecularLighting>
+</filter>
+<filter id='f2' xlink:href='#f1'></filter>
+<polyline filter='url(#f2)' points='10,59 293,88 18,289'/>
+
+</svg>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/dom/svg/crashtests/1329849-3.svg
@@ -0,0 +1,13 @@
+<svg height='600'
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink">
+
+<filter id='f1'>
+<feSpecularLighting kernelUnitLength='80 -10'>
+<feSpotLight/>
+</feSpecularLighting>
+</filter>
+<filter id='f2' xlink:href='#f1'></filter>
+<polyline filter='url(#f2)' points='10,59 293,88 18,289'/>
+
+</svg>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/dom/svg/crashtests/1329849-4.svg
@@ -0,0 +1,13 @@
+<svg height='600'
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink">
+
+<filter id='f1'>
+<feDiffuseLighting kernelUnitLength='-80'>
+<feSpotLight/>
+</feDiffuseLighting>
+</filter>
+<filter id='f2' xlink:href='#f1'></filter>
+<polyline filter='url(#f2)' points='10,59 293,88 18,289'/>
+
+</svg>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/dom/svg/crashtests/1329849-5.svg
@@ -0,0 +1,13 @@
+<svg height='600'
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink">
+
+<filter id='f1'>
+<feDiffuseLighting kernelUnitLength='-80 10'>
+<feSpotLight/>
+</feDiffuseLighting>
+</filter>
+<filter id='f2' xlink:href='#f1'></filter>
+<polyline filter='url(#f2)' points='10,59 293,88 18,289'/>
+
+</svg>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/dom/svg/crashtests/1329849-6.svg
@@ -0,0 +1,13 @@
+<svg height='600'
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink">
+
+<filter id='f1'>
+<feDiffuseLighting kernelUnitLength='80 -10'>
+<feSpotLight/>
+</feDiffuseLighting>
+</filter>
+<filter id='f2' xlink:href='#f1'></filter>
+<polyline filter='url(#f2)' points='10,59 293,88 18,289'/>
+
+</svg>
\ No newline at end of file
--- a/dom/svg/crashtests/crashtests.list
+++ b/dom/svg/crashtests/crashtests.list
@@ -77,8 +77,14 @@ load 1035248-2.svg
 load 1244898-1.xhtml
 asserts-if(stylo,2) load 1250725.html # bug 1324669
 load 1267272-1.svg
 load 1282985-1.svg
 # Disabled for now due to it taking a very long time to run - bug 1259356
 #load long-clipPath-reference-chain.svg
 load zero-size-image.svg
 asserts-if(stylo,2) load 1322286.html # bug 1324669
+load 1329849-1.svg
+load 1329849-2.svg
+load 1329849-3.svg
+load 1329849-4.svg
+load 1329849-5.svg
+load 1329849-6.svg
--- a/dom/svg/nsSVGFilters.cpp
+++ b/dom/svg/nsSVGFilters.cpp
@@ -512,16 +512,22 @@ nsSVGFELightingElement::AddLightingAttri
 
   nsStyleContext* style = frame->StyleContext();
   Color color(Color::FromABGR(style->StyleSVGReset()->mLightingColor));
   color.a = 1.f;
   float surfaceScale = mNumberAttributes[SURFACE_SCALE].GetAnimValue();
   Size kernelUnitLength =
     GetKernelUnitLength(aInstance, &mNumberPairAttributes[KERNEL_UNIT_LENGTH]);
 
+  if (kernelUnitLength.width <= 0 || kernelUnitLength.height <= 0) {
+    // According to spec, A negative or zero value is an error. See link below for details.
+    // https://www.w3.org/TR/SVG/filters.html#feSpecularLightingKernelUnitLengthAttribute
+    return FilterPrimitiveDescription(PrimitiveType::Empty);
+  }
+
   FilterPrimitiveDescription& descr = aDescription;
   descr.Attributes().Set(eLightingLight, ComputeLightAttributes(aInstance));
   descr.Attributes().Set(eLightingSurfaceScale, surfaceScale);
   descr.Attributes().Set(eLightingKernelUnitLength, kernelUnitLength);
   descr.Attributes().Set(eLightingColor, color);
   return descr;
 }
 
--- a/dom/workers/test/gtest/TestReadWrite.cpp
+++ b/dom/workers/test/gtest/TestReadWrite.cpp
@@ -19,19 +19,24 @@
 using namespace mozilla::dom;
 using namespace mozilla::ipc;
 
 class ServiceWorkerRegistrarTest : public ServiceWorkerRegistrar
 {
 public:
   ServiceWorkerRegistrarTest()
   {
+#if defined(DEBUG) || !defined(RELEASE_OR_BETA)
     nsresult rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR,
                                        getter_AddRefs(mProfileDir));
     MOZ_DIAGNOSTIC_ASSERT(NS_SUCCEEDED(rv));
+#else
+    NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR,
+                           getter_AddRefs(mProfileDir));
+#endif
     MOZ_DIAGNOSTIC_ASSERT(mProfileDir);
   }
 
   nsresult TestReadData() { return ReadData(); }
   nsresult TestWriteData() { return WriteData(); }
   void TestDeleteData() { DeleteData(); }
 
   void TestRegisterServiceWorker(const ServiceWorkerRegistrationData& aData)
--- a/dom/xbl/nsXBLPrototypeHandler.cpp
+++ b/dom/xbl/nsXBLPrototypeHandler.cpp
@@ -84,41 +84,44 @@ nsXBLPrototypeHandler::nsXBLPrototypeHan
                                              const char16_t* aClickCount,
                                              const char16_t* aGroup,
                                              const char16_t* aPreventDefault,
                                              const char16_t* aAllowUntrusted,
                                              nsXBLPrototypeBinding* aBinding,
                                              uint32_t aLineNumber)
   : mHandlerText(nullptr),
     mLineNumber(aLineNumber),
+    mReserved(false),
     mNextHandler(nullptr),
     mPrototypeBinding(aBinding)
 {
   Init();
 
   ConstructPrototype(nullptr, aEvent, aPhase, aAction, aCommand, aKeyCode,
                      aCharCode, aModifiers, aButton, aClickCount,
                      aGroup, aPreventDefault, aAllowUntrusted);
 }
 
-nsXBLPrototypeHandler::nsXBLPrototypeHandler(nsIContent* aHandlerElement)
+nsXBLPrototypeHandler::nsXBLPrototypeHandler(nsIContent* aHandlerElement, bool aReserved)
   : mHandlerElement(nullptr),
     mLineNumber(0),
+    mReserved(aReserved),
     mNextHandler(nullptr),
     mPrototypeBinding(nullptr)
 {
   Init();
 
   // Make sure our prototype is initialized.
   ConstructPrototype(aHandlerElement);
 }
 
 nsXBLPrototypeHandler::nsXBLPrototypeHandler(nsXBLPrototypeBinding* aBinding)
   : mHandlerText(nullptr),
     mLineNumber(0),
+    mReserved(false),
     mNextHandler(nullptr),
     mPrototypeBinding(aBinding)
 {
   Init();
 }
 
 nsXBLPrototypeHandler::~nsXBLPrototypeHandler()
 {
--- a/dom/xbl/nsXBLPrototypeHandler.h
+++ b/dom/xbl/nsXBLPrototypeHandler.h
@@ -78,17 +78,17 @@ public:
                         const char16_t* aModifiers, const char16_t* aButton,
                         const char16_t* aClickCount, const char16_t* aGroup,
                         const char16_t* aPreventDefault,
                         const char16_t* aAllowUntrusted,
                         nsXBLPrototypeBinding* aBinding,
                         uint32_t aLineNumber);
 
   // This constructor is used only by XUL key handlers (e.g., <key>)
-  explicit nsXBLPrototypeHandler(nsIContent* aKeyElement);
+  explicit nsXBLPrototypeHandler(nsIContent* aKeyElement, bool aReserved);
 
   // This constructor is used for handlers loaded from the cache
   explicit nsXBLPrototypeHandler(nsXBLPrototypeBinding* aBinding);
 
   ~nsXBLPrototypeHandler();
 
   bool EventTypeEquals(nsIAtom* aEventType) const
   {
@@ -111,16 +111,17 @@ public:
   }
 
   already_AddRefed<nsIContent> GetHandlerElement();
 
   void AppendHandlerText(const nsAString& aText);
 
   uint8_t GetPhase() { return mPhase; }
   uint8_t GetType() { return mType; }
+  bool GetIsReserved() { return mReserved; }
 
   nsXBLPrototypeHandler* GetNextHandler() { return mNextHandler; }
   void SetNextHandler(nsXBLPrototypeHandler* aHandler) { mNextHandler = aHandler; }
 
   nsresult ExecuteHandler(mozilla::dom::EventTarget* aTarget, nsIDOMEvent* aEvent);
 
   already_AddRefed<nsIAtom> GetEventName();
   void SetEventName(nsIAtom* aName) { mEventName = aName; }
@@ -221,16 +222,18 @@ protected:
   uint8_t mType;             // The type of the handler.  The handler is either a XUL key
                              // handler, an XBL "command" event, or a normal XBL event with
                              // accompanying JavaScript.  The high bit is used to indicate
                              // whether this handler should prevent the default action.
   uint8_t mMisc;             // Miscellaneous extra information.  For key events,
                              // stores whether or not we're a key code or char code.
                              // For mouse events, stores the clickCount.
 
+  bool mReserved;            // <key> is reserved for chrome. Not used by handlers.
+
   int32_t mKeyMask;          // Which modifier keys this event handler expects to have down
                              // in order to be matched.
  
   // The primary filter information for mouse/key events.
   int32_t mDetail;           // For key events, contains a charcode or keycode. For
                              // mouse events, stores the button info.
 
   // Prototype handlers are chained. We own the next handler in the chain.
--- a/dom/xbl/nsXBLWindowKeyHandler.cpp
+++ b/dom/xbl/nsXBLWindowKeyHandler.cpp
@@ -209,17 +209,19 @@ BuildHandlerChain(nsIContent* aContent, 
       bool attrExists =
         key->GetAttr(kNameSpaceID_None, nsGkAtoms::key, valKey) ||
         key->GetAttr(kNameSpaceID_None, nsGkAtoms::charcode, valCharCode) ||
         key->GetAttr(kNameSpaceID_None, nsGkAtoms::keycode, valKeyCode);
       if (attrExists &&
           valKey.IsEmpty() && valCharCode.IsEmpty() && valKeyCode.IsEmpty())
         continue;
 
-      nsXBLPrototypeHandler* handler = new nsXBLPrototypeHandler(key);
+      bool reserved = key->AttrValueIs(kNameSpaceID_None, nsGkAtoms::reserved,
+                                       nsGkAtoms::_true, eCaseMatters);
+      nsXBLPrototypeHandler* handler = new nsXBLPrototypeHandler(key, reserved);
 
       handler->SetNextHandler(*aResult);
       *aResult = handler;
     }
   }
 }
 
 //
@@ -701,28 +703,25 @@ nsXBLWindowKeyHandler::WalkHandlersAndEx
     // Before executing this handler, check that it's not disabled,
     // and that it has something to do (oncommand of the <key> or its
     // <command> is non-empty).
     nsCOMPtr<Element> commandElement;
     if (!GetElementForHandler(handler, getter_AddRefs(commandElement))) {
       continue;
     }
 
-    bool isReserved = false;
+    bool isReserved = handler->GetIsReserved();
+    if (aOutReservedForChrome) {
+      *aOutReservedForChrome = isReserved;
+    }
+
     if (commandElement) {
       if (aExecute && !IsExecutableElement(commandElement)) {
         continue;
       }
-
-      isReserved =
-        commandElement->AttrValueIs(kNameSpaceID_None, nsGkAtoms::reserved,
-                                    nsGkAtoms::_true, eCaseMatters);
-      if (aOutReservedForChrome) {
-        *aOutReservedForChrome = isReserved;
-      }
     }
 
     if (!aExecute) {
       if (handler->EventTypeEquals(aEventType)) {
         return true;
       }
       // If the command is reserved and the event is keydown, check also if
       // the handler is for keypress because if following keypress event is
--- a/gfx/2d/FilterNodeSoftware.cpp
+++ b/gfx/2d/FilterNodeSoftware.cpp
@@ -3477,16 +3477,19 @@ FilterNodeLightingSoftware<LightType, Li
 }
 
 template<typename LightType, typename LightingType> template<typename CoordType>
 already_AddRefed<DataSourceSurface>
 FilterNodeLightingSoftware<LightType, LightingType>::DoRender(const IntRect& aRect,
                                                               CoordType aKernelUnitLengthX,
                                                               CoordType aKernelUnitLengthY)
 {
+  MOZ_ASSERT(aKernelUnitLengthX > 0, "aKernelUnitLengthX can be a negative or zero value");
+  MOZ_ASSERT(aKernelUnitLengthY > 0, "aKernelUnitLengthY can be a negative or zero value");
+
   IntRect srcRect = aRect;
   IntSize size = aRect.Size();
   srcRect.Inflate(ceil(float(aKernelUnitLengthX)),
                   ceil(float(aKernelUnitLengthY)));
 
   // Inflate the source rect by another pixel because the bilinear filtering in
   // ColorComponentAtPoint may want to access the margins.
   srcRect.Inflate(1);
--- a/js/src/jit/BaselineCacheIRCompiler.cpp
+++ b/js/src/jit/BaselineCacheIRCompiler.cpp
@@ -761,16 +761,55 @@ BaselineCacheIRCompiler::emitStoreFixedS
 
 bool
 BaselineCacheIRCompiler::emitStoreDynamicSlot()
 {
     return emitStoreSlotShared(false);
 }
 
 bool
+BaselineCacheIRCompiler::emitStoreUnboxedProperty()
+{
+    ObjOperandId objId = reader.objOperandId();
+    JSValueType fieldType = reader.valueType();
+    Address offsetAddr = stubAddress(reader.stubOffset());
+
+    // Allocate the fixed registers first. These need to be fixed for
+    // callTypeUpdateIC.
+    AutoStubFrame stubFrame(*this);
+    AutoScratchRegister scratch(allocator, masm, R1.scratchReg());
+    ValueOperand val = allocator.useFixedValueRegister(masm, reader.valOperandId(), R0);
+
+    Register obj = allocator.useRegister(masm, objId);
+
+    // We only need the type update IC if we are storing an object.
+    if (fieldType == JSVAL_TYPE_OBJECT) {
+        LiveGeneralRegisterSet saveRegs;
+        saveRegs.add(obj);
+        saveRegs.add(val);
+        if (!callTypeUpdateIC(stubFrame, obj, val, scratch, saveRegs))
+            return false;
+    }
+
+    masm.load32(offsetAddr, scratch);
+    BaseIndex fieldAddr(obj, scratch, TimesOne);
+
+    // Note that the storeUnboxedProperty call here is infallible, as the
+    // IR emitter is responsible for guarding on |val|'s type.
+    EmitUnboxedPreBarrierForBaseline(masm, fieldAddr, fieldType);
+    masm.storeUnboxedProperty(fieldAddr, fieldType,
+                              ConstantOrRegister(TypedOrValueRegister(val)),
+                              /* failure = */ nullptr);
+
+    if (UnboxedTypeNeedsPostBarrier(fieldType))
+        BaselineEmitPostWriteBarrierSlot(masm, obj, val, scratch, LiveGeneralRegisterSet(), cx_);
+    return true;
+}
+
+bool
 BaselineCacheIRCompiler::emitTypeMonitorResult()
 {
     allocator.discardStack(masm);
     EmitEnterTypeMonitorIC(masm);
     return true;
 }
 
 bool
@@ -960,27 +999,27 @@ jit::AttachBaselineCacheIRStub(JSContext
     for (ICStubConstIterator iter = stub->beginChainConst(); !iter.atEnd(); iter++) {
         switch (stubKind) {
           case CacheIRStubKind::Monitored: {
             if (!iter->isCacheIR_Monitored())
                 continue;
             auto otherStub = iter->toCacheIR_Monitored();
             if (otherStub->stubInfo() != stubInfo)
                 continue;
-            if (!writer.stubDataEquals(otherStub->stubDataStart()))
+            if (!writer.stubDataEqualsMaybeUpdate(otherStub->stubDataStart()))
                 continue;
             break;
           }
           case CacheIRStubKind::Updated: {
             if (!iter->isCacheIR_Updated())
                 continue;
             auto otherStub = iter->toCacheIR_Updated();
             if (otherStub->stubInfo() != stubInfo)
                 continue;
-            if (!writer.stubDataEquals(otherStub->stubDataStart()))
+            if (!writer.stubDataEqualsMaybeUpdate(otherStub->stubDataStart()))
                 continue;
             break;
           }
         }
 
         // We found a stub that's exactly the same as the stub we're about to
         // attach. Just return nullptr, the caller should do nothing in this
         // case.
--- a/js/src/jit/BaselineIC.cpp
+++ b/js/src/jit/BaselineIC.cpp
@@ -287,18 +287,17 @@ DoTypeUpdateFallback(JSContext* cx, Base
         AddTypePropertyId(cx, obj, id, value);
         break;
       case ICStub::SetElem_DenseOrUnboxedArray:
       case ICStub::SetElem_DenseOrUnboxedArrayAdd: {
         id = JSID_VOID;
         AddTypePropertyId(cx, obj, id, value);
         break;
       }
-      case ICStub::SetProp_NativeAdd:
-      case ICStub::SetProp_Unboxed: {
+      case ICStub::SetProp_NativeAdd: {
         MOZ_ASSERT(obj->isNative() || obj->is<UnboxedPlainObject>());
         jsbytecode* pc = stub->getChainFallback()->icEntry()->pc(script);
         if (*pc == JSOP_SETALIASEDVAR || *pc == JSOP_INITALIASEDLEXICAL)
             id = NameToId(EnvironmentCoordinateName(cx->caches.envCoordinateNameCache, script, pc));
         else
             id = NameToId(script->getName(pc));
         AddTypePropertyId(cx, obj, id, value);
         break;
@@ -1447,19 +1446,18 @@ BaselineScript::noteArrayWriteHole(uint3
     if (stub->isSetElem_Fallback())
         stub->toSetElem_Fallback()->noteArrayWriteHole();
 }
 
 //
 // SetElem_DenseOrUnboxedArray
 //
 
-template <typename T>
 void
-EmitUnboxedPreBarrierForBaseline(MacroAssembler &masm, T address, JSValueType type)
+EmitUnboxedPreBarrierForBaseline(MacroAssembler &masm, const BaseIndex& address, JSValueType type)
 {
     if (type == JSVAL_TYPE_OBJECT)
         EmitPreBarrier(masm, address, MIRType::Object);
     else if (type == JSVAL_TYPE_STRING)
         EmitPreBarrier(masm, address, MIRType::String);
     else
         MOZ_ASSERT(!UnboxedTypeNeedsPreBarrier(type));
 }
@@ -2746,50 +2744,16 @@ TryAttachSetAccessorPropStub(JSContext* 
         *attached = true;
         return true;
     }
 
     return true;
 }
 
 static bool
-TryAttachUnboxedSetPropStub(JSContext* cx, HandleScript script,
-                            ICSetProp_Fallback* stub, HandleId id,
-                            HandleObject obj, HandleValue rhs, bool* attached)
-{
-    MOZ_ASSERT(!*attached);
-
-    if (!cx->runtime()->jitSupportsFloatingPoint)
-        return true;
-
-    if (!obj->is<UnboxedPlainObject>())
-        return true;
-
-    const UnboxedLayout::Property* property = obj->as<UnboxedPlainObject>().layout().lookup(id);
-    if (!property)
-        return true;
-
-    ICSetProp_Unboxed::Compiler compiler(cx, obj->group(),
-                                         property->offset + UnboxedPlainObject::offsetOfData(),
-                                         property->type);
-    ICUpdatedStub* newStub = compiler.getStub(compiler.getStubSpace(script));
-    if (!newStub)
-        return false;
-    if (compiler.needsUpdateStubs() && !newStub->addUpdateStubForValue(cx, script, obj, id, rhs))
-        return false;
-
-    stub->addNewStub(newStub);
-
-    StripPreliminaryObjectStubs(cx, stub);
-
-    *attached = true;
-    return true;
-}
-
-static bool
 TryAttachTypedObjectSetPropStub(JSContext* cx, HandleScript script,
                                 ICSetProp_Fallback* stub, HandleId id,
                                 HandleObject obj, HandleValue rhs, bool* attached)
 {
     MOZ_ASSERT(!*attached);
 
     if (!cx->runtime()->jitSupportsFloatingPoint)
         return true;
@@ -2965,25 +2929,16 @@ DoSetPropFallback(JSContext* cx, Baselin
     {
         return false;
     }
     if (attached)
         return true;
 
     if (!attached &&
         lhs.isObject() &&
-        !TryAttachUnboxedSetPropStub(cx, script, stub, id, obj, rhs, &attached))
-    {
-        return false;
-    }
-    if (attached)
-        return true;
-
-    if (!attached &&
-        lhs.isObject() &&
         !TryAttachTypedObjectSetPropStub(cx, script, stub, id, obj, rhs, &attached))
     {
         return false;
     }
     if (attached)
         return true;
 
     MOZ_ASSERT(!attached);
@@ -3238,77 +3193,16 @@ ICSetPropNativeAddCompiler::generateStub
     EmitUnstowICValues(masm, 2);
 
     masm.bind(&failure);
     EmitStubGuardFailure(masm);
     return true;
 }
 
 bool
-ICSetProp_Unboxed::Compiler::generateStubCode(MacroAssembler& masm)
-{
-    MOZ_ASSERT(engine_ == Engine::Baseline);
-
-    Label failure;
-
-    // Guard input is an object.
-    masm.branchTestObject(Assembler::NotEqual, R0, &failure);
-
-    AllocatableGeneralRegisterSet regs(availableGeneralRegs(2));
-    Register scratch = regs.takeAny();
-
-    // Unbox and group guard.
-    Register object = masm.extractObject(R0, ExtractTemp0);
-    masm.loadPtr(Address(ICStubReg, ICSetProp_Unboxed::offsetOfGroup()), scratch);
-    masm.branchPtr(Assembler::NotEqual, Address(object, JSObject::offsetOfGroup()), scratch,
-                   &failure);
-
-    if (needsUpdateStubs()) {
-        // Stow both R0 and R1 (object and value).
-        EmitStowICValues(masm, 2);
-
-        // Move RHS into R0 for TypeUpdate check.
-        masm.moveValue(R1, R0);
-
-        // Call the type update stub.
-        if (!callTypeUpdateIC(masm, sizeof(Value)))
-            return false;
-
-        // Unstow R0 and R1 (object and key)
-        EmitUnstowICValues(masm, 2);
-
-        // The TypeUpdate IC may have smashed object. Rederive it.
-        masm.unboxObject(R0, object);
-
-        // Trigger post barriers here on the values being written. Fields which
-        // objects can be written to also need update stubs.
-        LiveGeneralRegisterSet saveRegs;
-        saveRegs.add(R0);
-        saveRegs.add(R1);
-        saveRegs.addUnchecked(object);
-        saveRegs.add(ICStubReg);
-        BaselineEmitPostWriteBarrierSlot(masm, object, R1, scratch, saveRegs, cx);
-    }
-
-    // Compute the address being written to.
-    masm.load32(Address(ICStubReg, ICSetProp_Unboxed::offsetOfFieldOffset()), scratch);
-    BaseIndex address(object, scratch, TimesOne);
-
-    EmitUnboxedPreBarrierForBaseline(masm, address, fieldType_);
-    masm.storeUnboxedProperty(address, fieldType_,
-                              ConstantOrRegister(TypedOrValueRegister(R1)), &failure);
-
-    EmitReturnFromIC(masm);
-
-    masm.bind(&failure);
-    EmitStubGuardFailure(masm);
-    return true;
-}
-
-bool
 ICSetProp_TypedObject::Compiler::generateStubCode(MacroAssembler& masm)
 {
     MOZ_ASSERT(engine_ == Engine::Baseline);
 
     Label failure;
 
     CheckForTypedObjectWithDetachedStorage(cx, masm, &failure);
 
--- a/js/src/jit/BaselineIC.h
+++ b/js/src/jit/BaselineIC.h
@@ -1230,80 +1230,16 @@ class ICSetPropNativeAddCompiler : publi
 
         return newStub<ICSetProp_NativeAddImpl<ProtoChainDepth>>(
             space, getStubCode(), oldGroup_, shapes, newShape, newGroup, offset_);
     }
 
     ICUpdatedStub* getStub(ICStubSpace* space);
 };
 
-class ICSetProp_Unboxed : public ICUpdatedStub
-{
-    friend class ICStubSpace;
-
-    GCPtrObjectGroup group_;
-    uint32_t fieldOffset_;
-
-    ICSetProp_Unboxed(JitCode* stubCode, ObjectGroup* group, uint32_t fieldOffset)
-      : ICUpdatedStub(ICStub::SetProp_Unboxed, stubCode),
-        group_(group),
-        fieldOffset_(fieldOffset)
-    {
-        (void) fieldOffset_; // Silence clang warning
-    }
-
-  public:
-    GCPtrObjectGroup& group() {
-        return group_;
-    }
-
-    static size_t offsetOfGroup() {
-        return offsetof(ICSetProp_Unboxed, group_);
-    }
-    static size_t offsetOfFieldOffset() {
-        return offsetof(ICSetProp_Unboxed, fieldOffset_);
-    }
-
-    class Compiler : public ICStubCompiler {
-      protected:
-        RootedObjectGroup group_;
-        uint32_t fieldOffset_;
-        JSValueType fieldType_;
-
-        MOZ_MUST_USE bool generateStubCode(MacroAssembler& masm);
-
-        virtual int32_t getKey() const {
-            return static_cast<int32_t>(engine_) |
-                  (static_cast<int32_t>(kind) << 1) |
-                  (static_cast<int32_t>(fieldType_) << 17);
-        }
-
-      public:
-        Compiler(JSContext* cx, ObjectGroup* group, uint32_t fieldOffset,
-                 JSValueType fieldType)
-          : ICStubCompiler(cx, ICStub::SetProp_Unboxed, Engine::Baseline),
-            group_(cx, group),
-            fieldOffset_(fieldOffset),
-            fieldType_(fieldType)
-        {}
-
-        ICUpdatedStub* getStub(ICStubSpace* space) {
-            ICUpdatedStub* stub = newStub<ICSetProp_Unboxed>(space, getStubCode(), group_,
-                                                             fieldOffset_);
-            if (!stub || !stub->initUpdatingChain(cx, space))
-                return nullptr;
-            return stub;
-        }
-
-        bool needsUpdateStubs() {
-            return fieldType_ == JSVAL_TYPE_OBJECT;
-        }
-    };
-};
-
 class ICSetProp_TypedObject : public ICUpdatedStub
 {
     friend class ICStubSpace;
 
     GCPtrShape shape_;
     GCPtrObjectGroup group_;
     uint32_t fieldOffset_;
     bool isObjectReference_;
@@ -2590,12 +2526,15 @@ IsCacheableDOMProxy(JSObject* obj)
         return false;
 
     const BaseProxyHandler* handler = obj->as<ProxyObject>().handler();
     return handler->family() == GetDOMProxyHandlerFamily();
 }
 
 struct IonOsrTempData;
 
+void EmitUnboxedPreBarrierForBaseline(MacroAssembler &masm, const BaseIndex& address,
+                                      JSValueType type);
+
 } // namespace jit
 } // namespace js
 
 #endif /* jit_BaselineIC_h */
--- a/js/src/jit/BaselineICList.h
+++ b/js/src/jit/BaselineICList.h
@@ -65,17 +65,16 @@ namespace jit {
                                                  \
     _(BindName_Fallback)                         \
                                                  \
     _(GetIntrinsic_Fallback)                     \
     _(GetIntrinsic_Constant)                     \
                                                  \
     _(SetProp_Fallback)                          \
     _(SetProp_NativeAdd)                         \
-    _(SetProp_Unboxed)                           \
     _(SetProp_TypedObject)                       \
     _(SetProp_CallScripted)                      \
     _(SetProp_CallNative)                        \
                                                  \
     _(TableSwitch)                               \
                                                  \
     _(IteratorNew_Fallback)                      \
     _(IteratorMore_Fallback)                     \
--- a/js/src/jit/BaselineInspector.cpp
+++ b/js/src/jit/BaselineInspector.cpp
@@ -209,16 +209,52 @@ GetCacheIRReceiverForNativeSetSlot(ICCac
 
     if (!reader.matchOpEither(CacheOp::StoreFixedSlot, CacheOp::StoreDynamicSlot))
         return false;
 
     *receiver = ReceiverGuard(group, shape);
     return true;
 }
 
+static bool
+GetCacheIRReceiverForUnboxedProperty(ICCacheIR_Updated* stub, ReceiverGuard* receiver)
+{
+    // We match:
+    //
+    //   GuardIsObject 0
+    //   GuardGroup 0
+    //   GuardType 1 type | GuardIsObjectOrNull 1
+    //   StoreUnboxedProperty 0
+
+    *receiver = ReceiverGuard();
+    CacheIRReader reader(stub->stubInfo());
+
+    ObjOperandId objId = ObjOperandId(0);
+    ValOperandId rhsId = ValOperandId(1);
+    if (!reader.matchOp(CacheOp::GuardIsObject, objId))
+        return false;
+
+    if (!reader.matchOp(CacheOp::GuardGroup, objId))
+        return false;
+    ObjectGroup* group = stub->stubInfo()->getStubField<ObjectGroup*>(stub, reader.stubOffset());
+
+    if (reader.matchOp(CacheOp::GuardType, rhsId)) {
+        reader.valueType(); // Skip.
+    } else {
+        if (!reader.matchOp(CacheOp::GuardIsObjectOrNull, rhsId))
+            return false;
+    }
+
+    if (!reader.matchOp(CacheOp::StoreUnboxedProperty))
+        return false;
+
+    *receiver = ReceiverGuard(group, nullptr);
+    return true;
+}
+
 bool
 BaselineInspector::maybeInfoForPropertyOp(jsbytecode* pc, ReceiverVector& receivers,
                                           ObjectGroupVector& convertUnboxedGroups)
 {
     // Return a list of the receivers seen by the baseline IC for the current
     // op. Empty lists indicate no receivers are known, or there was an
     // uncacheable access. convertUnboxedGroups is used for unboxed object
     // groups which have been seen, but have had instances converted to native
@@ -238,22 +274,22 @@ BaselineInspector::maybeInfoForPropertyO
         if (stub->isCacheIR_Monitored()) {
             if (!GetCacheIRReceiverForNativeReadSlot(stub->toCacheIR_Monitored(), &receiver) &&
                 !GetCacheIRReceiverForUnboxedProperty(stub->toCacheIR_Monitored(), &receiver))
             {
                 receivers.clear();
                 return true;
             }
         } else if (stub->isCacheIR_Updated()) {
-            if (!GetCacheIRReceiverForNativeSetSlot(stub->toCacheIR_Updated(), &receiver)) {
+            if (!GetCacheIRReceiverForNativeSetSlot(stub->toCacheIR_Updated(), &receiver) &&
+                !GetCacheIRReceiverForUnboxedProperty(stub->toCacheIR_Updated(), &receiver))
+            {
                 receivers.clear();
                 return true;
             }
-        } else if (stub->isSetProp_Unboxed()) {
-            receiver = ReceiverGuard(stub->toSetProp_Unboxed()->group(), nullptr);
         } else {
             receivers.clear();
             return true;
         }
 
         if (!AddReceiver(receiver, receivers, convertUnboxedGroups))
             return false;
 
--- a/js/src/jit/CacheIR.cpp
+++ b/js/src/jit/CacheIR.cpp
@@ -674,19 +674,21 @@ CheckDOMProxyExpandoDoesNotShadow(CacheI
 }
 
 bool
 GetPropIRGenerator::tryAttachDOMProxyUnshadowed(HandleObject obj, ObjOperandId objId, HandleId id)
 {
     MOZ_ASSERT(IsCacheableDOMProxy(obj));
 
     RootedObject checkObj(cx_, obj->staticPrototype());
+    if (!checkObj)
+        return false;
+
     RootedNativeObject holder(cx_);
     RootedShape shape(cx_);
-
     NativeGetPropCacheability canCache = CanAttachNativeGetProp(cx_, checkObj, id, &holder, &shape,
                                                                 pc_, engine_, canAttachGetter_,
                                                                 isTemporarilyUnoptimizable_);
     MOZ_ASSERT_IF(idempotent(),
                   canCache == CanAttachNone || (canCache == CanAttachReadSlot && holder));
     if (canCache == CanAttachNone)
         return false;
 
@@ -1558,16 +1560,18 @@ SetPropIRGenerator::tryAttachStub()
             return false;
 
         ObjOperandId objId = writer.guardIsObject(lhsValId);
         if (nameOrSymbol) {
             if (tryAttachNativeSetSlot(obj, objId, id, rhsValId))
                 return true;
             if (tryAttachUnboxedExpandoSetSlot(obj, objId, id, rhsValId))
                 return true;
+            if (tryAttachUnboxedProperty(obj, objId, id, rhsValId))
+                return true;
         }
         return false;
     }
 
     return false;
 }
 
 static void
@@ -1656,8 +1660,42 @@ SetPropIRGenerator::tryAttachUnboxedExpa
     writer.guardGroup(objId, obj->group());
     ObjOperandId expandoId = writer.guardAndLoadUnboxedExpando(objId);
     writer.guardShape(expandoId, expando->lastProperty());
 
     setUpdateStubInfo(id);
     EmitStoreSlotAndReturn(writer, expandoId, expando, propShape, rhsId);
     return true;
 }
+
+static void
+EmitGuardUnboxedPropertyType(CacheIRWriter& writer, JSValueType propType, ValOperandId valId)
+{
+    if (propType == JSVAL_TYPE_OBJECT) {
+        // Unboxed objects store NullValue as nullptr object.
+        writer.guardIsObjectOrNull(valId);
+    } else {
+        writer.guardType(valId, propType);
+    }
+}
+
+bool
+SetPropIRGenerator::tryAttachUnboxedProperty(HandleObject obj, ObjOperandId objId, HandleId id,
+                                             ValOperandId rhsId)
+{
+    if (!obj->is<UnboxedPlainObject>() || !cx_->runtime()->jitSupportsFloatingPoint)
+        return false;
+
+    const UnboxedLayout::Property* property = obj->as<UnboxedPlainObject>().layout().lookup(id);
+    if (!property)
+        return false;
+
+    writer.guardGroup(objId, obj->group());
+    EmitGuardUnboxedPropertyType(writer, property->type, rhsId);
+    writer.storeUnboxedProperty(objId, property->type,
+                                UnboxedPlainObject::offsetOfData() + property->offset,
+                                rhsId);
+    writer.returnFromIC();
+
+    setUpdateStubInfo(id);
+    preliminaryObjectAction_ = PreliminaryObjectAction::Unlink;
+    return true;
+}
--- a/js/src/jit/CacheIR.h
+++ b/js/src/jit/CacheIR.h
@@ -134,16 +134,17 @@ enum class CacheKind : uint8_t
     GetProp,
     GetElem,
     GetName,
     SetProp,
 };
 
 #define CACHE_IR_OPS(_)                   \
     _(GuardIsObject)                      \
+    _(GuardIsObjectOrNull)                \
     _(GuardIsString)                      \
     _(GuardIsSymbol)                      \
     _(GuardIsInt32Index)                  \
     _(GuardType)                          \
     _(GuardShape)                         \
     _(GuardGroup)                         \
     _(GuardProto)                         \
     _(GuardClass)                         \
@@ -166,16 +167,17 @@ enum class CacheKind : uint8_t
     /* See CacheIR.cpp 'DOM proxies' comment. */ \
     _(LoadDOMExpandoValue)                \
     _(LoadDOMExpandoValueGuardGeneration) \
     _(LoadDOMExpandoValueIgnoreGeneration)\
     _(GuardDOMExpandoMissingOrGuardShape) \
                                           \
     _(StoreFixedSlot)                     \
     _(StoreDynamicSlot)                   \
+    _(StoreUnboxedProperty)               \
                                           \
     /* The *Result ops load a value into the cache's result register. */ \
     _(LoadFixedSlotResult)                \
     _(LoadDynamicSlotResult)              \
     _(LoadUnboxedPropertyResult)          \
     _(LoadTypedObjectResult)              \
     _(LoadDenseElementResult)             \
     _(LoadDenseElementHoleResult)         \
@@ -218,16 +220,17 @@ class StubField
         JSObject,
         Symbol,
         String,
         Id,
 
         // These fields take up 64 bits on all platforms.
         RawInt64,
         First64BitType = RawInt64,
+        DOMExpandoGeneration,
         Value,
 
         Limit
     };
 
     static bool sizeIsWord(Type type) {
         MOZ_ASSERT(type != Type::Limit);
         return type < Type::First64BitType;
@@ -373,17 +376,17 @@ class MOZ_RAII CacheIRWriter : public JS
         // For now, assert we only GC before we append stub fields.
         MOZ_RELEASE_ASSERT(stubFields_.empty());
     }
 
     size_t stubDataSize() const {
         return stubDataSize_;
     }
     void copyStubData(uint8_t* dest) const;
-    bool stubDataEquals(const uint8_t* stubData) const;
+    bool stubDataEqualsMaybeUpdate(uint8_t* stubData) const;
 
     bool operandIsDead(uint32_t operandId, uint32_t currentInstruction) const {
         if (operandId >= operandLastUsed_.length())
             return false;
         return currentInstruction > operandLastUsed_[operandId];
     }
     const uint8_t* codeStart() const {
         MOZ_ASSERT(!failed());
@@ -423,16 +426,19 @@ class MOZ_RAII CacheIRWriter : public JS
         writeOperandId(res);
         return res;
     }
     void guardType(ValOperandId val, JSValueType type) {
         writeOpWithOperandId(CacheOp::GuardType, val);
         static_assert(sizeof(type) == sizeof(uint8_t), "JSValueType should fit in a byte");
         buffer_.writeByte(uint32_t(type));
     }
+    void guardIsObjectOrNull(ValOperandId val) {
+        writeOpWithOperandId(CacheOp::GuardIsObjectOrNull, val);
+    }
     void guardShape(ObjOperandId obj, Shape* shape) {
         writeOpWithOperandId(CacheOp::GuardShape, obj);
         addStubField(uintptr_t(shape), StubField::Type::Shape);
     }
     void guardGroup(ObjOperandId obj, ObjectGroup* group) {
         writeOpWithOperandId(CacheOp::GuardGroup, obj);
         addStubField(uintptr_t(group), StubField::Type::ObjectGroup);
     }
@@ -535,17 +541,17 @@ class MOZ_RAII CacheIRWriter : public JS
         addStubField(uintptr_t(shape), StubField::Type::Shape);
     }
     ValOperandId loadDOMExpandoValueGuardGeneration(ObjOperandId obj,
                                                     ExpandoAndGeneration* expandoAndGeneration)
     {
         ValOperandId res(nextOperandId_++);
         writeOpWithOperandId(CacheOp::LoadDOMExpandoValueGuardGeneration, obj);
         addStubField(uintptr_t(expandoAndGeneration), StubField::Type::RawWord);
-        addStubField(expandoAndGeneration->generation, StubField::Type::RawInt64);
+        addStubField(expandoAndGeneration->generation, StubField::Type::DOMExpandoGeneration);
         writeOperandId(res);
         return res;
     }
     ValOperandId loadDOMExpandoValueIgnoreGeneration(ObjOperandId obj) {
         ValOperandId res(nextOperandId_++);
         writeOpWithOperandId(CacheOp::LoadDOMExpandoValueIgnoreGeneration, obj);
         writeOperandId(res);
         return res;
@@ -556,16 +562,24 @@ class MOZ_RAII CacheIRWriter : public JS
         addStubField(offset, StubField::Type::RawWord);
         writeOperandId(rhs);
     }
     void storeDynamicSlot(ObjOperandId obj, size_t offset, ValOperandId rhs) {
         writeOpWithOperandId(CacheOp::StoreDynamicSlot, obj);
         addStubField(offset, StubField::Type::RawWord);
         writeOperandId(rhs);
     }
+    void storeUnboxedProperty(ObjOperandId obj, JSValueType type, size_t offset,
+                              ValOperandId rhs)
+    {
+        writeOpWithOperandId(CacheOp::StoreUnboxedProperty, obj);
+        buffer_.writeByte(uint32_t(type));
+        addStubField(offset, StubField::Type::RawWord);
+        writeOperandId(rhs);
+    }
 
     void loadUndefinedResult() {
         writeOp(CacheOp::LoadUndefinedResult);
     }
     void loadFixedSlotResult(ObjOperandId obj, size_t offset) {
         writeOpWithOperandId(CacheOp::LoadFixedSlotResult, obj);
         addStubField(offset, StubField::Type::RawWord);
     }
@@ -859,16 +873,18 @@ class MOZ_RAII SetPropIRGenerator : publ
         needUpdateStub_ = true;
         updateStubId_ = id;
     }
 
     bool tryAttachNativeSetSlot(HandleObject obj, ObjOperandId objId, HandleId id,
                                  ValOperandId rhsId);
     bool tryAttachUnboxedExpandoSetSlot(HandleObject obj, ObjOperandId objId, HandleId id,
                                         ValOperandId rhsId);
+    bool tryAttachUnboxedProperty(HandleObject obj, ObjOperandId objId, HandleId id,
+                                  ValOperandId rhsId);
 
   public:
     SetPropIRGenerator(JSContext* cx, jsbytecode* pc, CacheKind cacheKind,
                        bool* isTemporarilyUnoptimizable, HandleValue lhsVal, HandleValue idVal,
                        HandleValue rhsVal);
 
     bool tryAttachStub();
 
--- a/js/src/jit/CacheIRCompiler.cpp
+++ b/js/src/jit/CacheIRCompiler.cpp
@@ -668,16 +668,17 @@ CacheIRStubInfo::copyStubData(ICStub* sr
     while (true) {
         StubField::Type type = fieldType(field);
         switch (type) {
           case StubField::Type::RawWord:
             *reinterpret_cast<uintptr_t*>(destBytes + offset) =
                 *reinterpret_cast<uintptr_t*>(srcBytes + offset);
             break;
           case StubField::Type::RawInt64:
+          case StubField::Type::DOMExpandoGeneration:
             *reinterpret_cast<uint64_t*>(destBytes + offset) =
                 *reinterpret_cast<uint64_t*>(srcBytes + offset);
             break;
           case StubField::Type::Shape:
             getStubField<ICStub, Shape*>(dest, offset).init(getStubField<ICStub, Shape*>(src, offset));
             break;
           case StubField::Type::JSObject:
             getStubField<ICStub, JSObject*>(dest, offset).init(getStubField<ICStub, JSObject*>(src, offset));
@@ -763,16 +764,17 @@ CacheIRWriter::copyStubData(uint8_t* des
             break;
           case StubField::Type::String:
             InitGCPtr<JSString*>(destWords, field.asWord());
             break;
           case StubField::Type::Id:
             InitGCPtr<jsid>(destWords, field.asWord());
             break;
           case StubField::Type::RawInt64:
+          case StubField::Type::DOMExpandoGeneration:
             *reinterpret_cast<uint64_t*>(destWords) = field.asInt64();
             break;
           case StubField::Type::Value:
             InitGCPtr<JS::Value>(destWords, field.asInt64());
             break;
           case StubField::Type::Limit:
             MOZ_CRASH("Invalid type");
         }
@@ -786,16 +788,17 @@ jit::TraceCacheIRStub(JSTracer* trc, T* 
 {
     uint32_t field = 0;
     size_t offset = 0;
     while (true) {
         StubField::Type fieldType = stubInfo->fieldType(field);
         switch (fieldType) {
           case StubField::Type::RawWord:
           case StubField::Type::RawInt64:
+          case StubField::Type::DOMExpandoGeneration:
             break;
           case StubField::Type::Shape:
             TraceNullableEdge(trc, &stubInfo->getStubField<T, Shape*>(stub, offset),
                               "cacheir-shape");
             break;
           case StubField::Type::ObjectGroup:
             TraceNullableEdge(trc, &stubInfo->getStubField<T, ObjectGroup*>(stub, offset),
                               "cacheir-group");
@@ -829,35 +832,48 @@ jit::TraceCacheIRStub(JSTracer* trc, T* 
 
 template
 void jit::TraceCacheIRStub(JSTracer* trc, ICStub* stub, const CacheIRStubInfo* stubInfo);
 
 template
 void jit::TraceCacheIRStub(JSTracer* trc, IonICStub* stub, const CacheIRStubInfo* stubInfo);
 
 bool
-CacheIRWriter::stubDataEquals(const uint8_t* stubData) const
+CacheIRWriter::stubDataEqualsMaybeUpdate(uint8_t* stubData) const
 {
     MOZ_ASSERT(!failed());
 
     const uintptr_t* stubDataWords = reinterpret_cast<const uintptr_t*>(stubData);
 
+    // If DOMExpandoGeneration fields are different but all other stub fields
+    // are exactly the same, we overwrite the old stub data instead of attaching
+    // a new stub, as the old stub is never going to succeed. This works because
+    // even Ion stubs read the DOMExpandoGeneration field from the stub instead
+    // of baking it in.
+    bool expandoGenerationIsDifferent = false;
+
     for (const StubField& field : stubFields_) {
         if (field.sizeIsWord()) {
             if (field.asWord() != *stubDataWords)
                 return false;
             stubDataWords++;
             continue;
         }
 
-        if (field.asInt64() != *reinterpret_cast<const uint64_t*>(stubDataWords))
-            return false;
+        if (field.asInt64() != *reinterpret_cast<const uint64_t*>(stubDataWords)) {
+            if (field.type() != StubField::Type::DOMExpandoGeneration)
+                return false;
+            expandoGenerationIsDifferent = true;
+        }
         stubDataWords += sizeof(uint64_t) / sizeof(uintptr_t);
     }
 
+    if (expandoGenerationIsDifferent)
+        copyStubData(stubData);
+
     return true;
 }
 
 HashNumber
 CacheIRStubKey::hash(const CacheIRStubKey::Lookup& l)
 {
     HashNumber hash = mozilla::HashBytes(l.code, l.length);
     hash = mozilla::AddToHash(hash, uint32_t(l.kind));
@@ -1036,16 +1052,36 @@ CacheIRCompiler::emitGuardIsObject()
     FailurePath* failure;
     if (!addFailurePath(&failure))
         return false;
     masm.branchTestObject(Assembler::NotEqual, input, failure->label());
     return true;
 }
 
 bool
+CacheIRCompiler::emitGuardIsObjectOrNull()
+{
+    ValOperandId inputId = reader.valOperandId();
+    JSValueType knownType = allocator.knownType(inputId);
+    if (knownType == JSVAL_TYPE_OBJECT || knownType == JSVAL_TYPE_NULL)
+        return true;
+
+    ValueOperand input = allocator.useValueRegister(masm, inputId);
+    FailurePath* failure;
+    if (!addFailurePath(&failure))
+        return false;
+
+    Label done;
+    masm.branchTestObject(Assembler::Equal, input, &done);
+    masm.branchTestNull(Assembler::NotEqual, input, failure->label());
+    masm.bind(&done);
+    return true;
+}
+
+bool
 CacheIRCompiler::emitGuardIsString()
 {
     ValOperandId inputId = reader.valOperandId();
     if (allocator.knownType(inputId) == JSVAL_TYPE_STRING)
         return true;
 
     ValueOperand input = allocator.useValueRegister(masm, inputId);
     FailurePath* failure;
@@ -1139,16 +1175,19 @@ CacheIRCompiler::emitGuardType()
 
     switch (type) {
       case JSVAL_TYPE_STRING:
         masm.branchTestString(Assembler::NotEqual, input, failure->label());
         break;
       case JSVAL_TYPE_SYMBOL:
         masm.branchTestSymbol(Assembler::NotEqual, input, failure->label());
         break;
+      case JSVAL_TYPE_INT32:
+        masm.branchTestInt32(Assembler::NotEqual, input, failure->label());
+        break;
       case JSVAL_TYPE_DOUBLE:
         masm.branchTestNumber(Assembler::NotEqual, input, failure->label());
         break;
       case JSVAL_TYPE_BOOLEAN:
         masm.branchTestBoolean(Assembler::NotEqual, input, failure->label());
         break;
       case JSVAL_TYPE_UNDEFINED:
         masm.branchTestUndefined(Assembler::NotEqual, input, failure->label());
--- a/js/src/jit/CacheIRCompiler.h
+++ b/js/src/jit/CacheIRCompiler.h
@@ -11,16 +11,17 @@
 
 namespace js {
 namespace jit {
 
 // The ops below are defined in CacheIRCompiler and codegen is shared between
 // BaselineCacheIRCompiler and IonCacheIRCompiler.
 #define CACHE_IR_SHARED_OPS(_)            \
     _(GuardIsObject)                      \
+    _(GuardIsObjectOrNull)                \
     _(GuardIsString)                      \
     _(GuardIsSymbol)                      \
     _(GuardIsInt32Index)                  \
     _(GuardType)                          \
     _(GuardClass)                         \
     _(GuardIsProxy)                       \
     _(GuardNotDOMProxy)                   \
     _(GuardMagicValue)                    \
--- a/js/src/jit/IonCacheIRCompiler.cpp
+++ b/js/src/jit/IonCacheIRCompiler.cpp
@@ -1,59 +1,68 @@
 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  * vim: set ts=8 sts=4 et sw=4 tw=99:
  * This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
+#include "mozilla/DebugOnly.h"
+
 #include "jit/CacheIRCompiler.h"
 #include "jit/IonCaches.h"
 #include "jit/IonIC.h"
 
 #include "jit/Linker.h"
 #include "jit/SharedICHelpers.h"
 #include "proxy/Proxy.h"
 
 #include "jit/MacroAssembler-inl.h"
 
 using namespace js;
 using namespace js::jit;
 
+using mozilla::DebugOnly;
+
 namespace js {
 namespace jit {
 
 // IonCacheIRCompiler compiles CacheIR to IonIC native code.
 class MOZ_RAII IonCacheIRCompiler : public CacheIRCompiler
 {
   public:
     friend class AutoSaveLiveRegisters;
 
-    IonCacheIRCompiler(JSContext* cx, const CacheIRWriter& writer, IonIC* ic, IonScript* ionScript)
+    IonCacheIRCompiler(JSContext* cx, const CacheIRWriter& writer, IonIC* ic, IonScript* ionScript,
+                       IonICStub* stub)
       : CacheIRCompiler(cx, writer, Mode::Ion),
         writer_(writer),
         ic_(ic),
         ionScript_(ionScript),
+        stub_(stub),
         nextStubField_(0),
 #ifdef DEBUG
         calledPrepareVMCall_(false),
 #endif
         savedLiveRegs_(false)
     {
         MOZ_ASSERT(ic_);
         MOZ_ASSERT(ionScript_);
     }
 
     MOZ_MUST_USE bool init();
-    JitCode* compile(IonICStub* stub);
+    JitCode* compile();
 
   private:
     const CacheIRWriter& writer_;
     IonIC* ic_;
     IonScript* ionScript_;
 
+    // The stub we're generating code for.
+    IonICStub* stub_;
+
     CodeOffsetJump rejoinOffset_;
     Vector<CodeOffset, 4, SystemAllocPolicy> nextCodeOffsets_;
     Maybe<LiveRegisterSet> liveRegs_;
     Maybe<CodeOffset> stubJitCodeOffset_;
     uint32_t nextStubField_;
 
 #ifdef DEBUG
     bool calledPrepareVMCall_;
@@ -95,16 +104,24 @@ class MOZ_RAII IonCacheIRCompiler : publ
         return (T)readStubWord(offset, StubField::Type::RawWord);
     }
     template <typename T>
     T rawInt64StubField(uint32_t offset) {
         static_assert(sizeof(T) == sizeof(int64_t), "T musthave int64 size");
         return (T)readStubInt64(offset, StubField::Type::RawInt64);
     }
 
+    uint64_t* expandoGenerationStubFieldPtr(uint32_t offset) {
+        DebugOnly<uint64_t> generation =
+            readStubInt64(offset, StubField::Type::DOMExpandoGeneration);
+        uint64_t* ptr = reinterpret_cast<uint64_t*>(stub_->stubDataStart() + offset);
+        MOZ_ASSERT(*ptr == generation);
+        return ptr;
+    }
+
     void prepareVMCall(MacroAssembler& masm);
     MOZ_MUST_USE bool callVM(MacroAssembler& masm, const VMFunction& fun);
 
     void pushStubCodePointer() {
         stubJitCodeOffset_.emplace(masm.PushWithPatch(ImmPtr((void*)-1)));
     }
 
 #define DEFINE_OP(op) MOZ_MUST_USE bool emit##op();
@@ -355,17 +372,17 @@ IonCacheIRCompiler::init()
     }
 
     allocator.initAvailableRegs(available);
     allocator.initAvailableRegsAfterSpill();
     return true;
 }
 
 JitCode*
-IonCacheIRCompiler::compile(IonICStub* stub)
+IonCacheIRCompiler::compile()
 {
     masm.setFramePushed(ionScript_->frameSize());
     if (cx_->spsProfiler.enabled())
         masm.enableProfilingInstrumentation();
 
     do {
         switch (reader.readOp()) {
 #define DEFINE_OP(op)                   \
@@ -407,17 +424,17 @@ IonCacheIRCompiler::compile(IonICStub* s
     }
 
     rejoinOffset_.fixup(&masm);
     CodeLocationJump rejoinJump(newStubCode, rejoinOffset_);
     PatchJump(rejoinJump, ic_->rejoinLabel());
 
     for (CodeOffset offset : nextCodeOffsets_) {
         Assembler::PatchDataWithValueCheck(CodeLocationLabel(newStubCode, offset),
-                                           ImmPtr(stub->nextCodeRawPtr()),
+                                           ImmPtr(stub_->nextCodeRawPtr()),
                                            ImmPtr((void*)-1));
     }
     if (stubJitCodeOffset_) {
         Assembler::PatchDataWithValueCheck(CodeLocationLabel(newStubCode, *stubJitCodeOffset_),
                                            ImmPtr(newStubCode.get()),
                                            ImmPtr((void*)-1));
     }
 
@@ -828,16 +845,22 @@ IonCacheIRCompiler::emitStoreFixedSlot()
 
 bool
 IonCacheIRCompiler::emitStoreDynamicSlot()
 {
     MOZ_CRASH("Baseline-specific op");
 }
 
 bool
+IonCacheIRCompiler::emitStoreUnboxedProperty()
+{
+    MOZ_CRASH("Baseline-specific op");
+}
+
+bool
 IonCacheIRCompiler::emitLoadTypedObjectResult()
 {
     AutoOutputRegister output(*this);
     Register obj = allocator.useRegister(masm, reader.objOperandId());
     AutoScratchRegister scratch1(allocator, masm);
     AutoScratchRegister scratch2(allocator, masm);
 
     TypedThingLayout layout = reader.typedThingLayout();
@@ -903,38 +926,41 @@ IonCacheIRCompiler::emitGuardDOMExpandoM
 }
 
 bool
 IonCacheIRCompiler::emitLoadDOMExpandoValueGuardGeneration()
 {
     Register obj = allocator.useRegister(masm, reader.objOperandId());
     ExpandoAndGeneration* expandoAndGeneration =
         rawWordStubField<ExpandoAndGeneration*>(reader.stubOffset());
-    uint64_t generation = rawInt64StubField<uint64_t>(reader.stubOffset());
+    uint64_t* generationFieldPtr = expandoGenerationStubFieldPtr(reader.stubOffset());
 
-    AutoScratchRegister scratch(allocator, masm);
+    AutoScratchRegister scratch1(allocator, masm);
+    AutoScratchRegister scratch2(allocator, masm);
     ValueOperand output = allocator.defineValueRegister(masm, reader.valOperandId());
 
     FailurePath* failure;
     if (!addFailurePath(&failure))
         return false;
 
-    masm.loadPtr(Address(obj, ProxyObject::offsetOfValues()), scratch);
-    Address expandoAddr(scratch, ProxyObject::offsetOfExtraSlotInValues(GetDOMProxyExpandoSlot()));
+    masm.loadPtr(Address(obj, ProxyObject::offsetOfValues()), scratch1);
+    Address expandoAddr(scratch1, ProxyObject::offsetOfExtraSlotInValues(GetDOMProxyExpandoSlot()));
 
     // Guard the ExpandoAndGeneration* matches the proxy's ExpandoAndGeneration.
     masm.loadValue(expandoAddr, output);
     masm.branchTestValue(Assembler::NotEqual, output, PrivateValue(expandoAndGeneration),
                          failure->label());
 
     // Guard expandoAndGeneration->generation matches the expected generation.
     masm.movePtr(ImmPtr(expandoAndGeneration), output.scratchReg());
+    masm.movePtr(ImmPtr(generationFieldPtr), scratch1);
     masm.branch64(Assembler::NotEqual,
                   Address(output.scratchReg(), ExpandoAndGeneration::offsetOfGeneration()),
-                  Imm64(generation),
+                  Address(scratch1, 0),
+                  scratch2,
                   failure->label());
 
     // Load expandoAndGeneration->expando into the output Value register.
     masm.loadValue(Address(output.scratchReg(), ExpandoAndGeneration::offsetOfExpando()), output);
     return true;
 }
 
 bool
@@ -945,21 +971,16 @@ IonIC::attachCacheIRStub(JSContext* cx, 
     AutoAssertNoPendingException aanpe(cx);
     JS::AutoCheckCannotGC nogc;
 
     // Do nothing if the IR generator failed or triggered a GC that invalidated
     // the script.
     if (writer.failed() || !outerScript->hasIonScript())
         return false;
 
-    JitContext jctx(cx, nullptr);
-    IonCacheIRCompiler compiler(cx, writer, this, outerScript->ionScript());
-    if (!compiler.init())
-        return false;
-
     JitZone* jitZone = cx->zone()->jitZone();
     uint32_t stubDataOffset = sizeof(IonICStub);
 
     // Try to reuse a previously-allocated CacheIRStubInfo.
     CacheIRStubKey::Lookup lookup(kind, ICStubEngine::IonIC,
                                   writer.codeStart(), writer.codeLength());
     CacheIRStubInfo* stubInfo = jitZone->getIonCacheIRStubInfo(lookup);
     if (!stubInfo) {
@@ -983,17 +1004,17 @@ IonIC::attachCacheIRStub(JSContext* cx, 
     MOZ_ASSERT(stubInfo);
 
     // Ensure we don't attach duplicate stubs. This can happen if a stub failed
     // for some reason and the IR generator doesn't check for exactly the same
     // conditions.
     for (IonICStub* stub = firstStub_; stub; stub = stub->next()) {
         if (stub->stubInfo() != stubInfo)
             continue;
-        if (!writer.stubDataEquals(stub->stubDataStart()))
+        if (!writer.stubDataEqualsMaybeUpdate(stub->stubDataStart()))
             continue;
         return true;
     }
 
     size_t bytesNeeded = stubInfo->stubDataOffset() + stubInfo->stubDataSize();
 
     // Allocate the IonICStub in the optimized stub space. Ion stubs and
     // CacheIRStubInfo instances for Ion stubs can be purged on GC. That's okay
@@ -1001,18 +1022,22 @@ IonIC::attachCacheIRStub(JSContext* cx, 
     // stub code should never access the IonICStub after making a VM call. The
     // IonICStub::poison method poisons the stub to catch bugs in this area.
     ICStubSpace* stubSpace = cx->zone()->jitZone()->optimizedStubSpace();
     void* newStubMem = stubSpace->alloc(bytesNeeded);
     if (!newStubMem)
         return false;
 
     IonICStub* newStub = new(newStubMem) IonICStub(fallbackLabel_.raw(), stubInfo);
+    writer.copyStubData(newStub->stubDataStart());
 
-    JitCode* code = compiler.compile(newStub);
+    JitContext jctx(cx, nullptr);
+    IonCacheIRCompiler compiler(cx, writer, this, outerScript->ionScript(), newStub);
+    if (!compiler.init())
+        return false;
+
+    JitCode* code = compiler.compile();
     if (!code)
         return false;
 
-    writer.copyStubData(newStub->stubDataStart());
-
     attachStub(newStub, code);
     return true;
 }
--- a/js/src/jit/SharedIC.cpp
+++ b/js/src/jit/SharedIC.cpp
@@ -367,21 +367,16 @@ ICStub::trace(JSTracer* trc)
           case 1: propStub->toImpl<1>()->traceShapes(trc); break;
           case 2: propStub->toImpl<2>()->traceShapes(trc); break;
           case 3: propStub->toImpl<3>()->traceShapes(trc); break;
           case 4: propStub->toImpl<4>()->traceShapes(trc); break;
           default: MOZ_CRASH("Invalid proto stub.");
         }
         break;
       }
-      case ICStub::SetProp_Unboxed: {
-        ICSetProp_Unboxed* propStub = toSetProp_Unboxed();
-        TraceEdge(trc, &propStub->group(), "baseline-setprop-unboxed-stub-group");
-        break;
-      }
       case ICStub::SetProp_TypedObject: {
         ICSetProp_TypedObject* propStub = toSetProp_TypedObject();
         TraceEdge(trc, &propStub->shape(), "baseline-setprop-typedobject-stub-shape");
         TraceEdge(trc, &propStub->group(), "baseline-setprop-typedobject-stub-group");
         break;
       }
       case ICStub::SetProp_CallScripted: {
         ICSetProp_CallScripted* callStub = toSetProp_CallScripted();
--- a/js/src/jit/arm/Assembler-arm.cpp
+++ b/js/src/jit/arm/Assembler-arm.cpp
@@ -166,16 +166,28 @@ ABIArgGenerator::hardNext(MIRType type)
 ABIArg
 ABIArgGenerator::next(MIRType type)
 {
     if (useHardFp_)
         return hardNext(type);
     return softNext(type);
 }
 
+bool
+js::jit::IsUnaligned(const wasm::MemoryAccessDesc& access)
+{
+    if (!access.align())
+        return false;
+
+    if (access.type() == Scalar::Float64 && access.align() >= 4)
+        return false;
+
+    return access.align() < access.byteSize();
+}
+
 // Encode a standard register when it is being used as src1, the dest, and an
 // extra register. These should never be called with an InvalidReg.
 uint32_t
 js::jit::RT(Register r)
 {
     MOZ_ASSERT((r.code() & ~0xf) == 0);
     return r.code() << 12;
 }
--- a/js/src/jit/arm/Assembler-arm.h
+++ b/js/src/jit/arm/Assembler-arm.h
@@ -103,16 +103,18 @@ class ABIArgGenerator
         MOZ_ASSERT(intRegIndex_ == 0 && floatRegIndex_ == 0);
         useHardFp_ = useHardFp;
     }
     ABIArg next(MIRType argType);
     ABIArg& current() { return current_; }
     uint32_t stackBytesConsumedSoFar() const { return stackOffset_; }
 };
 
+bool IsUnaligned(const wasm::MemoryAccessDesc& access);
+
 static constexpr Register ABINonArgReg0 = r4;
 static constexpr Register ABINonArgReg1 = r5;
 static constexpr Register ABINonArgReg2 = r6;
 static constexpr Register ABINonArgReturnReg0 = r4;
 static constexpr Register ABINonArgReturnReg1 = r5;
 
 // TLS pointer argument register for WebAssembly functions. This must not alias
 // any other register used for passing function arguments or return values.
--- a/js/src/jit/arm/Lowering-arm.cpp
+++ b/js/src/jit/arm/Lowering-arm.cpp
@@ -608,17 +608,17 @@ LIRGeneratorARM::visitWasmUnsignedToFloa
 void
 LIRGeneratorARM::visitWasmLoad(MWasmLoad* ins)
 {
     MDefinition* base = ins->base();
     MOZ_ASSERT(base->type() == MIRType::Int32);
 
     LAllocation ptr = useRegisterAtStart(base);
 
-    if (ins->access().isUnaligned()) {
+    if (IsUnaligned(ins->access())) {
         // Unaligned access expected! Revert to a byte load.
         LDefinition ptrCopy = tempCopy(base, 0);
 
         LDefinition noTemp = LDefinition::BogusTemp();
         if (ins->type() == MIRType::Int64) {
             auto* lir = new(alloc()) LWasmUnalignedLoadI64(ptr, ptrCopy, temp(), noTemp, noTemp);
             defineInt64(lir, ins);
             return;
@@ -657,17 +657,17 @@ LIRGeneratorARM::visitWasmLoad(MWasmLoad
 void
 LIRGeneratorARM::visitWasmStore(MWasmStore* ins)
 {
     MDefinition* base = ins->base();
     MOZ_ASSERT(base->type() == MIRType::Int32);
 
     LAllocation ptr = useRegisterAtStart(base);
 
-    if (ins->access().isUnaligned()) {
+    if (IsUnaligned(ins->access())) {
         // Unaligned access expected! Revert to a byte store.
         LDefinition ptrCopy = tempCopy(base, 0);
 
         MIRType valueType = ins->value()->type();
         if (valueType == MIRType::Int64) {
             LInt64Allocation value = useInt64RegisterAtStart(ins->value());
             auto* lir = new(alloc()) LWasmUnalignedStoreI64(ptr, value, ptrCopy, temp());
             add(lir, ins);
--- a/js/src/jit/mips-shared/Assembler-mips-shared.h
+++ b/js/src/jit/mips-shared/Assembler-mips-shared.h
@@ -1519,12 +1519,18 @@ class InstGS : public Instruction
       : Instruction(raw)
     { }
     // For floating-point unaligned loads and stores.
     InstGS(Opcode op, Register rs, FloatRegister rt, Imm8 off, FunctionField ff)
       : Instruction(op | RS(rs) | RT(rt) | off.encode(6) | ff)
     { }
 };
 
+inline bool
+IsUnaligned(const wasm::MemoryAccessDesc& access)
+{
+    return access.align() && access.align() < access.byteSize();
+}
+
 } // namespace jit
 } // namespace js
 
 #endif /* jit_mips_shared_Assembler_mips_shared_h */
--- a/js/src/jit/mips-shared/CodeGenerator-mips-shared.cpp
+++ b/js/src/jit/mips-shared/CodeGenerator-mips-shared.cpp
@@ -1910,17 +1910,17 @@ CodeGeneratorMIPSShared::emitWasmLoad(T*
       case Scalar::Float32: isFloat  = true;  break;
       default: MOZ_CRASH("unexpected array type");
     }
 
     masm.memoryBarrier(mir->access().barrierBefore());
 
     BaseIndex address(HeapReg, ptr, TimesOne);
 
-    if (mir->access().isUnaligned()) {
+    if (IsUnaligned(mir->access())) {
         Register temp = ToRegister(lir->getTemp(1));
 
         if (isFloat) {
             if (byteSize == 4)
                 masm.loadUnalignedFloat32(address, temp, ToFloatRegister(lir->output()));
             else
                 masm.loadUnalignedDouble(address, temp, ToFloatRegister(lir->output()));
         } else {
@@ -1995,17 +1995,17 @@ CodeGeneratorMIPSShared::emitWasmStore(T
       case Scalar::Float32: isFloat  = true;  break;
       default: MOZ_CRASH("unexpected array type");
     }
 
     masm.memoryBarrier(mir->access().barrierBefore());
 
     BaseIndex address(HeapReg, ptr, TimesOne);
 
-    if (mir->access().isUnaligned()) {
+    if (IsUnaligned(mir->access())) {
         Register temp = ToRegister(lir->getTemp(1));
 
         if (isFloat) {
             if (byteSize == 4)
                 masm.storeUnalignedFloat32(ToFloatRegister(lir->value()), temp, address);
             else
                 masm.storeUnalignedDouble(ToFloatRegister(lir->value()), temp, address);
         } else {
--- a/js/src/jit/mips-shared/Lowering-mips-shared.cpp
+++ b/js/src/jit/mips-shared/Lowering-mips-shared.cpp
@@ -319,17 +319,17 @@ LIRGeneratorMIPSShared::visitAsmJSNeg(MA
 void
 LIRGeneratorMIPSShared::visitWasmLoad(MWasmLoad* ins)
 {
     MDefinition* base = ins->base();
     MOZ_ASSERT(base->type() == MIRType::Int32);
 
     LAllocation ptr = useRegisterAtStart(base);
 
-    if (ins->access().isUnaligned()) {
+    if (IsUnaligned(ins->access())) {
         if (ins->type() == MIRType::Int64) {
             auto* lir = new(alloc()) LWasmUnalignedLoadI64(ptr, temp());
             if (ins->access().offset())
                 lir->setTemp(0, tempCopy(base, 0));
 
             defineInt64(lir, ins);
             return;
         }
@@ -362,17 +362,17 @@ void
 LIRGeneratorMIPSShared::visitWasmStore(MWasmStore* ins)
 {
     MDefinition* base = ins->base();
     MOZ_ASSERT(base->type() == MIRType::Int32);
 
     MDefinition* value = ins->value();
     LAllocation baseAlloc = useRegisterAtStart(base);
 
-    if (ins->access().isUnaligned()) {
+    if (IsUnaligned(ins->access())) {
         if (ins->type() == MIRType::Int64) {
             LInt64Allocation valueAlloc = useInt64RegisterAtStart(value);
             auto* lir = new(alloc()) LWasmUnalignedStoreI64(baseAlloc, valueAlloc, temp());
             if (ins->access().offset())
                 lir->setTemp(0, tempCopy(base, 0));
 
             add(lir, ins);
             return;
--- a/js/src/jit/mips32/CodeGenerator-mips32.cpp
+++ b/js/src/jit/mips32/CodeGenerator-mips32.cpp
@@ -485,17 +485,17 @@ CodeGeneratorMIPS::emitWasmLoadI64(T* li
         case Scalar::Uint32: isSigned = false; break;
         case Scalar::Int64:  isSigned = true; break;
         default: MOZ_CRASH("unexpected array type");
     }
 
     masm.memoryBarrier(mir->access().barrierBefore());
 
     MOZ_ASSERT(INT64LOW_OFFSET == 0);
-    if (mir->access().isUnaligned()) {
+    if (IsUnaligned(mir->access())) {
         Register temp = ToRegister(lir->getTemp(1));
 
         if (byteSize <= 4) {
             masm.ma_load_unaligned(output.low, BaseIndex(HeapReg, ptr, TimesOne),
                                    temp, static_cast<LoadStoreSize>(8 * byteSize),
                                    isSigned ? SignExtend : ZeroExtend);
             if (!isSigned)
                 masm.move32(Imm32(0), output.high);
@@ -572,17 +572,17 @@ CodeGeneratorMIPS::emitWasmStoreI64(T* l
         case Scalar::Uint32: isSigned = false; break;
         case Scalar::Int64:  isSigned = true; break;
         default: MOZ_CRASH("unexpected array type");
     }
 
     masm.memoryBarrier(mir->access().barrierBefore());
 
     MOZ_ASSERT(INT64LOW_OFFSET == 0);
-    if (mir->access().isUnaligned()) {
+    if (IsUnaligned(mir->access())) {
         Register temp = ToRegister(lir->getTemp(1));
 
         if (byteSize <= 4) {
             masm.ma_store_unaligned(value.low, BaseIndex(HeapReg, ptr, TimesOne),
                                     temp, static_cast<LoadStoreSize>(8 * byteSize),
                                     isSigned ? SignExtend : ZeroExtend);
         } else {
             ScratchRegisterScope scratch(masm);
--- a/js/src/jit/mips64/CodeGenerator-mips64.cpp
+++ b/js/src/jit/mips64/CodeGenerator-mips64.cpp
@@ -444,17 +444,17 @@ CodeGeneratorMIPS64::emitWasmLoadI64(T* 
       case Scalar::Int32:   isSigned = true;  break;
       case Scalar::Uint32:  isSigned = false; break;
       case Scalar::Int64:   isSigned = true;  break;
       default: MOZ_CRASH("unexpected array type");
     }
 
     masm.memoryBarrier(mir->access().barrierBefore());
 
-    if (mir->access().isUnaligned()) {
+    if (IsUnaligned(mir->access())) {
         Register temp = ToRegister(lir->getTemp(1));
 
         masm.ma_load_unaligned(ToOutRegister64(lir).reg, BaseIndex(HeapReg, ptr, TimesOne),
                                temp, static_cast<LoadStoreSize>(8 * byteSize),
                                isSigned ? SignExtend : ZeroExtend);
         return;
     }
 
@@ -509,17 +509,17 @@ CodeGeneratorMIPS64::emitWasmStoreI64(T*
       case Scalar::Int32:   isSigned = true;  break;
       case Scalar::Uint32:  isSigned = false; break;
       case Scalar::Int64:   isSigned = true;  break;
       default: MOZ_CRASH("unexpected array type");
     }
 
     masm.memoryBarrier(mir->access().barrierBefore());
 
-    if (mir->access().isUnaligned()) {
+    if (IsUnaligned(mir->access())) {
         Register temp = ToRegister(lir->getTemp(1));
 
         masm.ma_store_unaligned(ToRegister64(lir->value()).reg, BaseIndex(HeapReg, ptr, TimesOne),
                                 temp, static_cast<LoadStoreSize>(8 * byteSize),
                                 isSigned ? SignExtend : ZeroExtend);
         return;
     }
     masm.ma_store(ToRegister64(lir->value()).reg, BaseIndex(HeapReg, ptr, TimesOne),
--- a/js/src/jit/shared/Assembler-shared.h
+++ b/js/src/jit/shared/Assembler-shared.h
@@ -724,17 +724,16 @@ class MemoryAccessDesc
     }
     unsigned numSimdElems() const { MOZ_ASSERT(isSimd()); return numSimdElems_; }
     jit::MemoryBarrierBits barrierBefore() const { return barrierBefore_; }
     jit::MemoryBarrierBits barrierAfter() const { return barrierAfter_; }
     bool hasTrap() const { return !!trapOffset_; }
     TrapOffset trapOffset() const { return *trapOffset_; }
     bool isAtomic() const { return (barrierBefore_ | barrierAfter_) != jit::MembarNobits; }
     bool isSimd() const { return Scalar::isSimdType(type_); }
-    bool isUnaligned() const { return align() && align() < byteSize(); }
     bool isPlainAsmJS() const { return !hasTrap(); }
 
     void clearOffset() { offset_ = 0; }
 };
 
 // Summarizes a global access for a mutable (in asm.js) or immutable value (in
 // asm.js or the wasm MVP) that needs to get patched later.
 
--- a/js/src/shell/js.cpp
+++ b/js/src/shell/js.cpp
@@ -141,20 +141,20 @@ static const size_t gMaxStackSize = 128 
 #endif
 
 /*
  * Limit the timeout to 30 minutes to prevent an overflow on platfoms
  * that represent the time internally in microseconds using 32-bit int.
  */
 static const TimeDuration MAX_TIMEOUT_INTERVAL = TimeDuration::FromSeconds(1800.0);
 
-#ifdef NIGHTLY_BUILD
+#ifdef RELEASE_OR_BETA
+# define SHARED_MEMORY_DEFAULT 0
+#else
 # define SHARED_MEMORY_DEFAULT 1
-#else
-# define SHARED_MEMORY_DEFAULT 0
 #endif
 
 using JobQueue = GCVector<JSObject*, 0, SystemAllocPolicy>;
 
 struct ShellAsyncTasks
 {
     explicit ShellAsyncTasks(JSContext* cx)
       : outstanding(0),
--- a/js/src/tests/js1_8_5/extensions/dataview.js
+++ b/js/src/tests/js1_8_5/extensions/dataview.js
@@ -1644,9 +1644,11 @@ function test(sharedMem) {
     dv = 1;
     gc();
 
     reportCompare(0, 0, 'done.');
     exitFunc ('test');
 }
 
 test(false);
-test(true);
+
+if (this.SharedArrayBuffer)
+    test(true);
--- a/js/src/wasm/WasmBaselineCompile.cpp
+++ b/js/src/wasm/WasmBaselineCompile.cpp
@@ -3394,17 +3394,17 @@ class BaseCompiler
                              trap(Trap::OutOfBounds));
             access->clearOffset();
         }
     }
 
     // This is the temp register passed as the last argument to load()
     MOZ_MUST_USE size_t loadTemps(MemoryAccessDesc& access) {
 #if defined(JS_CODEGEN_ARM)
-        if (access.isUnaligned()) {
+        if (IsUnaligned(access)) {
             switch (access.type()) {
               case Scalar::Float32:
                 return 2;
               case Scalar::Float64:
                 return 3;
               default:
                 return 1;
             }
@@ -3455,17 +3455,17 @@ class BaseCompiler
             AnyRegister out = byteRegConflict ? AnyRegister(ScratchRegX86) : dest.any();
 
             masm.wasmLoad(access, srcAddr, out);
 
             if (byteRegConflict)
                 masm.mov(ScratchRegX86, dest.i32());
         }
 #elif defined(JS_CODEGEN_ARM)
-        if (access.isUnaligned()) {
+        if (IsUnaligned(access)) {
             switch (dest.tag) {
               case AnyReg::I64:
                 masm.wasmUnalignedLoadI64(access, ptr, ptr, dest.i64(), tmp1);
                 break;
               case AnyReg::F32:
                 masm.wasmUnalignedLoadFP(access, ptr, ptr, dest.f32(), tmp1, tmp2, Register::Invalid());
                 break;
               case AnyReg::F64:
@@ -3487,17 +3487,17 @@ class BaseCompiler
 
         if (ool)
             masm.bind(ool->rejoin());
         return true;
     }
 
     MOZ_MUST_USE size_t storeTemps(MemoryAccessDesc& access) {
 #if defined(JS_CODEGEN_ARM)
-        if (access.isUnaligned()) {
+        if (IsUnaligned(access)) {
             // See comment in store() about how this temp could be avoided for
             // unaligned i8/i16/i32 stores with some restructuring elsewhere.
             return 1;
         }
 #endif
         return 0;
     }
 
@@ -3542,17 +3542,17 @@ class BaseCompiler
                 value = AnyRegister(ScratchRegX86);
             } else {
                 value = src.any();
             }
 
             masm.wasmStore(access, value, dstAddr);
         }
 #elif defined(JS_CODEGEN_ARM)
-        if (access.isUnaligned()) {
+        if (IsUnaligned(access)) {
             // TODO / OPTIMIZE (bug 1331264): We perform the copy on the i32
             // path (and allocate the temp for the copy) because we will destroy
             // the value in the temp.  We could avoid the copy and the temp if
             // the caller would instead preserve src when it needs to return its
             // value as a result (for teeStore).  If unaligned accesses are
             // common it will be worthwhile to make that change, but there's no
             // evidence yet that they will be common.
             switch (src.tag) {
@@ -6510,17 +6510,17 @@ BaseCompiler::emitLoad(ValType type, Sca
     RegI32 tmp1 = temps >= 1 ? needI32() : invalidI32();
     RegI32 tmp2 = temps >= 2 ? needI32() : invalidI32();
     RegI32 tmp3 = temps >= 3 ? needI32() : invalidI32();
 
     switch (type) {
       case ValType::I32: {
         RegI32 rp = popMemoryAccess(&access, &omitBoundsCheck);
 #ifdef JS_CODEGEN_ARM
-        RegI32 rv = access.isUnaligned() ? needI32() : rp;
+        RegI32 rv = IsUnaligned(access) ? needI32() : rp;
 #else
         RegI32 rv = rp;
 #endif
         if (!load(access, rp, omitBoundsCheck, AnyReg(rv), tmp1, tmp2, tmp3))
             return false;
         pushI32(rv);
         if (rp != rv)
             freeI32(rp);
--- a/layout/base/PresShell.cpp
+++ b/layout/base/PresShell.cpp
@@ -7252,35 +7252,41 @@ PresShell::HandleEvent(nsIFrame* aFrame,
       NS_WARNING("Nothing to handle this event!");
       return NS_OK;
     }
 
     nsPresContext* framePresContext = frame->PresContext();
     nsPresContext* rootPresContext = framePresContext->GetRootPresContext();
     NS_ASSERTION(rootPresContext == mPresContext->GetRootPresContext(),
                  "How did we end up outside the connected prescontext/viewmanager hierarchy?");
-    // If we aren't starting our event dispatch from the root frame of the root prescontext,
-    // then someone must be capturing the mouse. In that case we don't want to search the popup
-    // list.
-    if (framePresContext == rootPresContext &&
-        frame == mFrameConstructor->GetRootFrame()) {
-      nsIFrame* popupFrame =
-        nsLayoutUtils::GetPopupFrameForEventCoordinates(rootPresContext, aEvent);
-      // If a remote browser is currently capturing input break out if we
-      // detect a chrome generated popup.
-      if (popupFrame && capturingContent &&
-          EventStateManager::IsRemoteTarget(capturingContent)) {
-        capturingContent = nullptr;
-      }
-      // If the popupFrame is an ancestor of the 'frame', the frame should
-      // handle the event, otherwise, the popup should handle it.
-      if (popupFrame &&
-          !nsContentUtils::ContentIsCrossDocDescendantOf(
-             framePresContext->GetPresShell()->GetDocument(),
-             popupFrame->GetContent())) {
+    nsIFrame* popupFrame =
+      nsLayoutUtils::GetPopupFrameForEventCoordinates(rootPresContext, aEvent);
+    // If a remote browser is currently capturing input break out if we
+    // detect a chrome generated popup.
+    if (popupFrame && capturingContent &&
+        EventStateManager::IsRemoteTarget(capturingContent)) {
+      capturingContent = nullptr;
+    }
+    // If the popupFrame is an ancestor of the 'frame', the frame should
+    // handle the event, otherwise, the popup should handle it.
+    if (popupFrame &&
+        !nsContentUtils::ContentIsCrossDocDescendantOf(
+           framePresContext->GetPresShell()->GetDocument(),
+           popupFrame->GetContent())) {
+
+      // If we aren't starting our event dispatch from the root frame of the
+      // root prescontext, then someone must be capturing the mouse. In that
+      // case we only want to use the popup list if the capture is
+      // inside the popup.
+      if (framePresContext == rootPresContext &&
+          frame == mFrameConstructor->GetRootFrame()) {
+        frame = popupFrame;
+      } else if (capturingContent &&
+                 nsContentUtils::ContentIsDescendantOf(
+                   capturingContent, popupFrame->GetContent())) {
         frame = popupFrame;
       }
     }
 
     bool captureRetarget = false;
     if (capturingContent) {
       // If a capture is active, determine if the docshell is visible. If not,
       // clear the capture and target the mouse event normally instead. This
--- a/layout/style/nsMediaFeatures.cpp
+++ b/layout/style/nsMediaFeatures.cpp
@@ -85,34 +85,32 @@ GetSize(nsPresContext* aPresContext)
   if (aPresContext->IsRootPaginatedDocument())
     // We want the page size, including unprintable areas and margins.
     size = aPresContext->GetPageSize();
   else
     size = aPresContext->GetVisibleArea().Size();
   return size;
 }
 
-static nsresult
+static void
 GetWidth(nsPresContext* aPresContext, const nsMediaFeature*,
          nsCSSValue& aResult)
 {
   nsSize size = GetSize(aPresContext);
   float pixelWidth = aPresContext->AppUnitsToFloatCSSPixels(size.width);
   aResult.SetFloatValue(pixelWidth, eCSSUnit_Pixel);
-  return NS_OK;
 }
 
-static nsresult
+static void
 GetHeight(nsPresContext* aPresContext, const nsMediaFeature*,
           nsCSSValue& aResult)
 {
   nsSize size = GetSize(aPresContext);
   float pixelHeight = aPresContext->AppUnitsToFloatCSSPixels(size.height);
   aResult.SetFloatValue(pixelHeight, eCSSUnit_Pixel);
-  return NS_OK;
 }
 
 inline static nsDeviceContext*
 GetDeviceContextFor(nsPresContext* aPresContext)
 {
   // It would be nice to call
   // nsLayoutUtils::GetDeviceContextForScreenInfo here, except for two
   // things:  (1) it can flush, and flushing is bad here, and (2) it
@@ -142,107 +140,101 @@ GetDeviceSize(nsPresContext* aPresContex
     size = aPresContext->GetPageSize();
   } else {
     GetDeviceContextFor(aPresContext)->
       GetDeviceSurfaceDimensions(size.width, size.height);
   }
   return size;
 }
 
-static nsresult
+static void
 GetDeviceWidth(nsPresContext* aPresContext, const nsMediaFeature*,
                nsCSSValue& aResult)
 {
   nsSize size = GetDeviceSize(aPresContext);
   float pixelWidth = aPresContext->AppUnitsToFloatCSSPixels(size.width);
   aResult.SetFloatValue(pixelWidth, eCSSUnit_Pixel);
-  return NS_OK;
 }
 
-static nsresult
+static void
 GetDeviceHeight(nsPresContext* aPresContext, const nsMediaFeature*,
                 nsCSSValue& aResult)
 {
   nsSize size = GetDeviceSize(aPresContext);
   float pixelHeight = aPresContext->AppUnitsToFloatCSSPixels(size.height);
   aResult.SetFloatValue(pixelHeight, eCSSUnit_Pixel);
-  return NS_OK;
 }
 
-static nsresult
+static void
 GetOrientation(nsPresContext* aPresContext, const nsMediaFeature*,
                nsCSSValue& aResult)
 {
   nsSize size = GetSize(aPresContext);
   int32_t orientation;
   if (size.width > size.height) {
     orientation = NS_STYLE_ORIENTATION_LANDSCAPE;
   } else {
     // Per spec, square viewports should be 'portrait'
     orientation = NS_STYLE_ORIENTATION_PORTRAIT;
   }
 
   aResult.SetIntValue(orientation, eCSSUnit_Enumerated);
-  return NS_OK;
 }
 
-static nsresult
+static void
 GetDeviceOrientation(nsPresContext* aPresContext, const nsMediaFeature*,
                      nsCSSValue& aResult)
 {
   nsSize size = GetDeviceSize(aPresContext);
   int32_t orientation;
   if (size.width > size.height) {
     orientation = NS_STYLE_ORIENTATION_LANDSCAPE;
   } else {
     // Per spec, square viewports should be 'portrait'
     orientation = NS_STYLE_ORIENTATION_PORTRAIT;
   }
 
   aResult.SetIntValue(orientation, eCSSUnit_Enumerated);
-  return NS_OK;
 }
 
-static nsresult
+static void
 GetIsResourceDocument(nsPresContext* aPresContext, const nsMediaFeature*,
                       nsCSSValue& aResult)
 {
   nsIDocument* doc = aPresContext->Document();
   aResult.SetIntValue(doc && doc->IsResourceDoc() ? 1 : 0, eCSSUnit_Integer);
-  return NS_OK;
 }
 
 // Helper for two features below
-static nsresult
+static void
 MakeArray(const nsSize& aSize, nsCSSValue& aResult)
 {
   RefPtr<nsCSSValue::Array> a = nsCSSValue::Array::Create(2);
 
   a->Item(0).SetIntValue(aSize.width, eCSSUnit_Integer);
   a->Item(1).SetIntValue(aSize.height, eCSSUnit_Integer);
 
   aResult.SetArrayValue(a, eCSSUnit_Array);
-  return NS_OK;
 }
 
-static nsresult
+static void
 GetAspectRatio(nsPresContext* aPresContext, const nsMediaFeature*,
                nsCSSValue& aResult)
 {
-  return MakeArray(GetSize(aPresContext), aResult);
+  MakeArray(GetSize(aPresContext), aResult);
 }
 
-static nsresult
+static void
 GetDeviceAspectRatio(nsPresContext* aPresContext, const nsMediaFeature*,
                      nsCSSValue& aResult)
 {
-  return MakeArray(GetDeviceSize(aPresContext), aResult);
+  MakeArray(GetDeviceSize(aPresContext), aResult);
 }
 
-static nsresult
+static void
 GetColor(nsPresContext* aPresContext, const nsMediaFeature*,
          nsCSSValue& aResult)
 {
   uint32_t depth = 24; // Use depth of 24 when resisting fingerprinting.
 
   if (!ShouldResistFingerprinting(aPresContext)) {
     // FIXME:  This implementation is bogus.  nsDeviceContext
     // doesn't provide reliable information (should be fixed in bug
@@ -252,81 +244,76 @@ GetColor(nsPresContext* aPresContext, co
     dx->GetDepth(depth);
   }
 
   // The spec says to use bits *per color component*, so divide by 3,
   // and round down, since the spec says to use the smallest when the
   // color components differ.
   depth /= 3;
   aResult.SetIntValue(int32_t(depth), eCSSUnit_Integer);
-  return NS_OK;
 }
 
-static nsresult
+static void
 GetColorIndex(nsPresContext* aPresContext, const nsMediaFeature*,
               nsCSSValue& aResult)
 {
   // We should return zero if the device does not use a color lookup
   // table.  Stuart says that our handling of displays with 8-bit
   // color is bad enough that we never change the lookup table to
   // match what we're trying to display, so perhaps we should always
   // return zero.  Given that there isn't any better information
   // exposed, we don't have much other choice.
   aResult.SetIntValue(0, eCSSUnit_Integer);
-  return NS_OK;
 }
 
-static nsresult
+static void
 GetMonochrome(nsPresContext* aPresContext, const nsMediaFeature*,
               nsCSSValue& aResult)
 {
   // For color devices we should return 0.
   // FIXME: On a monochrome device, return the actual color depth, not
   // 0!
   aResult.SetIntValue(0, eCSSUnit_Integer);
-  return NS_OK;
 }
 
-static nsresult
+static void
 GetResolution(nsPresContext* aPresContext, const nsMediaFeature*,
               nsCSSValue& aResult)
 {
   float dpi = 96; // Use 96 when resisting fingerprinting.
 
   if (!ShouldResistFingerprinting(aPresContext)) {
     // Resolution measures device pixels per CSS (inch/cm/pixel).  We
     // return it in device pixels per CSS inches.
     dpi = float(nsPresContext::AppUnitsPerCSSInch()) /
           float(aPresContext->AppUnitsPerDevPixel());
   }
 
   aResult.SetFloatValue(dpi, eCSSUnit_Inch);
-  return NS_OK;
 }
 
-static nsresult
+static void
 GetScan(nsPresContext* aPresContext, const nsMediaFeature*,
         nsCSSValue& aResult)
 {
   // Since Gecko doesn't support the 'tv' media type, the 'scan'
   // feature is never present.
   aResult.Reset();
-  return NS_OK;
 }
 
-static nsresult
+static void
 GetDisplayMode(nsPresContext* aPresContext, const nsMediaFeature*,
                nsCSSValue& aResult)
 {
   nsCOMPtr<nsISupports> container = aPresContext->GetRootPresContext()->
     Document()->GetContainer();
   nsCOMPtr<nsIBaseWindow> baseWindow = do_QueryInterface(container);
   if (!baseWindow) {
     aResult.SetIntValue(NS_STYLE_DISPLAY_MODE_BROWSER, eCSSUnit_Enumerated);
-    return NS_OK;
+    return;
   }
   nsCOMPtr<nsIWidget> mainWidget;
   baseWindow->GetMainWidget(getter_AddRefs(mainWidget));
   int32_t displayMode;
   nsSizeMode mode = mainWidget ? mainWidget->SizeMode() : nsSizeMode_Normal;
   // Background tabs are always in 'browser' mode for now.
   // If new modes are supported, please ensure not cause the regression in
   // Bug 1259641.
@@ -335,131 +322,123 @@ GetDisplayMode(nsPresContext* aPresConte
       displayMode = NS_STYLE_DISPLAY_MODE_FULLSCREEN;
       break;
     default:
       displayMode = NS_STYLE_DISPLAY_MODE_BROWSER;
       break;
   }
 
   aResult.SetIntValue(displayMode, eCSSUnit_Enumerated);
-  return NS_OK;
 }
 
-static nsresult
+static void
 GetGrid(nsPresContext* aPresContext, const nsMediaFeature*,
         nsCSSValue& aResult)
 {
   // Gecko doesn't support grid devices (e.g., ttys), so the 'grid'
   // feature is always 0.
   aResult.SetIntValue(0, eCSSUnit_Integer);
-  return NS_OK;
 }
 
-static nsresult
+static void
 GetDevicePixelRatio(nsPresContext* aPresContext, const nsMediaFeature*,
                     nsCSSValue& aResult)
 {
   if (!ShouldResistFingerprinting(aPresContext)) {
     float ratio = aPresContext->CSSPixelsToDevPixels(1.0f);
     aResult.SetFloatValue(ratio, eCSSUnit_Number);
   } else {
     aResult.SetFloatValue(1.0, eCSSUnit_Number);
   }
-  return NS_OK;
 }
 
-static nsresult
+static void
 GetTransform3d(nsPresContext* aPresContext, const nsMediaFeature*,
                nsCSSValue& aResult)
 {
   // Gecko supports 3d transforms, so this feature is always 1.
   aResult.SetIntValue(1, eCSSUnit_Integer);
-  return NS_OK;
 }
 
-static nsresult
+static void
 GetSystemMetric(nsPresContext* aPresContext, const nsMediaFeature* aFeature,
                 nsCSSValue& aResult)
 {
   aResult.Reset();
   if (ShouldResistFingerprinting(aPresContext)) {
     // If "privacy.resistFingerprinting" is enabled, then we simply don't
     // return any system-backed media feature values. (No spoofed values returned.)
-    return NS_OK;
+    return;
   }
 
   MOZ_ASSERT(aFeature->mValueType == nsMediaFeature::eBoolInteger,
              "unexpected type");
   nsIAtom *metricAtom = *aFeature->mData.mMetric;
   bool hasMetric = nsCSSRuleProcessor::HasSystemMetric(metricAtom);
   aResult.SetIntValue(hasMetric ? 1 : 0, eCSSUnit_Integer);
-  return NS_OK;
 }
 
-static nsresult
+static void
 GetWindowsTheme(nsPresContext* aPresContext, const nsMediaFeature* aFeature,
                 nsCSSValue& aResult)
 {
   aResult.Reset();
   if (ShouldResistFingerprinting(aPresContext)) {
-    return NS_OK;
+    return;
   }
 
 #ifdef XP_WIN
   uint8_t windowsThemeId =
     nsCSSRuleProcessor::GetWindowsThemeIdentifier();
 
   // Classic mode should fail to match.
   if (windowsThemeId == LookAndFeel::eWindowsTheme_Classic)
-    return NS_OK;
+    return;
 
   // Look up the appropriate theme string
   for (size_t i = 0; i < ArrayLength(themeStrings); ++i) {
     if (windowsThemeId == themeStrings[i].id) {
       aResult.SetStringValue(nsDependentString(themeStrings[i].name),
                              eCSSUnit_Ident);
       break;
     }
   }
 #endif
-  return NS_OK;
 }
 
-static nsresult
+static void
 GetOperatingSystemVersion(nsPresContext* aPresContext, const nsMediaFeature* aFeature,
                          nsCSSValue& aResult)
 {
   aResult.Reset();
   if (ShouldResistFingerprinting(aPresContext)) {
-    return NS_OK;
+    return;
   }
 
 #ifdef XP_WIN
   int32_t metricResult;
   if (NS_SUCCEEDED(
         LookAndFeel::GetInt(LookAndFeel::eIntID_OperatingSystemVersionIdentifier,
                             &metricResult))) {
     for (size_t i = 0; i < ArrayLength(osVersionStrings); ++i) {
       if (metricResult == osVersionStrings[i].id) {
         aResult.SetStringValue(nsDependentString(osVersionStrings[i].name),
                                eCSSUnit_Ident);
         break;
       }
     }
   }
 #endif
-  return NS_OK;
 }
 
-static nsresult
+static void
 GetIsGlyph(nsPresContext* aPresContext, const nsMediaFeature* aFeature,
           nsCSSValue& aResult)
 {
   aResult.SetIntValue(aPresContext->IsGlyph() ? 1 : 0, eCSSUnit_Integer);
-  return NS_OK;
 }
 
 /*
  * Adding new media features requires (1) adding the new feature to this
  * array, with appropriate entries (and potentially any new code needed
  * to support new types in these entries and (2) ensuring that either
  * nsPresContext::MediaFeatureValuesChanged or
  * nsPresContext::PostMediaFeatureValuesChangedEvent is called when the
--- a/layout/style/nsMediaFeatures.h
+++ b/layout/style/nsMediaFeatures.h
@@ -11,20 +11,19 @@
 
 #include "nsCSSProps.h"
 
 class nsIAtom;
 class nsPresContext;
 class nsCSSValue;
 
 struct nsMediaFeature;
-typedef nsresult
-(* nsMediaFeatureValueGetter)(nsPresContext* aPresContext,
-                              const nsMediaFeature* aFeature,
-                              nsCSSValue& aResult);
+typedef void (*nsMediaFeatureValueGetter)(nsPresContext* aPresContext,
+                                          const nsMediaFeature* aFeature,
+                                          nsCSSValue& aResult);
 
 struct nsMediaFeature
 {
   nsIAtom **mName; // extra indirection to point to nsGkAtoms members
 
   enum RangeType { eMinMaxAllowed, eMinMaxNotAllowed };
   RangeType mRangeType;
 
--- a/layout/style/nsMediaList.cpp
+++ b/layout/style/nsMediaList.cpp
@@ -212,19 +212,18 @@ nsMediaQueryResultCacheKey::Matches(nsPr
 {
   if (aPresContext->Medium() != mMedium) {
     return false;
   }
 
   for (uint32_t i = 0; i < mFeatureCache.Length(); ++i) {
     const FeatureEntry *entry = &mFeatureCache[i];
     nsCSSValue actual;
-    nsresult rv =
-      (entry->mFeature->mGetter)(aPresContext, entry->mFeature, actual);
-    NS_ENSURE_SUCCESS(rv, false); // any better ideas?
+
+    entry->mFeature->mGetter(aPresContext, entry->mFeature, actual);
 
     for (uint32_t j = 0; j < entry->mExpressions.Length(); ++j) {
       const ExpressionEntry &eentry = entry->mExpressions[j];
       if (eentry.mExpression.Matches(aPresContext, actual) !=
           eentry.mExpressionMatches) {
         return false;
       }
     }
@@ -474,19 +473,17 @@ nsMediaQuery::Matches(nsPresContext* aPr
   if (mHadUnknownExpression)
     return false;
 
   bool match =
     mMediaType == aPresContext->Medium() || mMediaType == nsGkAtoms::all;
   for (uint32_t i = 0, i_end = mExpressions.Length(); match && i < i_end; ++i) {
     const nsMediaExpression &expr = mExpressions[i];
     nsCSSValue actual;
-    nsresult rv =
-      (expr.mFeature->mGetter)(aPresContext, expr.mFeature, actual);
-    NS_ENSURE_SUCCESS(rv, false); // any better ideas?
+    expr.mFeature->mGetter(aPresContext, expr.mFeature, actual);
 
     match = expr.Matches(aPresContext, actual);
     if (aKey) {
       aKey->AddExpression(&expr, match);
     }
   }
 
   return match == !mNegated;
--- a/layout/xul/nsXULTooltipListener.cpp
+++ b/layout/xul/nsXULTooltipListener.cpp
@@ -24,16 +24,17 @@
 #endif
 #include "nsIRootBox.h"
 #include "nsIBoxObject.h"
 #include "mozilla/Preferences.h"
 #include "mozilla/LookAndFeel.h"
 #include "mozilla/dom/Element.h"
 #include "mozilla/dom/Event.h" // for nsIDOMEvent::InternalDOMEvent()
 #include "mozilla/dom/BoxObject.h"
+#include "mozilla/TextEvents.h"
 
 using namespace mozilla;
 using namespace mozilla::dom;
 
 nsXULTooltipListener* nsXULTooltipListener::mInstance = nullptr;
 
 //////////////////////////////////////////////////////////////////////////
 //// nsISupports
@@ -222,24 +223,33 @@ nsXULTooltipListener::MouseMove(nsIDOMEv
 }
 
 NS_IMETHODIMP
 nsXULTooltipListener::HandleEvent(nsIDOMEvent* aEvent)
 {
   nsAutoString type;
   aEvent->GetType(type);
   if (type.EqualsLiteral("DOMMouseScroll") ||
-      type.EqualsLiteral("keydown") ||
       type.EqualsLiteral("mousedown") ||
       type.EqualsLiteral("mouseup") ||
       type.EqualsLiteral("dragstart")) {
     HideTooltip();
     return NS_OK;
   }
 
+  if (type.EqualsLiteral("keydown")) {
+    // Hide the tooltip if a non-modifier key is pressed.
+    WidgetKeyboardEvent* keyEvent = aEvent->WidgetEventPtr()->AsKeyboardEvent();
+    if (!keyEvent->IsModifierKeyEvent()) {
+      HideTooltip();
+    }
+
+    return NS_OK;
+  }
+
   if (type.EqualsLiteral("popuphiding")) {
     DestroyTooltip();
     return NS_OK;
   }
 
   // Note that mousemove, mouseover and mouseout might be
   // fired even during dragging due to widget's bug.
   nsCOMPtr<nsIDragService> dragService =
@@ -425,18 +435,21 @@ nsXULTooltipListener::ShowTooltip()
         // AddSystemEventListener(), the event target sets it to TRUE if the
         // target is in content.
         doc->AddSystemEventListener(NS_LITERAL_STRING("DOMMouseScroll"),
                                     this, true);
         doc->AddSystemEventListener(NS_LITERAL_STRING("mousedown"),
                                     this, true);
         doc->AddSystemEventListener(NS_LITERAL_STRING("mouseup"),
                                     this, true);
+#ifndef XP_WIN
+        // On Windows, key events don't close tooltips.
         doc->AddSystemEventListener(NS_LITERAL_STRING("keydown"),
                                     this, true);
+#endif
       }
       mSourceNode = nullptr;
     }
   }
 
   return NS_OK;
 }
 
@@ -664,17 +677,19 @@ nsXULTooltipListener::DestroyTooltip()
     nsCOMPtr<nsIDocument> doc = currentTooltip->GetComposedDoc();
     if (doc) {
       // remove the mousedown and keydown listener from document
       doc->RemoveSystemEventListener(NS_LITERAL_STRING("DOMMouseScroll"), this,
                                      true);
       doc->RemoveSystemEventListener(NS_LITERAL_STRING("mousedown"), this,
                                      true);
       doc->RemoveSystemEventListener(NS_LITERAL_STRING("mouseup"), this, true);
+#ifndef XP_WIN
       doc->RemoveSystemEventListener(NS_LITERAL_STRING("keydown"), this, true);
+#endif
     }
 
     // remove the popuphidden listener from tooltip
     currentTooltip->RemoveSystemEventListener(NS_LITERAL_STRING("popuphiding"), this, false);
   }
 
   // kill any ongoing timers
   KillTooltipTimer();
--- a/media/libvpx/config/generic/vpx_config.asm
+++ b/media/libvpx/config/generic/vpx_config.asm
@@ -51,17 +51,17 @@
 .equ CONFIG_VP8 ,  1
 .equ CONFIG_VP9 ,  1
 .equ CONFIG_ENCODERS ,  1
 .equ CONFIG_DECODERS ,  1
 .equ CONFIG_STATIC_MSVCRT ,  0
 .equ CONFIG_SPATIAL_RESAMPLING ,  1
 .equ CONFIG_REALTIME_ONLY ,  0
 .equ CONFIG_ONTHEFLY_BITPACKING ,  0
-.equ CONFIG_ERROR_CONCEALMENT ,  1
+.equ CONFIG_ERROR_CONCEALMENT ,  0
 .equ CONFIG_SHARED ,  0
 .equ CONFIG_STATIC ,  1
 .equ CONFIG_SMALL ,  0
 .equ CONFIG_POSTPROC_VISUALIZER ,  0
 .equ CONFIG_OS_SUPPORT ,  1
 .equ CONFIG_UNIT_TESTS ,  0
 .equ CONFIG_WEBM_IO ,  1
 .equ CONFIG_LIBYUV ,  1
--- a/media/libvpx/config/generic/vpx_config.c
+++ b/media/libvpx/config/generic/vpx_config.c
@@ -1,10 +1,10 @@
 /* Copyright (c) 2011 The WebM 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 in the root of the source */
 /* tree. An additional intellectual property rights grant can be found */
 /* in the file PATENTS.  All contributing project authors may */
 /* be found in the AUTHORS file in the root of the source tree. */
 #include "vpx/vpx_codec.h"
-static const char* const cfg = "--target=generic-gnu --enable-external-build --disable-examples --disable-install-docs --disable-unit-tests --enable-multi-res-encoding --size-limit=8192x4608 --enable-pic --enable-error-concealment";
+static const char* const cfg = "--target=generic-gnu --enable-external-build --disable-examples --disable-install-docs --disable-unit-tests --enable-multi-res-encoding --size-limit=8192x4608 --enable-pic";
 const char *vpx_codec_build_config(void) {return cfg;}
--- a/media/libvpx/config/generic/vpx_config.h
+++ b/media/libvpx/config/generic/vpx_config.h
@@ -60,17 +60,17 @@
 #define CONFIG_VP8 1
 #define CONFIG_VP9 1
 #define CONFIG_ENCODERS 1
 #define CONFIG_DECODERS 1
 #define CONFIG_STATIC_MSVCRT 0
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_REALTIME_ONLY 0
 #define CONFIG_ONTHEFLY_BITPACKING 0
-#define CONFIG_ERROR_CONCEALMENT 1
+#define CONFIG_ERROR_CONCEALMENT 0
 #define CONFIG_SHARED 0
 #define CONFIG_STATIC 1
 #define CONFIG_SMALL 0
 #define CONFIG_POSTPROC_VISUALIZER 0
 #define CONFIG_OS_SUPPORT 1
 #define CONFIG_UNIT_TESTS 0
 #define CONFIG_WEBM_IO 1
 #define CONFIG_LIBYUV 1
--- a/media/libvpx/config/linux/arm/vpx_config.asm
+++ b/media/libvpx/config/linux/arm/vpx_config.asm
@@ -51,17 +51,17 @@
 .equ CONFIG_VP8 ,  1
 .equ CONFIG_VP9 ,  1
 .equ CONFIG_ENCODERS ,  1
 .equ CONFIG_DECODERS ,  1
 .equ CONFIG_STATIC_MSVCRT ,  0
 .equ CONFIG_SPATIAL_RESAMPLING ,  1
 .equ CONFIG_REALTIME_ONLY ,  1
 .equ CONFIG_ONTHEFLY_BITPACKING ,  0
-.equ CONFIG_ERROR_CONCEALMENT ,  1
+.equ CONFIG_ERROR_CONCEALMENT ,  0
 .equ CONFIG_SHARED ,  0
 .equ CONFIG_STATIC ,  1
 .equ CONFIG_SMALL ,  0
 .equ CONFIG_POSTPROC_VISUALIZER ,  0
 .equ CONFIG_OS_SUPPORT ,  1
 .equ CONFIG_UNIT_TESTS ,  0
 .equ CONFIG_WEBM_IO ,  1
 .equ CONFIG_LIBYUV ,  1
--- a/media/libvpx/config/linux/arm/vpx_config.c
+++ b/media/libvpx/config/linux/arm/vpx_config.c
@@ -1,10 +1,10 @@
 /* Copyright (c) 2011 The WebM 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 in the root of the source */
 /* tree. An additional intellectual property rights grant can be found */
 /* in the file PATENTS.  All contributing project authors may */
 /* be found in the AUTHORS file in the root of the source tree. */
 #include "vpx/vpx_codec.h"
-static const char* const cfg = "--target=armv7-linux-gcc --enable-external-build --disable-examples --disable-install-docs --disable-unit-tests --enable-multi-res-encoding --size-limit=8192x4608 --enable-pic --enable-error-concealment --enable-runtime-cpu-detect --enable-realtime-only";
+static const char* const cfg = "--target=armv7-linux-gcc --enable-external-build --disable-examples --disable-install-docs --disable-unit-tests --enable-multi-res-encoding --size-limit=8192x4608 --enable-pic --enable-runtime-cpu-detect --enable-realtime-only";
 const char *vpx_codec_build_config(void) {return cfg;}
--- a/media/libvpx/config/linux/arm/vpx_config.h
+++ b/media/libvpx/config/linux/arm/vpx_config.h
@@ -60,17 +60,17 @@
 #define CONFIG_VP8 1
 #define CONFIG_VP9 1
 #define CONFIG_ENCODERS 1
 #define CONFIG_DECODERS 1
 #define CONFIG_STATIC_MSVCRT 0
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_REALTIME_ONLY 1
 #define CONFIG_ONTHEFLY_BITPACKING 0
-#define CONFIG_ERROR_CONCEALMENT 1
+#define CONFIG_ERROR_CONCEALMENT 0
 #define CONFIG_SHARED 0
 #define CONFIG_STATIC 1
 #define CONFIG_SMALL 0
 #define CONFIG_POSTPROC_VISUALIZER 0
 #define CONFIG_OS_SUPPORT 1
 #define CONFIG_UNIT_TESTS 0
 #define CONFIG_WEBM_IO 1
 #define CONFIG_LIBYUV 1
--- a/media/libvpx/config/linux/ia32/vpx_config.asm
+++ b/media/libvpx/config/linux/ia32/vpx_config.asm
@@ -48,17 +48,17 @@
 %define CONFIG_VP8 1
 %define CONFIG_VP9 1
 %define CONFIG_ENCODERS 1
 %define CONFIG_DECODERS 1
 %define CONFIG_STATIC_MSVCRT 0
 %define CONFIG_SPATIAL_RESAMPLING 1
 %define CONFIG_REALTIME_ONLY 0
 %define CONFIG_ONTHEFLY_BITPACKING 0
-%define CONFIG_ERROR_CONCEALMENT 1
+%define CONFIG_ERROR_CONCEALMENT 0
 %define CONFIG_SHARED 0
 %define CONFIG_STATIC 1
 %define CONFIG_SMALL 0
 %define CONFIG_POSTPROC_VISUALIZER 0
 %define CONFIG_OS_SUPPORT 1
 %define CONFIG_UNIT_TESTS 0
 %define CONFIG_WEBM_IO 1
 %define CONFIG_LIBYUV 1
--- a/media/libvpx/config/linux/ia32/vpx_config.c
+++ b/media/libvpx/config/linux/ia32/vpx_config.c
@@ -1,10 +1,10 @@
 /* Copyright (c) 2011 The WebM 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 in the root of the source */
 /* tree. An additional intellectual property rights grant can be found */
 /* in the file PATENTS.  All contributing project authors may */
 /* be found in the AUTHORS file in the root of the source tree. */
 #include "vpx/vpx_codec.h"
-static const char* const cfg = "--target=x86-linux-gcc --enable-external-build --disable-examples --disable-install-docs --disable-unit-tests --enable-multi-res-encoding --size-limit=8192x4608 --enable-pic --enable-error-concealment --enable-postproc --enable-vp9-postproc --as=yasm";
+static const char* const cfg = "--target=x86-linux-gcc --enable-external-build --disable-examples --disable-install-docs --disable-unit-tests --enable-multi-res-encoding --size-limit=8192x4608 --enable-pic --enable-postproc --enable-vp9-postproc --as=yasm";
 const char *vpx_codec_build_config(void) {return cfg;}
--- a/media/libvpx/config/linux/ia32/vpx_config.h
+++ b/media/libvpx/config/linux/ia32/vpx_config.h
@@ -60,17 +60,17 @@
 #define CONFIG_VP8 1
 #define CONFIG_VP9 1
 #define CONFIG_ENCODERS 1
 #define CONFIG_DECODERS 1
 #define CONFIG_STATIC_MSVCRT 0
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_REALTIME_ONLY 0
 #define CONFIG_ONTHEFLY_BITPACKING 0
-#define CONFIG_ERROR_CONCEALMENT 1
+#define CONFIG_ERROR_CONCEALMENT 0
 #define CONFIG_SHARED 0
 #define CONFIG_STATIC 1
 #define CONFIG_SMALL 0
 #define CONFIG_POSTPROC_VISUALIZER 0
 #define CONFIG_OS_SUPPORT 1
 #define CONFIG_UNIT_TESTS 0
 #define CONFIG_WEBM_IO 1
 #define CONFIG_LIBYUV 1
--- a/media/libvpx/config/linux/x64/vpx_config.asm
+++ b/media/libvpx/config/linux/x64/vpx_config.asm
@@ -48,17 +48,17 @@
 %define CONFIG_VP8 1
 %define CONFIG_VP9 1
 %define CONFIG_ENCODERS 1
 %define CONFIG_DECODERS 1
 %define CONFIG_STATIC_MSVCRT 0
 %define CONFIG_SPATIAL_RESAMPLING 1
 %define CONFIG_REALTIME_ONLY 0
 %define CONFIG_ONTHEFLY_BITPACKING 0
-%define CONFIG_ERROR_CONCEALMENT 1
+%define CONFIG_ERROR_CONCEALMENT 0
 %define CONFIG_SHARED 0
 %define CONFIG_STATIC 1
 %define CONFIG_SMALL 0
 %define CONFIG_POSTPROC_VISUALIZER 0
 %define CONFIG_OS_SUPPORT 1
 %define CONFIG_UNIT_TESTS 0
 %define CONFIG_WEBM_IO 1
 %define CONFIG_LIBYUV 1
--- a/media/libvpx/config/linux/x64/vpx_config.c
+++ b/media/libvpx/config/linux/x64/vpx_config.c
@@ -1,10 +1,10 @@
 /* Copyright (c) 2011 The WebM 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 in the root of the source */
 /* tree. An additional intellectual property rights grant can be found */
 /* in the file PATENTS.  All contributing project authors may */
 /* be found in the AUTHORS file in the root of the source tree. */
 #include "vpx/vpx_codec.h"
-static const char* const cfg = "--target=x86_64-linux-gcc --enable-external-build --disable-examples --disable-install-docs --disable-unit-tests --enable-multi-res-encoding --size-limit=8192x4608 --enable-pic --enable-error-concealment --enable-postproc --enable-vp9-postproc --as=yasm";
+static const char* const cfg = "--target=x86_64-linux-gcc --enable-external-build --disable-examples --disable-install-docs --disable-unit-tests --enable-multi-res-encoding --size-limit=8192x4608 --enable-pic --enable-postproc --enable-vp9-postproc --as=yasm";
 const char *vpx_codec_build_config(void) {return cfg;}
--- a/media/libvpx/config/linux/x64/vpx_config.h
+++ b/media/libvpx/config/linux/x64/vpx_config.h
@@ -60,17 +60,17 @@
 #define CONFIG_VP8 1
 #define CONFIG_VP9 1
 #define CONFIG_ENCODERS 1
 #define CONFIG_DECODERS 1
 #define CONFIG_STATIC_MSVCRT 0
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_REALTIME_ONLY 0
 #define CONFIG_ONTHEFLY_BITPACKING 0
-#define CONFIG_ERROR_CONCEALMENT 1
+#define CONFIG_ERROR_CONCEALMENT 0
 #define CONFIG_SHARED 0
 #define CONFIG_STATIC 1
 #define CONFIG_SMALL 0
 #define CONFIG_POSTPROC_VISUALIZER 0
 #define CONFIG_OS_SUPPORT 1
 #define CONFIG_UNIT_TESTS 0
 #define CONFIG_WEBM_IO 1
 #define CONFIG_LIBYUV 1
--- a/media/libvpx/config/mac/ia32/vpx_config.asm
+++ b/media/libvpx/config/mac/ia32/vpx_config.asm
@@ -48,17 +48,17 @@
 %define CONFIG_VP8 1
 %define CONFIG_VP9 1
 %define CONFIG_ENCODERS 1
 %define CONFIG_DECODERS 1
 %define CONFIG_STATIC_MSVCRT 0
 %define CONFIG_SPATIAL_RESAMPLING 1
 %define CONFIG_REALTIME_ONLY 0
 %define CONFIG_ONTHEFLY_BITPACKING 0
-%define CONFIG_ERROR_CONCEALMENT 1
+%define CONFIG_ERROR_CONCEALMENT 0
 %define CONFIG_SHARED 0
 %define CONFIG_STATIC 1
 %define CONFIG_SMALL 0
 %define CONFIG_POSTPROC_VISUALIZER 0
 %define CONFIG_OS_SUPPORT 1
 %define CONFIG_UNIT_TESTS 0
 %define CONFIG_WEBM_IO 1
 %define CONFIG_LIBYUV 1
--- a/media/libvpx/config/mac/ia32/vpx_config.c
+++ b/media/libvpx/config/mac/ia32/vpx_config.c
@@ -1,10 +1,10 @@
 /* Copyright (c) 2011 The WebM 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 in the root of the source */
 /* tree. An additional intellectual property rights grant can be found */
 /* in the file PATENTS.  All contributing project authors may */
 /* be found in the AUTHORS file in the root of the source tree. */
 #include "vpx/vpx_codec.h"
-static const char* const cfg = "--target=x86-darwin9-gcc --enable-external-build --disable-examples --disable-install-docs --disable-unit-tests --enable-multi-res-encoding --size-limit=8192x4608 --enable-pic --enable-error-concealment --enable-postproc --enable-vp9-postproc --as=yasm";
+static const char* const cfg = "--target=x86-darwin9-gcc --enable-external-build --disable-examples --disable-install-docs --disable-unit-tests --enable-multi-res-encoding --size-limit=8192x4608 --enable-pic --enable-postproc --enable-vp9-postproc --as=yasm";
 const char *vpx_codec_build_config(void) {return cfg;}
--- a/media/libvpx/config/mac/ia32/vpx_config.h
+++ b/media/libvpx/config/mac/ia32/vpx_config.h
@@ -60,17 +60,17 @@
 #define CONFIG_VP8 1
 #define CONFIG_VP9 1
 #define CONFIG_ENCODERS 1
 #define CONFIG_DECODERS 1
 #define CONFIG_STATIC_MSVCRT 0
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_REALTIME_ONLY 0
 #define CONFIG_ONTHEFLY_BITPACKING 0
-#define CONFIG_ERROR_CONCEALMENT 1
+#define CONFIG_ERROR_CONCEALMENT 0
 #define CONFIG_SHARED 0
 #define CONFIG_STATIC 1
 #define CONFIG_SMALL 0
 #define CONFIG_POSTPROC_VISUALIZER 0
 #define CONFIG_OS_SUPPORT 1
 #define CONFIG_UNIT_TESTS 0
 #define CONFIG_WEBM_IO 1
 #define CONFIG_LIBYUV 1
--- a/media/libvpx/config/mac/x64/vpx_config.asm
+++ b/media/libvpx/config/mac/x64/vpx_config.asm
@@ -48,17 +48,17 @@
 %define CONFIG_VP8 1
 %define CONFIG_VP9 1
 %define CONFIG_ENCODERS 1
 %define CONFIG_DECODERS 1
 %define CONFIG_STATIC_MSVCRT 0
 %define CONFIG_SPATIAL_RESAMPLING 1
 %define CONFIG_REALTIME_ONLY 0
 %define CONFIG_ONTHEFLY_BITPACKING 0
-%define CONFIG_ERROR_CONCEALMENT 1
+%define CONFIG_ERROR_CONCEALMENT 0
 %define CONFIG_SHARED 0
 %define CONFIG_STATIC 1
 %define CONFIG_SMALL 0
 %define CONFIG_POSTPROC_VISUALIZER 0
 %define CONFIG_OS_SUPPORT 1
 %define CONFIG_UNIT_TESTS 0
 %define CONFIG_WEBM_IO 1
 %define CONFIG_LIBYUV 1
--- a/media/libvpx/config/mac/x64/vpx_config.c
+++ b/media/libvpx/config/mac/x64/vpx_config.c
@@ -1,10 +1,10 @@
 /* Copyright (c) 2011 The WebM 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 in the root of the source */
 /* tree. An additional intellectual property rights grant can be found */
 /* in the file PATENTS.  All contributing project authors may */
 /* be found in the AUTHORS file in the root of the source tree. */
 #include "vpx/vpx_codec.h"
-static const char* const cfg = "--target=x86_64-darwin9-gcc --enable-external-build --disable-examples --disable-install-docs --disable-unit-tests --enable-multi-res-encoding --size-limit=8192x4608 --enable-pic --enable-error-concealment --enable-postproc --enable-vp9-postproc --as=yasm";
+static const char* const cfg = "--target=x86_64-darwin9-gcc --enable-external-build --disable-examples --disable-install-docs --disable-unit-tests --enable-multi-res-encoding --size-limit=8192x4608 --enable-pic --enable-postproc --enable-vp9-postproc --as=yasm";
 const char *vpx_codec_build_config(void) {return cfg;}
--- a/media/libvpx/config/mac/x64/vpx_config.h
+++ b/media/libvpx/config/mac/x64/vpx_config.h
@@ -60,17 +60,17 @@
 #define CONFIG_VP8 1
 #define CONFIG_VP9 1
 #define CONFIG_ENCODERS 1
 #define CONFIG_DECODERS 1
 #define CONFIG_STATIC_MSVCRT 0
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_REALTIME_ONLY 0
 #define CONFIG_ONTHEFLY_BITPACKING 0
-#define CONFIG_ERROR_CONCEALMENT 1
+#define CONFIG_ERROR_CONCEALMENT 0
 #define CONFIG_SHARED 0
 #define CONFIG_STATIC 1
 #define CONFIG_SMALL 0
 #define CONFIG_POSTPROC_VISUALIZER 0
 #define CONFIG_OS_SUPPORT 1
 #define CONFIG_UNIT_TESTS 0
 #define CONFIG_WEBM_IO 1
 #define CONFIG_LIBYUV 1
--- a/media/libvpx/config/win/ia32/vpx_config.asm
+++ b/media/libvpx/config/win/ia32/vpx_config.asm
@@ -48,17 +48,17 @@
 %define CONFIG_VP8 1
 %define CONFIG_VP9 1
 %define CONFIG_ENCODERS 1
 %define CONFIG_DECODERS 1
 %define CONFIG_STATIC_MSVCRT 0
 %define CONFIG_SPATIAL_RESAMPLING 1
 %define CONFIG_REALTIME_ONLY 0
 %define CONFIG_ONTHEFLY_BITPACKING 0
-%define CONFIG_ERROR_CONCEALMENT 1
+%define CONFIG_ERROR_CONCEALMENT 0
 %define CONFIG_SHARED 0
 %define CONFIG_STATIC 1
 %define CONFIG_SMALL 0
 %define CONFIG_POSTPROC_VISUALIZER 0
 %define CONFIG_OS_SUPPORT 1
 %define CONFIG_UNIT_TESTS 0
 %define CONFIG_WEBM_IO 1
 %define CONFIG_LIBYUV 1
--- a/media/libvpx/config/win/ia32/vpx_config.c
+++ b/media/libvpx/config/win/ia32/vpx_config.c
@@ -1,10 +1,10 @@
 /* Copyright (c) 2011 The WebM 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 in the root of the source */
 /* tree. An additional intellectual property rights grant can be found */
 /* in the file PATENTS.  All contributing project authors may */
 /* be found in the AUTHORS file in the root of the source tree. */
 #include "vpx/vpx_codec.h"
-static const char* const cfg = "--target=x86-win32-gcc --enable-external-build --disable-examples --disable-install-docs --disable-unit-tests --enable-multi-res-encoding --size-limit=8192x4608 --enable-pic --enable-error-concealment --enable-postproc --enable-vp9-postproc --as=yasm";
+static const char* const cfg = "--target=x86-win32-gcc --enable-external-build --disable-examples --disable-install-docs --disable-unit-tests --enable-multi-res-encoding --size-limit=8192x4608 --enable-pic --enable-postproc --enable-vp9-postproc --as=yasm";
 const char *vpx_codec_build_config(void) {return cfg;}
--- a/media/libvpx/config/win/ia32/vpx_config.h
+++ b/media/libvpx/config/win/ia32/vpx_config.h
@@ -60,17 +60,17 @@
 #define CONFIG_VP8 1
 #define CONFIG_VP9 1
 #define CONFIG_ENCODERS 1
 #define CONFIG_DECODERS 1
 #define CONFIG_STATIC_MSVCRT 0
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_REALTIME_ONLY 0
 #define CONFIG_ONTHEFLY_BITPACKING 0
-#define CONFIG_ERROR_CONCEALMENT 1
+#define CONFIG_ERROR_CONCEALMENT 0
 #define CONFIG_SHARED 0
 #define CONFIG_STATIC 1
 #define CONFIG_SMALL 0
 #define CONFIG_POSTPROC_VISUALIZER 0
 #define CONFIG_OS_SUPPORT 1
 #define CONFIG_UNIT_TESTS 0
 #define CONFIG_WEBM_IO 1
 #define CONFIG_LIBYUV 1
--- a/media/libvpx/config/win/x64/vpx_config.asm
+++ b/media/libvpx/config/win/x64/vpx_config.asm
@@ -48,17 +48,17 @@
 %define CONFIG_VP8 1
 %define CONFIG_VP9 1
 %define CONFIG_ENCODERS 1
 %define CONFIG_DECODERS 1
 %define CONFIG_STATIC_MSVCRT 0
 %define CONFIG_SPATIAL_RESAMPLING 1
 %define CONFIG_REALTIME_ONLY 0
 %define CONFIG_ONTHEFLY_BITPACKING 0
-%define CONFIG_ERROR_CONCEALMENT 1
+%define CONFIG_ERROR_CONCEALMENT 0
 %define CONFIG_SHARED 0
 %define CONFIG_STATIC 1
 %define CONFIG_SMALL 0
 %define CONFIG_POSTPROC_VISUALIZER 0
 %define CONFIG_OS_SUPPORT 1
 %define CONFIG_UNIT_TESTS 0
 %define CONFIG_WEBM_IO 1
 %define CONFIG_LIBYUV 1
--- a/media/libvpx/config/win/x64/vpx_config.c
+++ b/media/libvpx/config/win/x64/vpx_config.c
@@ -1,10 +1,10 @@
 /* Copyright (c) 2011 The WebM 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 in the root of the source */
 /* tree. An additional intellectual property rights grant can be found */
 /* in the file PATENTS.  All contributing project authors may */
 /* be found in the AUTHORS file in the root of the source tree. */
 #include "vpx/vpx_codec.h"
-static const char* const cfg = "--target=x86_64-win64-vs12 --enable-external-build --disable-examples --disable-install-docs --disable-unit-tests --enable-multi-res-encoding --size-limit=8192x4608 --enable-pic --enable-error-concealment --enable-postproc --enable-vp9-postproc --as=yasm";
+static const char* const cfg = "--target=x86_64-win64-vs12 --enable-external-build --disable-examples --disable-install-docs --disable-unit-tests --enable-multi-res-encoding --size-limit=8192x4608 --enable-pic --enable-postproc --enable-vp9-postproc --as=yasm";
 const char *vpx_codec_build_config(void) {return cfg;}
--- a/media/libvpx/config/win/x64/vpx_config.h
+++ b/media/libvpx/config/win/x64/vpx_config.h
@@ -60,17 +60,17 @@
 #define CONFIG_VP8 1
 #define CONFIG_VP9 1
 #define CONFIG_ENCODERS 1
 #define CONFIG_DECODERS 1
 #define CONFIG_STATIC_MSVCRT 0
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_REALTIME_ONLY 0
 #define CONFIG_ONTHEFLY_BITPACKING 0
-#define CONFIG_ERROR_CONCEALMENT 1
+#define CONFIG_ERROR_CONCEALMENT 0
 #define CONFIG_SHARED 0
 #define CONFIG_STATIC 1
 #define CONFIG_SMALL 0
 #define CONFIG_POSTPROC_VISUALIZER 0
 #define CONFIG_OS_SUPPORT 1
 #define CONFIG_UNIT_TESTS 0
 #define CONFIG_WEBM_IO 1
 #define CONFIG_LIBYUV 1
--- a/media/libvpx/generate_sources_mozbuild.sh
+++ b/media/libvpx/generate_sources_mozbuild.sh
@@ -188,17 +188,16 @@ echo "Create temporary directory."
 TEMP_DIR="$LIBVPX_SRC_DIR.temp"
 rm -rf $TEMP_DIR
 cp -R $LIBVPX_SRC_DIR $TEMP_DIR
 cd $TEMP_DIR
 
 echo "Generate config files."
 all_platforms="--enable-external-build --disable-examples --disable-install-docs --disable-unit-tests"
 all_platforms="${all_platforms} --enable-multi-res-encoding --size-limit=8192x4608 --enable-pic"
-all_platforms="${all_platforms} --enable-error-concealment"
 x86_platforms="--enable-postproc --enable-vp9-postproc --as=yasm"
 arm_platforms="--enable-runtime-cpu-detect --enable-realtime-only"
 gen_config_files linux/x64 "--target=x86_64-linux-gcc ${all_platforms} ${x86_platforms}"
 gen_config_files linux/ia32 "--target=x86-linux-gcc ${all_platforms} ${x86_platforms}"
 gen_config_files mac/x64 "--target=x86_64-darwin9-gcc ${all_platforms} ${x86_platforms}"
 gen_config_files mac/ia32 "--target=x86-darwin9-gcc ${all_platforms} ${x86_platforms}"
 gen_config_files win/x64 "--target=x86_64-win64-vs12 ${all_platforms} ${x86_platforms}"
 gen_config_files win/ia32 "--target=x86-win32-gcc ${all_platforms} ${x86_platforms}"
--- a/media/libvpx/sources.mozbuild
+++ b/media/libvpx/sources.mozbuild
@@ -67,17 +67,16 @@ files = {
     'libvpx/vp8/common/x86/subpixel_mmx.asm',
     'libvpx/vp8/common/x86/subpixel_sse2.asm',
     'libvpx/vp8/common/x86/subpixel_ssse3.asm',
     'libvpx/vp8/common/x86/vp8_asm_stubs.c',
     'libvpx/vp8/decoder/dboolhuff.c',
     'libvpx/vp8/decoder/decodeframe.c',
     'libvpx/vp8/decoder/decodemv.c',
     'libvpx/vp8/decoder/detokenize.c',
-    'libvpx/vp8/decoder/error_concealment.c',
     'libvpx/vp8/decoder/onyxd_if.c',
     'libvpx/vp8/decoder/threading.c',
     'libvpx/vp8/encoder/bitstream.c',
     'libvpx/vp8/encoder/boolhuff.c',
     'libvpx/vp8/encoder/dct.c',
     'libvpx/vp8/encoder/denoising.c',
     'libvpx/vp8/encoder/encodeframe.c',
     'libvpx/vp8/encoder/encodeintra.c',
@@ -328,17 +327,16 @@ files = {
     'libvpx/vp8/common/x86/subpixel_mmx.asm',
     'libvpx/vp8/common/x86/subpixel_sse2.asm',
     'libvpx/vp8/common/x86/subpixel_ssse3.asm',
     'libvpx/vp8/common/x86/vp8_asm_stubs.c',
     'libvpx/vp8/decoder/dboolhuff.c',
     'libvpx/vp8/decoder/decodeframe.c',
     'libvpx/vp8/decoder/decodemv.c',
     'libvpx/vp8/decoder/detokenize.c',
-    'libvpx/vp8/decoder/error_concealment.c',
     'libvpx/vp8/decoder/onyxd_if.c',
     'libvpx/vp8/decoder/threading.c',
     'libvpx/vp8/encoder/bitstream.c',
     'libvpx/vp8/encoder/boolhuff.c',
     'libvpx/vp8/encoder/dct.c',
     'libvpx/vp8/encoder/denoising.c',
     'libvpx/vp8/encoder/encodeframe.c',
     'libvpx/vp8/encoder/encodeintra.c',
@@ -578,17 +576,16 @@ files = {
     'libvpx/vp8/common/setupintrarecon.c',
     'libvpx/vp8/common/swapyv12buffer.c',
     'libvpx/vp8/common/treecoder.c',
     'libvpx/vp8/common/vp8_loopfilter.c',
     'libvpx/vp8/decoder/dboolhuff.c',
     'libvpx/vp8/decoder/decodeframe.c',
     'libvpx/vp8/decoder/decodemv.c',
     'libvpx/vp8/decoder/detokenize.c',
-    'libvpx/vp8/decoder/error_concealment.c',
     'libvpx/vp8/decoder/onyxd_if.c',
     'libvpx/vp8/decoder/threading.c',
     'libvpx/vp8/encoder/arm/neon/denoising_neon.c',
     'libvpx/vp8/encoder/arm/neon/fastquantizeb_neon.c',
     'libvpx/vp8/encoder/arm/neon/shortfdct_neon.c',
     'libvpx/vp8/encoder/arm/neon/vp8_shortwalsh4x4_neon.c',
     'libvpx/vp8/encoder/bitstream.c',
     'libvpx/vp8/encoder/boolhuff.c',
@@ -789,17 +786,16 @@ files = {
     'libvpx/vp8/common/setupintrarecon.c',
     'libvpx/vp8/common/swapyv12buffer.c',
     'libvpx/vp8/common/treecoder.c',
     'libvpx/vp8/common/vp8_loopfilter.c',
     'libvpx/vp8/decoder/dboolhuff.c',
     'libvpx/vp8/decoder/decodeframe.c',
     'libvpx/vp8/decoder/decodemv.c',
     'libvpx/vp8/decoder/detokenize.c',
-    'libvpx/vp8/decoder/error_concealment.c',
     'libvpx/vp8/decoder/onyxd_if.c',
     'libvpx/vp8/decoder/threading.c',
     'libvpx/vp8/encoder/bitstream.c',
     'libvpx/vp8/encoder/boolhuff.c',
     'libvpx/vp8/encoder/dct.c',
     'libvpx/vp8/encoder/denoising.c',
     'libvpx/vp8/encoder/encodeframe.c',
     'libvpx/vp8/encoder/encodeintra.c',
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
@@ -1586,20 +1586,36 @@ public abstract class GeckoApp
         }
         return passedUri;
     }
 
     private boolean invokedWithExternalURL(String uri) {
         return uri != null && !AboutPages.isAboutHome(uri);
     }
 
+    protected int getNewTabFlags() {
+        final boolean isFirstTab = !mWasFirstTabShownAfterActivityUnhidden;
+
+        final SafeIntent intent = new SafeIntent(getIntent());
+        final String action = intent.getAction();
+
+        int flags = Tabs.LOADURL_NEW_TAB | Tabs.LOADURL_USER_ENTERED | Tabs.LOADURL_EXTERNAL;
+        if (ACTION_HOMESCREEN_SHORTCUT.equals(action)) {
+            flags |= Tabs.LOADURL_PINNED;
+        }
+        if (isFirstTab) {
+            flags |= Tabs.LOADURL_FIRST_AFTER_ACTIVITY_UNHIDDEN;
+        }
+
+        return flags;
+    }
+
     private void initialize() {
         mInitialized = true;
 
-        final boolean isFirstTab = !mWasFirstTabShownAfterActivityUnhidden;
         mWasFirstTabShownAfterActivityUnhidden = true; // Reset since we'll be loading a tab.
 
         final SafeIntent intent = new SafeIntent(getIntent());
         final String action = intent.getAction();
 
         final String passedUri = getIntentURI(intent);
 
         final boolean isExternalURL = invokedWithExternalURL(passedUri);
@@ -1629,23 +1645,17 @@ public abstract class GeckoApp
         // already running.
         if (isExternalURL) {
             // Restore tabs before opening an external URL so that the new tab
             // is animated properly.
             Tabs.getInstance().notifyListeners(null, Tabs.TabEvents.RESTORED);
             processActionViewIntent(new Runnable() {
                 @Override
                 public void run() {
-                    int flags = Tabs.LOADURL_NEW_TAB | Tabs.LOADURL_USER_ENTERED | Tabs.LOADURL_EXTERNAL;
-                    if (ACTION_HOMESCREEN_SHORTCUT.equals(action)) {
-                        flags |= Tabs.LOADURL_PINNED;
-                    }
-                    if (isFirstTab) {
-                        flags |= Tabs.LOADURL_FIRST_AFTER_ACTIVITY_UNHIDDEN;
-                    }
+                    final int flags = getNewTabFlags();
                     loadStartupTab(passedUri, intent, flags);
                 }
             });
         } else {
             if (!mIsRestoringActivity) {
                 loadStartupTab(Tabs.LOADURL_NEW_TAB, action);
             }
 
--- a/mobile/android/base/java/org/mozilla/gecko/Tabs.java
+++ b/mobile/android/base/java/org/mozilla/gecko/Tabs.java
@@ -65,16 +65,17 @@ public class Tabs implements BundleEvent
     public static final int LOADURL_PINNED       = 1 << 3;
     public static final int LOADURL_DELAY_LOAD   = 1 << 4;
     public static final int LOADURL_DESKTOP      = 1 << 5;
     public static final int LOADURL_BACKGROUND   = 1 << 6;
     /** Indicates the url has been specified by a source external to the app. */
     public static final int LOADURL_EXTERNAL     = 1 << 7;
     /** Indicates the tab is the first shown after Firefox is hidden and restored. */
     public static final int LOADURL_FIRST_AFTER_ACTIVITY_UNHIDDEN = 1 << 8;
+    public static final int LOADURL_CUSTOMTAB    = 1 << 9;
 
     private static final long PERSIST_TABS_AFTER_MILLISECONDS = 1000 * 2;
 
     public static final int INVALID_TAB_ID = -1;
 
     private static final AtomicInteger sTabId = new AtomicInteger(0);
     private volatile boolean mInitialTabsAdded;
 
@@ -888,24 +889,26 @@ public class Tabs implements BundleEvent
         // delayLoad implies background tab
         boolean background = delayLoad || (flags & LOADURL_BACKGROUND) != 0;
 
         boolean isPrivate = (flags & LOADURL_PRIVATE) != 0;
         boolean userEntered = (flags & LOADURL_USER_ENTERED) != 0;
         boolean desktopMode = (flags & LOADURL_DESKTOP) != 0;
         boolean external = (flags & LOADURL_EXTERNAL) != 0;
         final boolean isFirstShownAfterActivityUnhidden = (flags & LOADURL_FIRST_AFTER_ACTIVITY_UNHIDDEN) != 0;
+        final boolean customTab = (flags & LOADURL_CUSTOMTAB) != 0;
 
         data.putString("url", url);
         data.putString("engine", searchEngine);
         data.putInt("parentId", parentId);
         data.putBoolean("userEntered", userEntered);
         data.putBoolean("isPrivate", isPrivate);
         data.putBoolean("pinned", (flags & LOADURL_PINNED) != 0);
         data.putBoolean("desktopMode", desktopMode);
+        data.putBoolean("customTab", customTab);
 
         final boolean needsNewTab;
         final String applicationId = (intent == null) ? null :
                 intent.getStringExtra(Browser.EXTRA_APPLICATION_ID);
         if (applicationId == null) {
             needsNewTab = (flags & LOADURL_NEW_TAB) != 0;
         } else {
             // If you modify this code, be careful that intent != null.
--- a/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
+++ b/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
@@ -99,16 +99,21 @@ public class CustomTabsActivity extends 
             setTheme(R.style.Theme_AppCompat_Light_NoActionBar);
         } else {
             setTheme(R.style.Theme_AppCompat_NoActionBar);
         }
 
     }
 
     @Override
+    protected int getNewTabFlags() {
+        return Tabs.LOADURL_CUSTOMTAB | super.getNewTabFlags();
+    }
+
+    @Override
     public void onDestroy() {
         super.onDestroy();
         Tabs.unregisterOnTabsChangedListener(this);
     }
 
     @Override
     public int getLayout() {
         return R.layout.customtabs_activity;
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -1644,17 +1644,18 @@ var BrowserApp = {
         let params = {
           selected: ("selected" in data) ? data.selected : !delayLoad,
           parentId: ("parentId" in data) ? data.parentId : -1,
           flags: flags,
           tabID: data.tabID,
           isPrivate: (data.isPrivate === true),
           pinned: (data.pinned === true),
           delayLoad: (delayLoad === true),
-          desktopMode: (data.desktopMode === true)
+          desktopMode: (data.desktopMode === true),
+          customTab: ("customTab" in data) ? data.customTab : false
         };
 
         params.userRequested = url;
 
         if (data.engine) {
           let engine = Services.search.getEngineByName(data.engine);
           if (engine) {
             let submission = engine.getSubmission(url);
@@ -3324,16 +3325,23 @@ nsBrowserAccess.prototype = {
 
     // If OPEN_SWITCHTAB was not handled above, we need to open a new tab,
     // along with other OPEN_ values that create a new tab.
     let newTab = (aWhere == Ci.nsIBrowserDOMWindow.OPEN_NEWWINDOW ||
                   aWhere == Ci.nsIBrowserDOMWindow.OPEN_NEWTAB ||
                   aWhere == Ci.nsIBrowserDOMWindow.OPEN_SWITCHTAB);
     let isPrivate = false;
 
+    if (aOpener != null) {
+      let parent = BrowserApp.getTabForWindow(aOpener.top);
+      if ((parent != null) && ("isCustomTab" in parent)) {
+        newTab = newTab && !parent.isCustomTab;
+      }
+    }
+
     if (newTab) {
       let parentId = -1;
       if (!isExternal && aOpener) {
         let parent = BrowserApp.getTabForWindow(aOpener.top);
         if (parent) {
           parentId = parent.id;
           isPrivate = PrivateBrowsingUtils.isBrowserPrivate(parent.browser);
         }
@@ -3592,16 +3600,17 @@ Tab.prototype = {
       let flags = "flags" in aParams ? aParams.flags : Ci.nsIWebNavigation.LOAD_FLAGS_NONE;
       let postData = ("postData" in aParams && aParams.postData) ? aParams.postData.value : null;
       let referrerURI = "referrerURI" in aParams ? aParams.referrerURI : null;
       let charset = "charset" in aParams ? aParams.charset : null;
 
       // The search term the user entered to load the current URL
       this.userRequested = "userRequested" in aParams ? aParams.userRequested : "";
       this.isSearch = "isSearch" in aParams ? aParams.isSearch : false;
+      this.isCustomTab = "customTab" in aParams ? aParams.customTab : false;
 
       try {
         this.browser.loadURIWithFlags(aURL, flags, referrerURI, charset, postData);
       } catch(e) {
         let message = {
           type: "Content:LoadError",
           tabID: this.id
         };
--- a/netwerk/system/win32/nsNotifyAddrListener.cpp
+++ b/netwerk/system/win32/nsNotifyAddrListener.cpp
@@ -630,55 +630,57 @@ nsNotifyAddrListener::CheckAdaptersAddre
     }
 
     //
     // Since NotifyIpInterfaceChange() signals a change more often than we
     // think is a worthy change, we checksum the entire state of all interfaces
     // that are UP. If the checksum is the same as previous check, nothing
     // of interest changed!
     //
-    ULONG sum = 0;
+    ULONG sumAll = 0;
 
     if (ret == ERROR_SUCCESS) {
         bool linkUp = false;
+        ULONG sum = 0;
 
         for (PIP_ADAPTER_ADDRESSES adapter = adapterList; adapter;
              adapter = adapter->Next) {
             if (adapter->OperStatus != IfOperStatusUp ||
                 !adapter->FirstUnicastAddress ||
                 adapter->IfType == IF_TYPE_SOFTWARE_LOOPBACK ||
                 CheckICSGateway(adapter) ) {
                 continue;
             }
 
+            sum <<= 2;
             // Add chars from AdapterName to the checksum.
             for (int i = 0; adapter->AdapterName[i]; ++i) {
-                sum <<= 2;
                 sum += adapter->AdapterName[i];
             }
 
             // Add bytes from each socket address to the checksum.
             for (PIP_ADAPTER_UNICAST_ADDRESS pip = adapter->FirstUnicastAddress;
                  pip; pip = pip->Next) {
                 SOCKET_ADDRESS *sockAddr = &pip->Address;
                 for (int i = 0; i < sockAddr->iSockaddrLength; ++i) {
                     sum += (reinterpret_cast<unsigned char *>
                             (sockAddr->lpSockaddr))[i];
                 }
             }
             linkUp = true;
+            sumAll ^= sum;
         }
         mLinkUp = linkUp;
         mStatusKnown = true;
     }
     free(adapterList);
 
     if (mLinkUp) {
         /* Store the checksum only if one or more interfaces are up */
-        mIPInterfaceChecksum = sum;
+        mIPInterfaceChecksum = sumAll;
     }
 
     CoUninitialize();
 
     return ret;
 }
 
 /**
--- a/old-configure.in
+++ b/old-configure.in
@@ -2213,17 +2213,16 @@ MOZ_WEBRTC=1
 MOZ_PEERCONNECTION=
 MOZ_SRTP=
 MOZ_WEBRTC_SIGNALING=
 MOZ_WEBRTC_ASSERT_ALWAYS=1
 MOZ_WEBRTC_HARDWARE_AEC_NS=
 MOZ_SCTP=
 MOZ_ANDROID_OMX=
 MOZ_OMX_PLUGIN=
-MOZ_VPX_ERROR_CONCEALMENT=
 VPX_USE_YASM=
 VPX_ASFLAGS=
 VPX_AS_CONVERSION=
 VPX_X86_ASM=
 VPX_ARM_ASM=
 LIBJPEG_TURBO_AS=
 LIBJPEG_TURBO_ASFLAGS=
 MOZ_PREF_EXTENSIONS=1
@@ -2813,17 +2812,16 @@ MOZ_ARG_DISABLE_BOOL(webrtc,
     MOZ_WEBRTC=1)
 
 if test -n "$MOZ_WEBRTC"; then
     AC_DEFINE(MOZ_WEBRTC)
     dnl MOZ_WEBRTC_ASSERT_ALWAYS turns on a number of safety asserts in
     dnl opt/production builds (via MOZ_CRASH())
     AC_DEFINE(MOZ_WEBRTC_ASSERT_ALWAYS)
     MOZ_RAW=1
-    MOZ_VPX_ERROR_CONCEALMENT=1
 
 dnl enable once Signaling lands
     MOZ_WEBRTC_SIGNALING=1
     AC_DEFINE(MOZ_WEBRTC_SIGNALING)
 dnl enable once PeerConnection lands
     MOZ_PEERCONNECTION=1
     AC_DEFINE(MOZ_PEERCONNECTION)
     MOZ_SCTP=1
@@ -2974,20 +2972,16 @@ dnl system libvpx Support
 dnl ========================================================
 MOZ_ARG_WITH_BOOL(system-libvpx,
 [  --with-system-libvpx    Use system libvpx (located with pkgconfig)],
     MOZ_SYSTEM_LIBVPX=1)
 
 MOZ_LIBVPX_CFLAGS=
 MOZ_LIBVPX_LIBS=
 
-if test -n "$MOZ_VPX_ERROR_CONCEALMENT" ; then
-    AC_DEFINE(MOZ_VPX_ERROR_CONCEALMENT)
-fi
-
 _SAVE_CFLAGS=$CFLAGS
 _SAVE_LIBS=$LIBS
 if test -n "$MOZ_SYSTEM_LIBVPX"; then
     dnl ============================
     dnl === libvpx Version check ===
     dnl ============================
     dnl Check to see if we have a system libvpx package.
     PKG_CHECK_MODULES(MOZ_LIBVPX, vpx >= 1.5.0)
@@ -5483,17 +5477,16 @@ AC_SUBST(WIN32_GUI_EXE_LDFLAGS)
 
 AC_SUBST(MOZ_VORBIS)
 AC_SUBST(MOZ_TREMOR)
 AC_SUBST(MOZ_FFVPX)
 AC_SUBST_LIST(FFVPX_ASFLAGS)
 AC_SUBST(MOZ_DIRECTSHOW)
 AC_SUBST(MOZ_ANDROID_OMX)
 AC_SUBST(MOZ_OMX_PLUGIN)
-AC_SUBST(MOZ_VPX_ERROR_CONCEALMENT)
 AC_SUBST(VPX_USE_YASM)
 AC_SUBST_LIST(VPX_ASFLAGS)
 AC_SUBST(VPX_AS_CONVERSION)
 AC_SUBST(VPX_X86_ASM)
 AC_SUBST(VPX_ARM_ASM)
 AC_SUBST(MOZ_CODE_COVERAGE)
 AC_SUBST(LIBJPEG_TURBO_USE_YASM)
 AC_SUBST_LIST(LIBJPEG_TURBO_ASFLAGS)
--- a/python/mozbuild/mozbuild/frontend/emitter.py
+++ b/python/mozbuild/mozbuild/frontend/emitter.py
@@ -1368,22 +1368,22 @@ class TreeMetadataEmitter(LoggingMixin):
         # Create a equivalent TestManifest object
         obj = TestManifest(context, manifest_full_path, manifest,
                            flavor="web-platform-tests",
                            relpath=mozpath.join(manifest_reldir,
                                                 mozpath.basename(manifest_path)),
                            install_prefix="web-platform/")
 
 
-        for path, tests in manifest:
+        for test_type, path, tests in manifest:
             path = mozpath.join(tests_root, path)
+            if test_type not in ["testharness", "reftest", "wdspec"]:
+                continue
+
             for test in tests:
-                if test.item_type not in ["testharness", "reftest"]:
-                    continue
-
                 obj.tests.append({
                     'path': path,
                     'here': mozpath.dirname(path),
                     'manifest': manifest_path,
                     'name': test.id,
                     'head': '',
                     'support-files': '',
                     'subsuite': '',
--- a/testing/web-platform/harness/wptrunner/executors/executormarionette.py
+++ b/testing/web-platform/harness/wptrunner/executors/executormarionette.py
@@ -505,17 +505,17 @@ class MarionetteRefTestExecutor(RefTestE
                              test_url,
                              timeout).run()
 
     def _screenshot(self, marionette, url, timeout):
         marionette.navigate(url)
 
         marionette.execute_async_script(self.wait_script)
 
-        screenshot = marionette.screenshot()
+        screenshot = marionette.screenshot(full=False)
         # strip off the data:img/png, part of the url
         if screenshot.startswith("data:image/png;base64,"):
             screenshot = screenshot.split(",", 1)[1]
 
         return screenshot
 
 
 class WdspecRun(object):
--- a/testing/web-platform/harness/wptrunner/metadata.py
+++ b/testing/web-platform/harness/wptrunner/metadata.py
@@ -15,16 +15,17 @@ from mozlog import structuredlog
 
 import expected
 import manifestupdate
 import testloader
 import wptmanifest
 import wpttest
 from vcs import git
 manifest = None  # Module that will be imported relative to test_root
+manifestitem = None
 
 logger = structuredlog.StructuredLogger("web-platform-tests")
 
 
 def load_test_manifests(serve_root, test_paths):
     do_delayed_imports(serve_root)
     manifest_loader = testloader.ManifestLoader(test_paths, False)
     return manifest_loader.load()
@@ -61,18 +62,18 @@ def update_expected(test_paths, serve_ro
         write_changes(metadata_path, expected_map)
 
     results_changed = [item.test_path for item in expected_map.itervalues() if item.modified]
 
     return unexpected_changes(manifests, change_data, results_changed)
 
 
 def do_delayed_imports(serve_root):
-    global manifest
-    from manifest import manifest
+    global manifest, manifestitem
+    from manifest import manifest, item as manifestitem
 
 
 def files_in_repo(repo_root):
     return git("ls-tree", "-r", "--name-only", "HEAD").split("\n")
 
 
 def rev_range(rev_old, rev_new, symmetric=False):
     joiner = ".." if not symmetric else "..."
@@ -107,17 +108,17 @@ def unexpected_changes(manifests, change
         if paths["url_base"] == "/":
             root_manifest = manifest
             break
     else:
         return []
 
     rv = []
 
-    return [fn for fn, tests in root_manifest if fn in files_changed and change_data.get(fn) != "M"]
+    return [fn for _, fn, _ in root_manifest if fn in files_changed and change_data.get(fn) != "M"]
 
 # For each testrun
 # Load all files and scan for the suite_start entry
 # Build a hash of filename: properties
 # For each different set of properties, gather all chunks
 # For each chunk in the set of chunks, go through all tests
 # for each test, make a map of {conditionals: [(platform, new_value)]}
 # Repeat for each platform
@@ -290,19 +291,23 @@ class ExpectedUpdater(object):
         test.set_result(self.run_info, result)
         del self.test_cache[test_id]
 
 
 def create_test_tree(metadata_path, test_manifest, property_order=None,
                      boolean_properties=None):
     expected_map = {}
     id_test_map = {}
-    exclude_types = frozenset(["stub", "helper", "manual"])
-    include_types = set(manifest.item_types) - exclude_types
-    for test_path, tests in test_manifest.itertypes(*include_types):
+    exclude_types = frozenset(["stub", "helper", "manual", "support", "conformancechecker"])
+    all_types = [item.item_type for item in manifestitem.__dict__.itervalues()
+                 if type(item) == type and
+                 issubclass(item, manifestitem.ManifestItem) and
+                 item.item_type is not None]
+    include_types = set(all_types) - exclude_types
+    for _, test_path, tests in test_manifest.itertypes(*include_types):
         expected_data = load_expected(test_manifest, metadata_path, test_path, tests,
                                       property_order=property_order,
                                       boolean_properties=boolean_properties)
         if expected_data is None:
             expected_data = create_expected(test_manifest,
                                             test_path,
                                             tests,
                                             property_order=property_order,
--- a/testing/web-platform/harness/wptrunner/testloader.py
+++ b/testing/web-platform/harness/wptrunner/testloader.py
@@ -41,34 +41,34 @@ class Unchunked(TestChunker):
     def __call__(self, manifest):
         for item in manifest:
             yield item
 
 
 class HashChunker(TestChunker):
     def __call__(self, manifest):
         chunk_index = self.chunk_number - 1
-        for test_path, tests in manifest:
+        for test_type, test_path, tests in manifest:
             h = int(hashlib.md5(test_path).hexdigest(), 16)
             if h % self.total_chunks == chunk_index:
-                yield test_path, tests
+                yield test_type, test_path, tests
 
 
 class DirectoryHashChunker(TestChunker):
     """Like HashChunker except the directory is hashed.
 
     This ensures that all tests in the same directory end up in the same
     chunk.
     """
     def __call__(self, manifest):
         chunk_index = self.chunk_number - 1
-        for test_path, tests in manifest:
+        for test_type, test_path, tests in manifest:
             h = int(hashlib.md5(os.path.dirname(test_path)).hexdigest(), 16)
             if h % self.total_chunks == chunk_index:
-                yield test_path, tests
+                yield test_type, test_path, tests
 
 
 class EqualTimeChunker(TestChunker):
     def _group_by_directory(self, manifest_items):
         """Split the list of manifest items into a ordered dict that groups tests in
         so that anything in the same subdirectory beyond a depth of 3 is in the same
         group. So all tests in a/b/c, a/b/c/d and a/b/c/e will be grouped together
         and separate to tests in a/b/f
@@ -80,28 +80,28 @@ class EqualTimeChunker(TestChunker):
             def __init__(self, path):
                 self.path = path
                 self.time = 0
                 self.tests = []
 
         by_dir = OrderedDict()
         total_time = 0
 
-        for i, (test_path, tests) in enumerate(manifest_items):
+        for i, (test_type, test_path, tests) in enumerate(manifest_items):
             test_dir = tuple(os.path.split(test_path)[0].split(os.path.sep)[:3])
 
             if not test_dir in by_dir:
                 by_dir[test_dir] = PathData(test_dir)
 
             data = by_dir[test_dir]
             time = sum(wpttest.DEFAULT_TIMEOUT if test.timeout !=
                        "long" else wpttest.LONG_TIMEOUT for test in tests)
             data.time += time
             total_time += time
-            data.tests.append((test_path, tests))
+            data.tests.append((test_type, test_path, tests))
 
         return by_dir, total_time
 
     def _maybe_remove(self, chunks, i, direction):
         """Trial removing a chunk from one chunk to an adjacent one.
 
         :param chunks: - the list of all chunks
         :param i: - the chunk index in the list of chunks to try removing from
@@ -347,24 +347,24 @@ class TestFilter(object):
             for item in include:
                 self.manifest.add_include(test_manifests, item)
 
         if exclude:
             for item in exclude:
                 self.manifest.add_exclude(test_manifests, item)
 
     def __call__(self, manifest_iter):
-        for test_path, tests in manifest_iter:
+        for test_type, test_path, tests in manifest_iter:
             include_tests = set()
             for test in tests:
                 if self.manifest.include(test):
                     include_tests.add(test)
 
             if include_tests:
-                yield test_path, include_tests
+                yield test_type, test_path, include_tests
 
 class TagFilter(object):
     def __init__(self, tags):
         self.tags = set(tags)
 
     def __call__(self, test_iter):
         for test in test_iter:
             if test.tags & self.tags:
@@ -401,24 +401,24 @@ class ManifestLoader(object):
             try:
                 with open(manifest_path) as f:
                     json_data = json.load(f)
             except IOError:
                 #If the existing file doesn't exist just create one from scratch
                 pass
 
         if not json_data:
-            manifest_file = manifest.Manifest(None, url_base)
+            manifest_file = manifest.Manifest(url_base)
         else:
             try:
                 manifest_file = manifest.Manifest.from_json(tests_path, json_data)
             except manifest.ManifestVersionMismatch:
-                manifest_file = manifest.Manifest(None, url_base)
+                manifest_file = manifest.Manifest(url_base)
 
-            manifest_update.update(tests_path, url_base, manifest_file)
+            manifest_update.update(tests_path, manifest_file, True)
 
         manifest.write(manifest_file, manifest_path)
 
     def load_manifest(self, tests_path, metadata_path, url_base="/"):
         manifest_path = os.path.join(metadata_path, "MANIFEST.json")
         if (not os.path.exists(manifest_path) or
             self.force_manifest_update):
             self.update_manifest(manifest_path, tests_path, url_base)
@@ -517,24 +517,24 @@ class TestLoader(object):
         for manifest in sorted(self.manifests.keys(), key=lambda x:x.url_base):
             manifest_iter = iterfilter(self.manifest_filters,
                                        manifest.itertypes(*self.test_types))
             manifest_items.extend(manifest_iter)
 
         if self.chunker is not None:
             manifest_items = self.chunker(manifest_items)
 
-        for test_path, tests in manifest_items:
+        for test_type, test_path, tests in manifest_items:
             manifest_file = iter(tests).next().manifest
             metadata_path = self.manifests[manifest_file]["metadata_path"]
             inherit_metadata, test_metadata = self.load_metadata(manifest_file, metadata_path, test_path)
 
             for test in iterfilter(self.meta_filters,
                                    self.iter_wpttest(inherit_metadata, test_metadata, tests)):
-                yield test_path, test.test_type, test
+                yield test_path, test_type, test
 
     def iter_wpttest(self, inherit_metadata, test_metadata, tests):
         for manifest_test in tests:
             yield self.get_test(manifest_test, inherit_metadata, test_metadata)
 
     def _load_tests(self):
         """Read in the tests from the manifest file and add them to a queue"""
         tests = {"enabled":defaultdict(list),
--- a/testing/web-platform/harness/wptrunner/update/sync.py
+++ b/testing/web-platform/harness/wptrunner/update/sync.py
@@ -119,32 +119,30 @@ class GetSyncTargetCo