Merge m-c to oak
authorRobert Strong <robert.bugzilla@gmail.com>
Wed, 27 Apr 2016 19:13:27 -0700
changeset 491512 d5f0be49695a7dc0813aab61b9ba085798ee7d8b
parent 491511 f6696d4874acb6802c23fe4f2ee8474955fe9d56 (current diff)
parent 356965 86730d0a82093d705e44f33a34973d28b269f1ea (diff)
child 491513 f753b28389dadfc5ba5279693905b9f03bee8a76
push id47343
push userbmo:dothayer@mozilla.com
push dateWed, 01 Mar 2017 22:58:58 +0000
milestone49.0a1
Merge m-c to oak
browser/base/content/browser.js
devtools/client/sourceeditor/codemirror/addon/search/search.js
dom/canvas/test/_webgl-conformance.ini
dom/canvas/test/webgl-conformance/00_test_list.txt
dom/canvas/test/webgl-conformance/README.mozilla
dom/canvas/test/webgl-conformance/README.txt
dom/canvas/test/webgl-conformance/_wrappers/test_always-fail.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__attribs__gl-enable-vertex-attrib.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__attribs__gl-vertex-attrib-zero-issues.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__attribs__gl-vertex-attrib.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__attribs__gl-vertexattribpointer-offsets.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__attribs__gl-vertexattribpointer.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__buffers__buffer-bind-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__buffers__buffer-data-array-buffer.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__buffers__index-validation-copies-indices.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__buffers__index-validation-crash-with-buffer-sub-data.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__buffers__index-validation-verifies-too-many-indices.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__buffers__index-validation-with-resized-buffer.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__buffers__index-validation.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__canvas__buffer-offscreen-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__canvas__buffer-preserve-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__canvas__canvas-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__canvas__canvas-zero-size.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__canvas__drawingbuffer-static-canvas-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__canvas__drawingbuffer-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__canvas__viewport-unchanged-upon-resize.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__context__constants.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__context__context-attributes-alpha-depth-stencil-antialias.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__context__context-lost-restored.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__context__context-lost.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__context__context-type-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__context__incorrect-context-object-behaviour.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__context__methods.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__context__premultiplyalpha-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__context__resource-sharing-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__extensions__ext-sRGB.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__extensions__ext-shader-texture-lod.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__extensions__ext-texture-filter-anisotropic.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__extensions__oes-standard-derivatives.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__extensions__oes-texture-float.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__extensions__oes-vertex-array-object.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__extensions__webgl-compressed-texture-etc1.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__extensions__webgl-compressed-texture-s3tc.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__extensions__webgl-debug-renderer-info.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__extensions__webgl-debug-shaders.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-abs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-acos.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-asin.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-atan-xy.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-atan.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-ceil.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-clamp-float.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-clamp-gentype.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-cos.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-cross.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-distance.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-dot.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-faceforward.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-floor.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-fract.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-length.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-max-float.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-max-gentype.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-min-float.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-min-gentype.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-mix-float.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-mix-gentype.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-mod-float.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-mod-gentype.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-normalize.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-reflect.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-sign.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-sin.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-smoothstep-float.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-smoothstep-gentype.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-step-float.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function-step-gentype.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__functions__glsl-function.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__add_int_float.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__add_int_mat2.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__add_int_mat3.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__add_int_mat4.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__add_int_vec2.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__add_int_vec3.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__add_int_vec4.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__add_ivec2_vec2.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__add_ivec3_vec3.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__add_ivec4_vec4.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__assign_int_to_float.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__assign_ivec2_to_vec2.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__assign_ivec3_to_vec3.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__assign_ivec4_to_vec4.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__construct_struct.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__divide_int_float.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__divide_int_mat2.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__divide_int_mat3.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__divide_int_mat4.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__divide_int_vec2.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__divide_int_vec3.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__divide_int_vec4.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__divide_ivec2_vec2.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__divide_ivec3_vec3.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__divide_ivec4_vec4.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__equal_int_float.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__equal_ivec2_vec2.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__equal_ivec3_vec3.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__equal_ivec4_vec4.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__function_int_float.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__function_ivec2_vec2.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__function_ivec3_vec3.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__function_ivec4_vec4.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__greater_than.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__greater_than_equal.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__less_than.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__less_than_equal.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__multiply_int_float.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__multiply_int_mat2.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__multiply_int_mat3.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__multiply_int_mat4.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__multiply_int_vec2.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__multiply_int_vec3.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__multiply_int_vec4.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__multiply_ivec2_vec2.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__multiply_ivec3_vec3.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__multiply_ivec4_vec4.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__not_equal_int_float.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__not_equal_ivec2_vec2.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__not_equal_ivec3_vec3.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__not_equal_ivec4_vec4.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__subtract_int_float.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__subtract_int_mat2.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__subtract_int_mat3.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__subtract_int_mat4.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__subtract_int_vec2.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__subtract_int_vec3.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__subtract_int_vec4.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__subtract_ivec2_vec2.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__subtract_ivec3_vec3.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__subtract_ivec4_vec4.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__ternary_int_float.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__ternary_ivec2_vec2.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__ternary_ivec3_vec3.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__implicit__ternary_ivec4_vec4.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__attrib-location-length-limits.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__embedded-struct-definitions-forbidden.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__glsl-function-nodes.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__glsl-long-variable-names.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__non-ascii-comments.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__non-ascii.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-256-character-identifier.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-257-character-identifier.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-_webgl-identifier.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-arbitrary-indexing.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-arbitrary-indexing.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-attrib-array.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-attrib-struct.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-clipvertex.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-default-precision.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-default-precision.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-define-line-continuation.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-dfdx-no-ext.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-dfdx.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-error-directive.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-explicit-int-cast.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-float-return-value.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-frag-depth.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-function-recursion.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-glcolor.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-gles-1.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-gles-symbol.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-glprojectionmatrix.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-implicit-vec3-to-vec4-cast.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-include.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-int-return-value.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-invalid-identifier.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-ivec2-return-value.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-ivec3-return-value.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-ivec4-return-value.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-limited-indexing.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-long-line.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-non-ascii-error.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-precision.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-quoted-error.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-undefined-preprocessor-symbol.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-uniform-in-loop-condition.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-vec2-return-value.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-vec3-return-value.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-vec4-return-value.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-version-100.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-version-100.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-version-120.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-version-130.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-with-webgl-identifier.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shader-without-precision.frag.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__shared.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__struct-nesting-exceeds-maximum.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__struct-nesting-under-maximum.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__misc__uniform-location-length-limits.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__reserved___webgl_field.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__reserved___webgl_function.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__reserved___webgl_struct.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__reserved___webgl_variable.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__reserved__webgl_field.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__reserved__webgl_function.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__reserved__webgl_struct.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__reserved__webgl_variable.vert.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__variables__gl-fragcoord.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__variables__gl-frontfacing.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__glsl__variables__gl-pointcoord.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__limits__gl-max-texture-dimensions.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__limits__gl-min-attribs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__limits__gl-min-textures.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__limits__gl-min-uniforms.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__misc__bad-arguments-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__misc__error-reporting.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__misc__functions-returning-strings.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__misc__instanceof-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__misc__invalid-passed-params.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__misc__is-object.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__misc__null-object-behaviour.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__misc__object-deletion-behaviour.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__misc__shader-precision-format.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__misc__type-conversion-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__misc__uninitialized-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__misc__webgl-specific.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__conformance__constants.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__conformance__getContext.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__conformance__methods.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__conformance__quickCheckAPI-A.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__conformance__quickCheckAPI-B1.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__conformance__quickCheckAPI-B2.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__conformance__quickCheckAPI-B3.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__conformance__quickCheckAPI-B4.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__conformance__quickCheckAPI-C.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__conformance__quickCheckAPI-D_G.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__conformance__quickCheckAPI-G_I.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__conformance__quickCheckAPI-L_S.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__conformance__quickCheckAPI-S_V.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__conformance__webGLArrays.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__bindBuffer.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__bindBufferBadArgs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__bindFramebufferLeaveNonZero.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__bufferData.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__bufferDataBadArgs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__bufferSubData.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__bufferSubDataBadArgs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__copyTexImage2D.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__copyTexImage2DBadArgs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__copyTexSubImage2D.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__copyTexSubImage2DBadArgs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__deleteBufferBadArgs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__drawArrays.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__drawArraysOutOfBounds.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__drawElements.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__drawElementsBadArgs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__isTests.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__readPixels.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__readPixelsBadArgs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__texImage2D.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__texImage2DBadArgs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__texImage2DHTML.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__texImage2DHTMLBadArgs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__texSubImage2D.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__texSubImage2DBadArgs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__texSubImage2DHTML.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__texSubImage2DHTMLBadArgs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__uniformMatrix.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__uniformMatrixBadArgs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__uniformf.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__uniformfArrayLen1.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__uniformfBadArgs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__uniformi.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__uniformiBadArgs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__vertexAttrib.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__vertexAttribBadArgs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__vertexAttribPointer.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__functions__vertexAttribPointerBadArgs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__glsl__arrayOutOfBounds.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__more__glsl__uniformOutOfBounds.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__programs__get-active-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__programs__gl-bind-attrib-location-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__programs__gl-get-active-attribute.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__programs__gl-get-active-uniform.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__programs__gl-getshadersource.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__programs__gl-shader-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__programs__invalid-UTF-16.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__programs__program-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__reading__read-pixels-pack-alignment.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__reading__read-pixels-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__renderbuffers__framebuffer-object-attachment.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__renderbuffers__framebuffer-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__renderbuffers__renderbuffer-initialization.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__rendering__draw-arrays-out-of-bounds.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__rendering__draw-elements-out-of-bounds.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__rendering__gl-clear.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__rendering__gl-drawelements.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__rendering__gl-scissor-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__rendering__line-loop-tri-fan.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__rendering__more-than-65536-indices.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__rendering__point-size.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__rendering__triangle.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__state__gl-enable-enum-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__state__gl-enum-tests.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__state__gl-get-calls.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__state__gl-geterror.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__state__gl-getstring.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__state__gl-object-get-calls.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__compressed-tex-image.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__copy-tex-image-and-sub-image-2d.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__gl-pixelstorei.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__gl-teximage.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__origin-clean-conformance.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__tex-image-and-sub-image-2d-with-array-buffer-view.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__tex-image-and-sub-image-2d-with-canvas.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__tex-image-and-sub-image-2d-with-image-data.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__tex-image-and-sub-image-2d-with-image.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__tex-image-and-sub-image-2d-with-video.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__tex-image-and-uniform-binding-bugs.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__tex-image-with-format-and-type.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__tex-image-with-invalid-data.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__tex-input-validation.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__tex-sub-image-2d-bad-args.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__tex-sub-image-2d.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__texparameter-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__texture-active-bind-2.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__texture-active-bind.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__texture-complete.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__texture-formats-test.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__texture-mips.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__texture-npot-video.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__texture-npot.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__texture-size-cube-maps.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__texture-size.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__textures__texture-transparent-pixels-initialized.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__typedarrays__array-buffer-crash.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__typedarrays__array-buffer-view-crash.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__typedarrays__array-unit-tests.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__uniforms__gl-uniform-arrays.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__uniforms__gl-uniform-bool.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__uniforms__gl-uniformmatrix4fv.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__uniforms__gl-unknown-uniform.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__uniforms__null-uniform-location.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__uniforms__uniform-location.html
dom/canvas/test/webgl-conformance/_wrappers/test_conformance__uniforms__uniform-samplers-test.html
dom/canvas/test/webgl-conformance/always-fail.html
dom/canvas/test/webgl-conformance/conformance/00_readme.txt
dom/canvas/test/webgl-conformance/conformance/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/LICENSE_CHROMIUM
dom/canvas/test/webgl-conformance/conformance/attribs/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/attribs/gl-enable-vertex-attrib.html
dom/canvas/test/webgl-conformance/conformance/attribs/gl-vertex-attrib-zero-issues.html
dom/canvas/test/webgl-conformance/conformance/attribs/gl-vertex-attrib.html
dom/canvas/test/webgl-conformance/conformance/attribs/gl-vertexattribpointer-offsets.html
dom/canvas/test/webgl-conformance/conformance/attribs/gl-vertexattribpointer.html
dom/canvas/test/webgl-conformance/conformance/buffers/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/buffers/buffer-bind-test.html
dom/canvas/test/webgl-conformance/conformance/buffers/buffer-data-array-buffer.html
dom/canvas/test/webgl-conformance/conformance/buffers/index-validation-copies-indices.html
dom/canvas/test/webgl-conformance/conformance/buffers/index-validation-crash-with-buffer-sub-data.html
dom/canvas/test/webgl-conformance/conformance/buffers/index-validation-verifies-too-many-indices.html
dom/canvas/test/webgl-conformance/conformance/buffers/index-validation-with-resized-buffer.html
dom/canvas/test/webgl-conformance/conformance/buffers/index-validation.html
dom/canvas/test/webgl-conformance/conformance/canvas/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/canvas/buffer-offscreen-test.html
dom/canvas/test/webgl-conformance/conformance/canvas/buffer-preserve-test.html
dom/canvas/test/webgl-conformance/conformance/canvas/canvas-test.html
dom/canvas/test/webgl-conformance/conformance/canvas/canvas-zero-size.html
dom/canvas/test/webgl-conformance/conformance/canvas/drawingbuffer-static-canvas-test.html
dom/canvas/test/webgl-conformance/conformance/canvas/drawingbuffer-test.html
dom/canvas/test/webgl-conformance/conformance/canvas/viewport-unchanged-upon-resize.html
dom/canvas/test/webgl-conformance/conformance/context/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/context/constants.html
dom/canvas/test/webgl-conformance/conformance/context/context-attribute-preserve-drawing-buffer.html
dom/canvas/test/webgl-conformance/conformance/context/context-attributes-alpha-depth-stencil-antialias.html
dom/canvas/test/webgl-conformance/conformance/context/context-lost-restored.html
dom/canvas/test/webgl-conformance/conformance/context/context-lost.html
dom/canvas/test/webgl-conformance/conformance/context/context-type-test.html
dom/canvas/test/webgl-conformance/conformance/context/incorrect-context-object-behaviour.html
dom/canvas/test/webgl-conformance/conformance/context/methods.html
dom/canvas/test/webgl-conformance/conformance/context/premultiplyalpha-test.html
dom/canvas/test/webgl-conformance/conformance/context/resource-sharing-test.html
dom/canvas/test/webgl-conformance/conformance/extensions/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/extensions/ext-sRGB.html
dom/canvas/test/webgl-conformance/conformance/extensions/ext-shader-texture-lod.html
dom/canvas/test/webgl-conformance/conformance/extensions/ext-texture-filter-anisotropic.html
dom/canvas/test/webgl-conformance/conformance/extensions/oes-standard-derivatives.html
dom/canvas/test/webgl-conformance/conformance/extensions/oes-texture-float.html
dom/canvas/test/webgl-conformance/conformance/extensions/oes-vertex-array-object.html
dom/canvas/test/webgl-conformance/conformance/extensions/webgl-compressed-texture-etc1.html
dom/canvas/test/webgl-conformance/conformance/extensions/webgl-compressed-texture-s3tc.html
dom/canvas/test/webgl-conformance/conformance/extensions/webgl-debug-renderer-info.html
dom/canvas/test/webgl-conformance/conformance/extensions/webgl-debug-shaders.html
dom/canvas/test/webgl-conformance/conformance/extensions/webgl-depth-texture.html
dom/canvas/test/webgl-conformance/conformance/glsl/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/glsl/functions/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-abs.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-acos.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-asin.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-atan-xy.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-atan.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-ceil.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-clamp-float.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-clamp-gentype.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-cos.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-cross.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-distance.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-dot.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-faceforward.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-floor.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-fract.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-length.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-lessThan.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-max-float.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-max-gentype.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-min-float.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-min-gentype.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-mix-float.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-mix-gentype.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-mod-float.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-mod-gentype.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-normalize.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-reflect.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-refract.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-sign.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-sin.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-smoothstep-float.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-smoothstep-gentype.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-step-float.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function-step-gentype.html
dom/canvas/test/webgl-conformance/conformance/glsl/functions/glsl-function.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/add_int_float.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/add_int_mat2.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/add_int_mat3.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/add_int_mat4.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/add_int_vec2.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/add_int_vec3.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/add_int_vec4.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/add_ivec2_vec2.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/add_ivec3_vec3.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/add_ivec4_vec4.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/assign_int_to_float.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/assign_ivec2_to_vec2.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/assign_ivec3_to_vec3.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/assign_ivec4_to_vec4.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/construct_struct.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/divide_int_float.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/divide_int_mat2.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/divide_int_mat3.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/divide_int_mat4.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/divide_int_vec2.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/divide_int_vec3.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/divide_int_vec4.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/divide_ivec2_vec2.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/divide_ivec3_vec3.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/divide_ivec4_vec4.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/equal_int_float.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/equal_ivec2_vec2.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/equal_ivec3_vec3.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/equal_ivec4_vec4.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/function_int_float.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/function_ivec2_vec2.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/function_ivec3_vec3.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/function_ivec4_vec4.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/greater_than.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/greater_than_equal.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/less_than.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/less_than_equal.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/multiply_int_float.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/multiply_int_mat2.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/multiply_int_mat3.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/multiply_int_mat4.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/multiply_int_vec2.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/multiply_int_vec3.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/multiply_int_vec4.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/multiply_ivec2_vec2.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/multiply_ivec3_vec3.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/multiply_ivec4_vec4.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/not_equal_int_float.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/not_equal_ivec2_vec2.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/not_equal_ivec3_vec3.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/not_equal_ivec4_vec4.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/subtract_int_float.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/subtract_int_mat2.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/subtract_int_mat3.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/subtract_int_mat4.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/subtract_int_vec2.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/subtract_int_vec3.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/subtract_int_vec4.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/subtract_ivec2_vec2.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/subtract_ivec3_vec3.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/subtract_ivec4_vec4.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/ternary_int_float.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/ternary_ivec2_vec2.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/ternary_ivec3_vec3.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/implicit/ternary_ivec4_vec4.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/matrices/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/glsl/matrices/glsl-mat4-to-mat3.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/glsl/misc/attrib-location-length-limits.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/embedded-struct-definitions-forbidden.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/glsl-2types-of-textures-on-same-unit.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/glsl-function-nodes.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/glsl-long-variable-names.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/glsl-vertex-branch.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/include.vs
dom/canvas/test/webgl-conformance/conformance/glsl/misc/non-ascii-comments.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/non-ascii.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/re-compile-re-link.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-256-character-identifier.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-257-character-identifier.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-_webgl-identifier.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-arbitrary-indexing.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-arbitrary-indexing.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-attrib-array.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-attrib-struct.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-clipvertex.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-comma-assignment.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-comma-conditional-assignment.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-conditional-scoping.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-default-precision.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-default-precision.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-define-line-continuation.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-dfdx-no-ext.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-dfdx.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-do-scoping.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-error-directive.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-explicit-int-cast.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-float-return-value.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-for-loop.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-for-scoping.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-frag-depth.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-function-recursion.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-function-scoped-struct.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-functional-scoping.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-glcolor.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-gles-1.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-gles-symbol.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-glprojectionmatrix.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-hex-int-constant-macro.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-implicit-vec3-to-vec4-cast.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-include.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-int-return-value.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-invalid-identifier.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-ivec2-return-value.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-ivec3-return-value.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-ivec4-return-value.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-limited-indexing.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-line-directive.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-long-line.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-non-ascii-error.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-precision.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-quoted-error.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-undefined-preprocessor-symbol.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-uniform-in-loop-condition.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-vec2-return-value.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-vec3-return-value.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-vec4-return-value.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-vec4-vec3-vec4-conditional.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-version-100.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-version-100.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-version-120.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-version-130.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-with-webgl-identifier.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shader-without-precision.frag.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/shared.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/struct-nesting-exceeds-maximum.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/struct-nesting-under-maximum.html
dom/canvas/test/webgl-conformance/conformance/glsl/misc/uniform-location-length-limits.html
dom/canvas/test/webgl-conformance/conformance/glsl/reserved/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/glsl/reserved/_webgl_field.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/reserved/_webgl_function.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/reserved/_webgl_struct.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/reserved/_webgl_variable.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/reserved/webgl_field.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/reserved/webgl_function.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/reserved/webgl_struct.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/reserved/webgl_variable.vert.html
dom/canvas/test/webgl-conformance/conformance/glsl/samplers/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/glsl/samplers/glsl-function-texture2d-bias.html
dom/canvas/test/webgl-conformance/conformance/glsl/samplers/glsl-function-texture2dlod.html
dom/canvas/test/webgl-conformance/conformance/glsl/samplers/glsl-function-texture2dproj.html
dom/canvas/test/webgl-conformance/conformance/glsl/variables/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/glsl/variables/gl-fragcoord.html
dom/canvas/test/webgl-conformance/conformance/glsl/variables/gl-frontfacing.html
dom/canvas/test/webgl-conformance/conformance/glsl/variables/gl-pointcoord.html
dom/canvas/test/webgl-conformance/conformance/limits/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/limits/gl-max-texture-dimensions.html
dom/canvas/test/webgl-conformance/conformance/limits/gl-min-attribs.html
dom/canvas/test/webgl-conformance/conformance/limits/gl-min-textures.html
dom/canvas/test/webgl-conformance/conformance/limits/gl-min-uniforms.html
dom/canvas/test/webgl-conformance/conformance/misc/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/misc/bad-arguments-test.html
dom/canvas/test/webgl-conformance/conformance/misc/delayed-drawing.html
dom/canvas/test/webgl-conformance/conformance/misc/error-reporting.html
dom/canvas/test/webgl-conformance/conformance/misc/functions-returning-strings.html
dom/canvas/test/webgl-conformance/conformance/misc/instanceof-test.html
dom/canvas/test/webgl-conformance/conformance/misc/invalid-passed-params.html
dom/canvas/test/webgl-conformance/conformance/misc/is-object.html
dom/canvas/test/webgl-conformance/conformance/misc/null-object-behaviour.html
dom/canvas/test/webgl-conformance/conformance/misc/object-deletion-behaviour.html
dom/canvas/test/webgl-conformance/conformance/misc/shader-precision-format.html
dom/canvas/test/webgl-conformance/conformance/misc/type-conversion-test.html
dom/canvas/test/webgl-conformance/conformance/misc/uninitialized-test.html
dom/canvas/test/webgl-conformance/conformance/misc/webgl-specific.html
dom/canvas/test/webgl-conformance/conformance/more/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/more/README.md
dom/canvas/test/webgl-conformance/conformance/more/all_tests.html
dom/canvas/test/webgl-conformance/conformance/more/all_tests_linkonly.html
dom/canvas/test/webgl-conformance/conformance/more/all_tests_sequential.html
dom/canvas/test/webgl-conformance/conformance/more/conformance/argGenerators-A.js
dom/canvas/test/webgl-conformance/conformance/more/conformance/argGenerators-B1.js
dom/canvas/test/webgl-conformance/conformance/more/conformance/argGenerators-B2.js
dom/canvas/test/webgl-conformance/conformance/more/conformance/argGenerators-B3.js
dom/canvas/test/webgl-conformance/conformance/more/conformance/argGenerators-B4.js
dom/canvas/test/webgl-conformance/conformance/more/conformance/argGenerators-C.js
dom/canvas/test/webgl-conformance/conformance/more/conformance/argGenerators-D_G.js
dom/canvas/test/webgl-conformance/conformance/more/conformance/argGenerators-G_I.js
dom/canvas/test/webgl-conformance/conformance/more/conformance/argGenerators-L_S.js
dom/canvas/test/webgl-conformance/conformance/more/conformance/argGenerators-S_V.js
dom/canvas/test/webgl-conformance/conformance/more/conformance/badArgsArityLessThanArgc.html
dom/canvas/test/webgl-conformance/conformance/more/conformance/constants.html
dom/canvas/test/webgl-conformance/conformance/more/conformance/fuzzTheAPI.html
dom/canvas/test/webgl-conformance/conformance/more/conformance/getContext.html
dom/canvas/test/webgl-conformance/conformance/more/conformance/methods.html
dom/canvas/test/webgl-conformance/conformance/more/conformance/quickCheckAPI-A.html
dom/canvas/test/webgl-conformance/conformance/more/conformance/quickCheckAPI-B1.html
dom/canvas/test/webgl-conformance/conformance/more/conformance/quickCheckAPI-B2.html
dom/canvas/test/webgl-conformance/conformance/more/conformance/quickCheckAPI-B3.html
dom/canvas/test/webgl-conformance/conformance/more/conformance/quickCheckAPI-B4.html
dom/canvas/test/webgl-conformance/conformance/more/conformance/quickCheckAPI-C.html
dom/canvas/test/webgl-conformance/conformance/more/conformance/quickCheckAPI-D_G.html
dom/canvas/test/webgl-conformance/conformance/more/conformance/quickCheckAPI-G_I.html
dom/canvas/test/webgl-conformance/conformance/more/conformance/quickCheckAPI-L_S.html
dom/canvas/test/webgl-conformance/conformance/more/conformance/quickCheckAPI-S_V.html
dom/canvas/test/webgl-conformance/conformance/more/conformance/quickCheckAPI.js
dom/canvas/test/webgl-conformance/conformance/more/conformance/quickCheckAPIBadArgs.html
dom/canvas/test/webgl-conformance/conformance/more/conformance/webGLArrays.html
dom/canvas/test/webgl-conformance/conformance/more/demos/opengl_web.html
dom/canvas/test/webgl-conformance/conformance/more/demos/video.html
dom/canvas/test/webgl-conformance/conformance/more/functions/bindBuffer.html
dom/canvas/test/webgl-conformance/conformance/more/functions/bindBufferBadArgs.html
dom/canvas/test/webgl-conformance/conformance/more/functions/bindFramebufferLeaveNonZero.html
dom/canvas/test/webgl-conformance/conformance/more/functions/bufferData.html
dom/canvas/test/webgl-conformance/conformance/more/functions/bufferDataBadArgs.html
dom/canvas/test/webgl-conformance/conformance/more/functions/bufferSubData.html
dom/canvas/test/webgl-conformance/conformance/more/functions/bufferSubDataBadArgs.html
dom/canvas/test/webgl-conformance/conformance/more/functions/copyTexImage2D.html
dom/canvas/test/webgl-conformance/conformance/more/functions/copyTexImage2DBadArgs.html
dom/canvas/test/webgl-conformance/conformance/more/functions/copyTexSubImage2D.html
dom/canvas/test/webgl-conformance/conformance/more/functions/copyTexSubImage2DBadArgs.html
dom/canvas/test/webgl-conformance/conformance/more/functions/deleteBufferBadArgs.html
dom/canvas/test/webgl-conformance/conformance/more/functions/drawArrays.html
dom/canvas/test/webgl-conformance/conformance/more/functions/drawArraysOutOfBounds.html
dom/canvas/test/webgl-conformance/conformance/more/functions/drawElements.html
dom/canvas/test/webgl-conformance/conformance/more/functions/drawElementsBadArgs.html
dom/canvas/test/webgl-conformance/conformance/more/functions/isTests.html
dom/canvas/test/webgl-conformance/conformance/more/functions/readPixels.html
dom/canvas/test/webgl-conformance/conformance/more/functions/readPixelsBadArgs.html
dom/canvas/test/webgl-conformance/conformance/more/functions/texImage2D.html
dom/canvas/test/webgl-conformance/conformance/more/functions/texImage2DBadArgs.html
dom/canvas/test/webgl-conformance/conformance/more/functions/texImage2DHTML.html
dom/canvas/test/webgl-conformance/conformance/more/functions/texImage2DHTMLBadArgs.html
dom/canvas/test/webgl-conformance/conformance/more/functions/texSubImage2D.html
dom/canvas/test/webgl-conformance/conformance/more/functions/texSubImage2DBadArgs.html
dom/canvas/test/webgl-conformance/conformance/more/functions/texSubImage2DHTML.html
dom/canvas/test/webgl-conformance/conformance/more/functions/texSubImage2DHTMLBadArgs.html
dom/canvas/test/webgl-conformance/conformance/more/functions/uniformMatrix.html
dom/canvas/test/webgl-conformance/conformance/more/functions/uniformMatrixBadArgs.html
dom/canvas/test/webgl-conformance/conformance/more/functions/uniformf.html
dom/canvas/test/webgl-conformance/conformance/more/functions/uniformfArrayLen1.html
dom/canvas/test/webgl-conformance/conformance/more/functions/uniformfBadArgs.html
dom/canvas/test/webgl-conformance/conformance/more/functions/uniformi.html
dom/canvas/test/webgl-conformance/conformance/more/functions/uniformiBadArgs.html
dom/canvas/test/webgl-conformance/conformance/more/functions/vertexAttrib.html
dom/canvas/test/webgl-conformance/conformance/more/functions/vertexAttribBadArgs.html
dom/canvas/test/webgl-conformance/conformance/more/functions/vertexAttribPointer.html
dom/canvas/test/webgl-conformance/conformance/more/functions/vertexAttribPointerBadArgs.html
dom/canvas/test/webgl-conformance/conformance/more/glsl/arrayOutOfBounds.html
dom/canvas/test/webgl-conformance/conformance/more/glsl/longLoops.html
dom/canvas/test/webgl-conformance/conformance/more/glsl/uniformOutOfBounds.html
dom/canvas/test/webgl-conformance/conformance/more/glsl/unusedAttribsUniforms.html
dom/canvas/test/webgl-conformance/conformance/more/index.html
dom/canvas/test/webgl-conformance/conformance/more/performance/CPUvsGPU.html
dom/canvas/test/webgl-conformance/conformance/more/performance/bandwidth.html
dom/canvas/test/webgl-conformance/conformance/more/performance/jsGCPause.html
dom/canvas/test/webgl-conformance/conformance/more/performance/jsMatrixMult.html
dom/canvas/test/webgl-conformance/conformance/more/performance/jsToGLOverhead.html
dom/canvas/test/webgl-conformance/conformance/more/unit.css
dom/canvas/test/webgl-conformance/conformance/more/unit.js
dom/canvas/test/webgl-conformance/conformance/more/util.js
dom/canvas/test/webgl-conformance/conformance/programs/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/programs/get-active-test.html
dom/canvas/test/webgl-conformance/conformance/programs/gl-bind-attrib-location-test.html
dom/canvas/test/webgl-conformance/conformance/programs/gl-get-active-attribute.html
dom/canvas/test/webgl-conformance/conformance/programs/gl-get-active-uniform.html
dom/canvas/test/webgl-conformance/conformance/programs/gl-getshadersource.html
dom/canvas/test/webgl-conformance/conformance/programs/gl-shader-test.html
dom/canvas/test/webgl-conformance/conformance/programs/invalid-UTF-16.html
dom/canvas/test/webgl-conformance/conformance/programs/program-test.html
dom/canvas/test/webgl-conformance/conformance/reading/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/reading/read-pixels-pack-alignment.html
dom/canvas/test/webgl-conformance/conformance/reading/read-pixels-test.html
dom/canvas/test/webgl-conformance/conformance/renderbuffers/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/renderbuffers/framebuffer-object-attachment.html
dom/canvas/test/webgl-conformance/conformance/renderbuffers/framebuffer-test.html
dom/canvas/test/webgl-conformance/conformance/renderbuffers/renderbuffer-initialization.html
dom/canvas/test/webgl-conformance/conformance/rendering/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/rendering/draw-arrays-out-of-bounds.html
dom/canvas/test/webgl-conformance/conformance/rendering/draw-elements-out-of-bounds.html
dom/canvas/test/webgl-conformance/conformance/rendering/gl-clear.html
dom/canvas/test/webgl-conformance/conformance/rendering/gl-drawelements.html
dom/canvas/test/webgl-conformance/conformance/rendering/gl-scissor-test.html
dom/canvas/test/webgl-conformance/conformance/rendering/line-loop-tri-fan.html
dom/canvas/test/webgl-conformance/conformance/rendering/more-than-65536-indices.html
dom/canvas/test/webgl-conformance/conformance/rendering/point-size.html
dom/canvas/test/webgl-conformance/conformance/rendering/triangle.html
dom/canvas/test/webgl-conformance/conformance/resources/3x3.png
dom/canvas/test/webgl-conformance/conformance/resources/blue-1x1.jpg
dom/canvas/test/webgl-conformance/conformance/resources/boolUniformShader.vert
dom/canvas/test/webgl-conformance/conformance/resources/bug-32888-texture.png
dom/canvas/test/webgl-conformance/conformance/resources/floatUniformShader.vert
dom/canvas/test/webgl-conformance/conformance/resources/fragmentShader.frag
dom/canvas/test/webgl-conformance/conformance/resources/glsl-conformance-test.js
dom/canvas/test/webgl-conformance/conformance/resources/glsl-feature-tests.css
dom/canvas/test/webgl-conformance/conformance/resources/glsl-generator.js
dom/canvas/test/webgl-conformance/conformance/resources/gray-ramp-256-with-128-alpha.png
dom/canvas/test/webgl-conformance/conformance/resources/gray-ramp-256.png
dom/canvas/test/webgl-conformance/conformance/resources/gray-ramp-default-gamma.png
dom/canvas/test/webgl-conformance/conformance/resources/gray-ramp-gamma0.1.png
dom/canvas/test/webgl-conformance/conformance/resources/gray-ramp-gamma1.0.png
dom/canvas/test/webgl-conformance/conformance/resources/gray-ramp-gamma2.0.png
dom/canvas/test/webgl-conformance/conformance/resources/gray-ramp-gamma4.0.png
dom/canvas/test/webgl-conformance/conformance/resources/gray-ramp-gamma9.0.png
dom/canvas/test/webgl-conformance/conformance/resources/gray-ramp.png
dom/canvas/test/webgl-conformance/conformance/resources/green-2x2-16bit.png
dom/canvas/test/webgl-conformance/conformance/resources/intArrayUniformShader.vert
dom/canvas/test/webgl-conformance/conformance/resources/intUniformShader.vert
dom/canvas/test/webgl-conformance/conformance/resources/matUniformShader.vert
dom/canvas/test/webgl-conformance/conformance/resources/noopUniformShader.frag
dom/canvas/test/webgl-conformance/conformance/resources/noopUniformShader.vert
dom/canvas/test/webgl-conformance/conformance/resources/npot-video.mp4
dom/canvas/test/webgl-conformance/conformance/resources/npot-video.theora.ogv
dom/canvas/test/webgl-conformance/conformance/resources/npot-video.webmvp8.webm
dom/canvas/test/webgl-conformance/conformance/resources/pnglib.js
dom/canvas/test/webgl-conformance/conformance/resources/red-green.mp4
dom/canvas/test/webgl-conformance/conformance/resources/red-green.png
dom/canvas/test/webgl-conformance/conformance/resources/red-green.theora.ogv
dom/canvas/test/webgl-conformance/conformance/resources/red-green.webmvp8.webm
dom/canvas/test/webgl-conformance/conformance/resources/red-indexed.png
dom/canvas/test/webgl-conformance/conformance/resources/samplerUniformShader.frag
dom/canvas/test/webgl-conformance/conformance/resources/small-square-with-cie-rgb-profile.png
dom/canvas/test/webgl-conformance/conformance/resources/small-square-with-colormatch-profile.png
dom/canvas/test/webgl-conformance/conformance/resources/small-square-with-colorspin-profile.jpg
dom/canvas/test/webgl-conformance/conformance/resources/small-square-with-colorspin-profile.png
dom/canvas/test/webgl-conformance/conformance/resources/small-square-with-e-srgb-profile.png
dom/canvas/test/webgl-conformance/conformance/resources/small-square-with-smpte-c-profile.png
dom/canvas/test/webgl-conformance/conformance/resources/small-square-with-srgb-iec61966-2.1-profile.png
dom/canvas/test/webgl-conformance/conformance/resources/structUniformShader.vert
dom/canvas/test/webgl-conformance/conformance/resources/vertexShader.vert
dom/canvas/test/webgl-conformance/conformance/resources/webgl-test-utils.js
dom/canvas/test/webgl-conformance/conformance/resources/webgl-test.js
dom/canvas/test/webgl-conformance/conformance/resources/zero-alpha.png
dom/canvas/test/webgl-conformance/conformance/state/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/state/gl-enable-enum-test.html
dom/canvas/test/webgl-conformance/conformance/state/gl-enum-tests.html
dom/canvas/test/webgl-conformance/conformance/state/gl-get-calls.html
dom/canvas/test/webgl-conformance/conformance/state/gl-geterror.html
dom/canvas/test/webgl-conformance/conformance/state/gl-getstring.html
dom/canvas/test/webgl-conformance/conformance/state/gl-object-get-calls.html
dom/canvas/test/webgl-conformance/conformance/textures/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/textures/compressed-tex-image.html
dom/canvas/test/webgl-conformance/conformance/textures/copy-tex-image-and-sub-image-2d.html
dom/canvas/test/webgl-conformance/conformance/textures/gl-pixelstorei.html
dom/canvas/test/webgl-conformance/conformance/textures/gl-teximage.html
dom/canvas/test/webgl-conformance/conformance/textures/origin-clean-conformance.html
dom/canvas/test/webgl-conformance/conformance/textures/tex-image-and-sub-image-2d-with-array-buffer-view.html
dom/canvas/test/webgl-conformance/conformance/textures/tex-image-and-sub-image-2d-with-canvas.html
dom/canvas/test/webgl-conformance/conformance/textures/tex-image-and-sub-image-2d-with-image-data.html
dom/canvas/test/webgl-conformance/conformance/textures/tex-image-and-sub-image-2d-with-image.html
dom/canvas/test/webgl-conformance/conformance/textures/tex-image-and-sub-image-2d-with-video.html
dom/canvas/test/webgl-conformance/conformance/textures/tex-image-and-uniform-binding-bugs.html
dom/canvas/test/webgl-conformance/conformance/textures/tex-image-with-format-and-type.html
dom/canvas/test/webgl-conformance/conformance/textures/tex-image-with-invalid-data.html
dom/canvas/test/webgl-conformance/conformance/textures/tex-input-validation.html
dom/canvas/test/webgl-conformance/conformance/textures/tex-sub-image-2d-bad-args.html
dom/canvas/test/webgl-conformance/conformance/textures/tex-sub-image-2d.html
dom/canvas/test/webgl-conformance/conformance/textures/texparameter-test.html
dom/canvas/test/webgl-conformance/conformance/textures/texture-active-bind-2.html
dom/canvas/test/webgl-conformance/conformance/textures/texture-active-bind.html
dom/canvas/test/webgl-conformance/conformance/textures/texture-clear.html
dom/canvas/test/webgl-conformance/conformance/textures/texture-complete.html
dom/canvas/test/webgl-conformance/conformance/textures/texture-formats-test.html
dom/canvas/test/webgl-conformance/conformance/textures/texture-mips.html
dom/canvas/test/webgl-conformance/conformance/textures/texture-npot-video.html
dom/canvas/test/webgl-conformance/conformance/textures/texture-npot.html
dom/canvas/test/webgl-conformance/conformance/textures/texture-size-cube-maps.html
dom/canvas/test/webgl-conformance/conformance/textures/texture-size.html
dom/canvas/test/webgl-conformance/conformance/textures/texture-transparent-pixels-initialized.html
dom/canvas/test/webgl-conformance/conformance/typedarrays/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/typedarrays/array-buffer-crash.html
dom/canvas/test/webgl-conformance/conformance/typedarrays/array-buffer-view-crash.html
dom/canvas/test/webgl-conformance/conformance/typedarrays/array-unit-tests.html
dom/canvas/test/webgl-conformance/conformance/uniforms/00_test_list.txt
dom/canvas/test/webgl-conformance/conformance/uniforms/gl-uniform-arrays.html
dom/canvas/test/webgl-conformance/conformance/uniforms/gl-uniform-bool.html
dom/canvas/test/webgl-conformance/conformance/uniforms/gl-uniformmatrix4fv.html
dom/canvas/test/webgl-conformance/conformance/uniforms/gl-unknown-uniform.html
dom/canvas/test/webgl-conformance/conformance/uniforms/null-uniform-location.html
dom/canvas/test/webgl-conformance/conformance/uniforms/uniform-location.html
dom/canvas/test/webgl-conformance/conformance/uniforms/uniform-samplers-test.html
dom/canvas/test/webgl-conformance/dont-load-image-from-internet.patch
dom/canvas/test/webgl-conformance/ext-texture-filter-anisotropic.patch
dom/canvas/test/webgl-conformance/extra/50x50pixel-black-with-red-triangle.png
dom/canvas/test/webgl-conformance/extra/big-fbos-example.html
dom/canvas/test/webgl-conformance/extra/canvas-compositing-test.html
dom/canvas/test/webgl-conformance/extra/canvas-compositing-test.png
dom/canvas/test/webgl-conformance/extra/fbo-lost-context.html
dom/canvas/test/webgl-conformance/extra/lots-of-polys-example.html
dom/canvas/test/webgl-conformance/extra/offscreen-issue.html
dom/canvas/test/webgl-conformance/extra/out-of-bounds-uniform-array-access.html
dom/canvas/test/webgl-conformance/extra/out-of-memory.html
dom/canvas/test/webgl-conformance/extra/out-of-resources.html
dom/canvas/test/webgl-conformance/extra/out-of-vram.html
dom/canvas/test/webgl-conformance/extra/simulated-attrib-0-bug-test.html
dom/canvas/test/webgl-conformance/extra/slow-shader-example.html
dom/canvas/test/webgl-conformance/extra/webgl-info.html
dom/canvas/test/webgl-conformance/fix-webgl-harness-async.patch
dom/canvas/test/webgl-conformance/gc.patch
dom/canvas/test/webgl-conformance/generate-wrappers-and-manifest.py
dom/canvas/test/webgl-conformance/iframe-autoresize.js
dom/canvas/test/webgl-conformance/log-more-info-about-test-failures.patch
dom/canvas/test/webgl-conformance/misc/program-test-1.html
dom/canvas/test/webgl-conformance/mochi-single.html
dom/canvas/test/webgl-conformance/mochi-wrapper.html.template
dom/canvas/test/webgl-conformance/mochitest-errata.ini
dom/canvas/test/webgl-conformance/mochitest.ini.template
dom/canvas/test/webgl-conformance/reference-cycle-test.patch
dom/canvas/test/webgl-conformance/resources/cors-util.js
dom/canvas/test/webgl-conformance/resources/desktop-gl-constants.js
dom/canvas/test/webgl-conformance/resources/js-test-pre.js
dom/canvas/test/webgl-conformance/resources/js-test-style.css
dom/canvas/test/webgl-conformance/resources/opengl_logo.jpg
dom/canvas/test/webgl-conformance/resources/thunderbird-logo-64x64.png
dom/canvas/test/webgl-conformance/resources/webgl-logo.png
dom/canvas/test/webgl-conformance/resources/webgl-test-harness.js
dom/canvas/test/webgl-conformance/webgl-conformance-tests.html
dom/canvas/test/webgl-mochitest.ini
dom/security/test/unit/test_isURIPotentiallyTrustworthy.js
security/nss/cmd/libpkix/pkix/checker/test_certchainchecker.c
security/nss/cmd/libpkix/pkix/store/test_store.c
security/nss/cmd/libpkix/testutil/testutil.c
security/nss/cmd/libpkix/testutil/testutil.h
security/nss/cmd/libpkix/testutil/testutil_nss.c
security/nss/cmd/libpkix/testutil/testutil_nss.h
security/nss/tests/memleak/memleak.sh
testing/mochitest/runtests.py
testing/web-platform/meta/dom/nodes/ChildNode-after.html.ini
testing/web-platform/meta/dom/nodes/ChildNode-before.html.ini
testing/web-platform/meta/dom/nodes/ChildNode-replaceWith.html.ini
testing/web-platform/meta/dom/nodes/ParentNode-append.html.ini
testing/web-platform/meta/dom/nodes/ParentNode-prepend.html.ini
testing/web-platform/meta/dom/nodes/append-on-Document.html.ini
testing/web-platform/meta/dom/nodes/prepend-on-Document.html.ini
toolkit/components/passwordmgr/test/test_notifications_popup.html
toolkit/components/telemetry/Histograms.json
--- a/accessible/base/TextAttrs.cpp
+++ b/accessible/base/TextAttrs.cpp
@@ -697,17 +697,17 @@ TextAttrsMgr::TextDecorValue::
   TextDecorValue(nsIFrame* aFrame)
 {
   const nsStyleTextReset* textReset = aFrame->StyleTextReset();
   mStyle = textReset->GetDecorationStyle();
 
   bool isForegroundColor = false;
   textReset->GetDecorationColor(mColor, isForegroundColor);
   if (isForegroundColor)
-    mColor = aFrame->StyleContext()->GetTextFillColor();
+    mColor = aFrame->StyleColor()->mColor;
 
   mLine = textReset->mTextDecorationLine &
     (NS_STYLE_TEXT_DECORATION_LINE_UNDERLINE |
      NS_STYLE_TEXT_DECORATION_LINE_LINE_THROUGH);
 }
 
 TextAttrsMgr::TextDecorTextAttr::
   TextDecorTextAttr(nsIFrame* aRootFrame, nsIFrame* aFrame) :
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -460,26 +460,26 @@ toolbar:not(#TabsToolbar) > #personal-bo
 .ac-url-text:-moz-locale-dir(rtl) {
   direction: ltr !important;
 }
 
 /* For non-action items, hide the action text; for action items, hide the URL
    text. */
 .ac-url[actiontype],
 .ac-action:not([actiontype]) {
-  visibility: collapse;
+  display: none;
 }
 
 /* For action items in a noactions popup, show the URL text and hide the action
    text and type icon. */
 #PopupAutoCompleteRichResult[noactions] > richlistbox > richlistitem.overridable-action > .ac-url {
-  visibility: visible;
+  display: -moz-box;
 }
 #PopupAutoCompleteRichResult[noactions] > richlistbox > richlistitem.overridable-action > .ac-action {
-  visibility: collapse;
+  display: none;
 }
 #PopupAutoCompleteRichResult[noactions] > richlistbox > richlistitem.overridable-action > .ac-type-icon {
   list-style-image: none;
 }
 
 #urlbar:not([actiontype="switchtab"]) > #urlbar-display-box {
   display: none;
 }
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -5455,17 +5455,17 @@ function handleLinkClick(event, href, li
   // first get document wide referrer policy, then
   // get referrer attribute from clicked link and parse it and
   // allow per element referrer to overrule the document wide referrer if enabled
   let referrerPolicy = doc.referrerPolicy;
   if (Services.prefs.getBoolPref("network.http.enablePerElementReferrer") &&
       linkNode) {
     let referrerAttrValue = Services.netUtils.parseAttributePolicyString(linkNode.
                             getAttribute("referrerpolicy"));
-    if (referrerAttrValue != Ci.nsIHttpChannel.REFERRER_POLICY_DEFAULT) {
+    if (referrerAttrValue != Ci.nsIHttpChannel.REFERRER_POLICY_UNSET) {
       referrerPolicy = referrerAttrValue;
     }
   }
 
   urlSecurityCheck(href, doc.nodePrincipal);
   let params = { charset: doc.characterSet,
                  allowMixedContent: persistAllowMixedContentInChildTab,
                  referrerURI: referrerURI,
--- a/browser/base/content/content.js
+++ b/browser/base/content/content.js
@@ -123,17 +123,17 @@ var handleContentContextMenu = function 
   let parentAllowsMixedContent = !!docShell.mixedContentChannel;
 
   // get referrer attribute from clicked link and parse it
   // if per element referrer is enabled, the element referrer overrules
   // the document wide referrer
   if (Services.prefs.getBoolPref("network.http.enablePerElementReferrer")) {
     let referrerAttrValue = Services.netUtils.parseAttributePolicyString(event.target.
                             getAttribute("referrerpolicy"));
-    if (referrerAttrValue !== Ci.nsIHttpChannel.REFERRER_POLICY_DEFAULT) {
+    if (referrerAttrValue !== Ci.nsIHttpChannel.REFERRER_POLICY_UNSET) {
       referrerPolicy = referrerAttrValue;
     }
   }
 
   let disableSetDesktopBg = null;
   // Media related cache info parent needs for saving
   let contentType = null;
   let contentDisposition = null;
@@ -414,17 +414,17 @@ var ClickEventHandler = {
     // get referrer attribute from clicked link and parse it
     // if per element referrer is enabled, the element referrer overrules
     // the document wide referrer
     let referrerPolicy = ownerDoc.referrerPolicy;
     if (Services.prefs.getBoolPref("network.http.enablePerElementReferrer") &&
         node) {
       let referrerAttrValue = Services.netUtils.parseAttributePolicyString(node.
                               getAttribute("referrerpolicy"));
-      if (referrerAttrValue !== Ci.nsIHttpChannel.REFERRER_POLICY_DEFAULT) {
+      if (referrerAttrValue !== Ci.nsIHttpChannel.REFERRER_POLICY_UNSET) {
         referrerPolicy = referrerAttrValue;
       }
     }
 
     let json = { button: event.button, shiftKey: event.shiftKey,
                  ctrlKey: event.ctrlKey, metaKey: event.metaKey,
                  altKey: event.altKey, href: null, title: null,
                  bookmark: false, referrerPolicy: referrerPolicy };
--- a/browser/base/content/urlbarBindings.xml
+++ b/browser/base/content/urlbarBindings.xml
@@ -1343,17 +1343,17 @@ file, You can obtain one at http://mozil
         <parameter name="aInput"/>
         <parameter name="aElement"/>
         <body><![CDATA[
           if (this.mPopupOpen) {
             return;
           }
 
           this.mInput = aInput;
-          this.selectedIndex = -1;
+          this.selectedIndex = this._isFirstResultHeuristic ? 0 : -1;
           this.view = aInput.controller.QueryInterface(Components.interfaces.nsITreeView);
           this.invalidate();
 
           var rect = window.document.documentElement.getBoundingClientRect();
           var width = rect.right - rect.left;
           this.setAttribute("width", width);
 
           // Adjust the direction of the autocomplete popup list based on the textbox direction, bug 649840
--- a/browser/extensions/loop/bootstrap.js
+++ b/browser/extensions/loop/bootstrap.js
@@ -188,26 +188,37 @@ var WindowListener = {
       /**
        * Opens the panel for Loop and sizes it appropriately.
        *
        * @param {event}  event   The event opening the panel, used to anchor
        *                         the panel to the button which triggers it.
        * @return {Promise}
        */
       openPanel: function(event) {
+        if (PrivateBrowsingUtils.isWindowPrivate(window)) {
+          return Promise.reject();
+        }
+
         return new Promise((resolve) => {
           let callback = iframe => {
             let mm = iframe.QueryInterface(Ci.nsIFrameLoaderOwner).frameLoader.messageManager;
             if (!("messageManager" in iframe)) {
               iframe.messageManager = mm;
             }
-            this.hookWindowCloseForPanelClose(iframe);
+
+            if (!this._panelInitialized) {
+              this.hookWindowCloseForPanelClose(iframe);
+              this._panelInitialized = true;
+            }
 
             mm.sendAsyncMessage("Social:WaitForDocumentVisible");
-            mm.addMessageListener("Social:DocumentVisible", () => resolve(mm));
+            mm.addMessageListener("Social:DocumentVisible", function onDocumentVisible() {
+              mm.removeMessageListener("Social:DocumentVisible", onDocumentVisible);
+              resolve(mm);
+            });
 
             let buckets = this.constants.LOOP_MAU_TYPE;
             this.LoopAPI.sendMessageToHandler({
               name: "TelemetryAddValue",
               data: ["LOOP_ACTIVITY_COUNTER", buckets.OPEN_PANEL]
             });
           };
 
--- a/browser/extensions/loop/chrome/test/mochitest/.eslintrc
+++ b/browser/extensions/loop/chrome/test/mochitest/.eslintrc
@@ -13,16 +13,17 @@
     "is": false,
     "info": false,
     "ok": false,
     "registerCleanupFunction": false,
     // head.js items
     "HAWK_TOKEN_LENGTH": true,
     "checkLoggedOutState": false,
     "checkFxAOAuthTokenData": false,
+    "cleanupPanel": false,
     "loadLoopPanel": false,
     "getLoopString": false,
     "gMozLoopAPI": true,
     "mockDb": true,
     "mockPushHandler": true,
     "OpenBrowserWindow": true,
     "promiseDeletedOAuthParams": false,
     "promiseOAuthGetRegistration": false,
--- a/browser/extensions/loop/chrome/test/mochitest/browser.ini
+++ b/browser/extensions/loop/chrome/test/mochitest/browser.ini
@@ -10,13 +10,14 @@ support-files =
 [browser_loop_fxa_server.js]
 [browser_LoopRooms_channel.js]
 [browser_menuitem.js]
 [browser_mozLoop_appVersionInfo.js]
 [browser_mozLoop_chat.js]
 [browser_mozLoop_context.js]
 [browser_mozLoop_infobar.js]
 [browser_mozLoop_socialShare.js]
+[browser_panel_privateBrowsing.js]
 [browser_mozLoop_sharingListeners.js]
 [browser_mozLoop_telemetry.js]
 [browser_sharingTitleListeners.js]
 [browser_throttler.js]
 [browser_toolbarbutton.js]
--- a/browser/extensions/loop/chrome/test/mochitest/browser_copypanel.js
+++ b/browser/extensions/loop/chrome/test/mochitest/browser_copypanel.js
@@ -3,20 +3,21 @@
 
 "use strict";
 
 let gConstants;
 LoopAPI.inspect()[1].GetAllConstants({}, constants => { return (gConstants = constants); });
 
 let { goDoCommand, gURLBar } = window;
 
-registerCleanupFunction(() => {
-  document.getElementById("loop-notification-panel").hidePopup();
+function cleanUp() {
+  cleanupPanel();
   LoopUI.removeCopyPanel();
-});
+}
+registerCleanupFunction(cleanUp);
 
 /**
  * Cleanup function to allow the loop panel to finish opening then close it.
  */
 function waitForLoopPanelShowHide() {
   return new Promise(resolve => {
     let panel = document.getElementById("loop-notification-panel");
     panel.addEventListener("popupshown", function onShow() {
@@ -27,29 +28,29 @@ function waitForLoopPanelShowHide() {
       panel.removeEventListener("popuphidden", onHidden);
       resolve();
     });
   });
 }
 
 // Even with max threshold, no panel if already shown.
 add_task(function* test_init_copy_panel_already_shown() {
-  LoopUI.removeCopyPanel();
+  cleanUp();
   Services.prefs.setIntPref("loop.copy.ticket", -1);
   Services.prefs.setBoolPref("loop.copy.shown", true);
 
   yield LoopUI.maybeAddCopyPanel();
 
   Assert.equal(document.getElementById("loop-copy-notification-panel"), null, "copy panel doesn't exist for already shown");
   Assert.equal(Services.prefs.getIntPref("loop.copy.ticket"), -1, "ticket should be unchanged");
 });
 
 // Even with max threshold, no panel if private browsing.
 add_task(function* test_init_copy_panel_private() {
-  LoopUI.removeCopyPanel();
+  cleanUp();
   Services.prefs.setIntPref("loop.copy.ticket", -1);
 
   let win = OpenBrowserWindow({ private: true });
   yield new Promise(resolve => win.addEventListener("load", resolve));
   yield win.LoopUI.maybeAddCopyPanel();
 
   Assert.equal(win.document.getElementById("loop-copy-notification-panel"), null, "copy panel doesn't exist for private browsing");
   Assert.equal(Services.prefs.getIntPref("loop.copy.ticket"), -1, "ticket should be unchanged");
@@ -60,17 +61,17 @@ add_task(function* test_init_copy_panel_
 /**
  * Helper function for testing clicks on the copy panel.
  * @param {String} domain Text to put in the urlbar to assist in debugging.
  * @param {Function} onIframe Callback to interact with iframe contents.
  */
 function testClick(domain, onIframe) {
   let histogram = Services.telemetry.getHistogramById("LOOP_COPY_PANEL_ACTIONS");
   histogram.clear();
-  LoopUI.removeCopyPanel();
+  cleanUp();
   gURLBar.value = "http://" + domain + "/";
 
   return new Promise(resolve => {
     // Continue testing when the click has been handled.
     LoopUI.addCopyPanel(detail => resolve([histogram, detail]));
     gURLBar.focus();
     gURLBar.select();
     goDoCommand("cmd_copy");
new file mode 100644
--- /dev/null
+++ b/browser/extensions/loop/chrome/test/mochitest/browser_panel_privateBrowsing.js
@@ -0,0 +1,37 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+var win;
+
+registerCleanupFunction(function* () {
+  if (win) {
+    yield BrowserTestUtils.closeWindow(win);
+  }
+});
+
+add_task(function* test_panel_should_be_shown() {
+  registerCleanupFunction(function* () {
+    cleanupPanel();
+  });
+
+  yield window.LoopUI.openPanel();
+
+  Assert.notEqual(document.getElementById("loop-notification-panel"), null, "Panel exists");
+});
+
+add_task(function* test_init_copy_panel_private() {
+  let rejected = false;
+  win = yield BrowserTestUtils.openNewBrowserWindow({ private: true });
+
+  try {
+    yield win.LoopUI.openPanel();
+  }
+  catch (ex) {
+    rejected = true;
+  }
+
+  Assert.ok(rejected, "openPanel promise should have been rejected");
+  Assert.equal(win.document.getElementById("loop-notification-panel").childNodes.length, 0, "Panel doesn't exist for private browsing");
+});
--- a/browser/extensions/loop/chrome/test/mochitest/head.js
+++ b/browser/extensions/loop/chrome/test/mochitest/head.js
@@ -1,32 +1,44 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 /* exported HAWK_TOKEN_LENGTH, LoopRooms, promiseWaitForCondition,
             loadLoopPanel, promiseOAuthParamsSetup, resetFxA, checkLoggedOutState,
             promiseDeletedOAuthParams, promiseOAuthGetRegistration,
-            getLoopString, mockPushHandler, channelID, mockDb, LoopAPI */
+            getLoopString, mockPushHandler, channelID, mockDb, LoopAPI,
+            cleanupPanel */
 
 const HAWK_TOKEN_LENGTH = 64;
 const {
   LOOP_SESSION_TYPE,
   MozLoopServiceInternal,
   MozLoopService
 } = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {});
 const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {});
 const { LoopRooms } = Cu.import("chrome://loop/content/modules/LoopRooms.jsm", {});
 
 // Cache this value only once, at the beginning of a
 // test run, so that it doesn't pick up the offline=true
 // if offline mode is requested multiple times in a test run.
 const WAS_OFFLINE = Services.io.offline;
 
+function cleanupPanel() {
+  let loopPanel = document.getElementById("loop-notification-panel");
+  loopPanel.hidePopup();
+  let btn = document.getElementById("loop-button");
+  let frameId = btn.getAttribute("notificationFrameId");
+  let frame = document.getElementById(frameId);
+  if (frame) {
+    frame.remove();
+  }
+}
+
 function promisePanelLoaded() {
   return new Promise((resolve) => {
     let loopPanel = document.getElementById("loop-notification-panel");
     let btn = document.getElementById("loop-button");
 
     // Wait for the popup to be shown if it's not already, then we can get the iframe and
     // wait for the iframe's load to be completed.
     if (loopPanel.state == "closing" || loopPanel.state == "closed") {
@@ -43,35 +55,29 @@ function promisePanelLoaded() {
 
     function onpopupshown() {
       let iframe = document.getElementById(btn.getAttribute("notificationFrameId"));
 
       if (iframe.contentDocument &&
           iframe.contentDocument.readyState == "complete") {
         resolve();
       } else {
-        iframe.addEventListener("load", function panelOnLoad() {
-          iframe.removeEventListener("load", panelOnLoad, true);
-          // We do this in an execute soon to allow any other event listeners to
-          // be handled, just in case.
+        // Wait for the panel to completely load before continuing.
+        iframe.contentWindow.addEventListener("loopPanelInitialized", function onInit() {
+          iframe.contentWindow.removeEventListener("loopPanelInitialized", onInit);
           resolve();
-        }, true);
+        });
       }
     }
 
     // Remove the iframe after each test. This also avoids mochitest complaining
     // about leaks on shutdown as we intentionally hold the iframe open for the
     // life of the application.
     registerCleanupFunction(function() {
-      loopPanel.hidePopup();
-      let frameId = btn.getAttribute("notificationFrameId");
-      let frame = document.getElementById(frameId);
-      if (frame) {
-        frame.remove();
-      }
+      cleanupPanel();
     });
   });
 }
 
 function waitForCondition(condition, nextTest, errorMsg) {
   var tries = 0;
   var interval = setInterval(function() {
     if (tries >= 200) {
--- a/browser/extensions/loop/install.rdf.in
+++ b/browser/extensions/loop/install.rdf.in
@@ -4,17 +4,17 @@
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 
 #filter substitution
 
 <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
   <Description about="urn:mozilla:install-manifest">
     <em:id>loop@mozilla.org</em:id>
     <em:bootstrap>true</em:bootstrap>
-    <em:version>1.3.0</em:version>
+    <em:version>1.3.1</em:version>
     <em:type>2</em:type>
 
     <!-- Target Application this extension can install into,
          with minimum and maximum supported versions. -->
     <em:targetApplication>
       <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
         <em:minVersion>46.0a1</em:minVersion>
--- a/browser/locales/en-US/chrome/browser/preferences/blocklists.dtd
+++ b/browser/locales/en-US/chrome/browser/preferences/blocklists.dtd
@@ -1,14 +1,14 @@
 <!-- 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/. -->
 
 <!ENTITY window.title                 "Block Lists">
-<!ENTITY window.width                 "50em">
+<!ENTITY window.width                 "55em">
 
 <!ENTITY treehead.list.label          "List">
 <!ENTITY windowClose.key              "w">
 
 <!ENTITY button.cancel.label          "Cancel">
 <!ENTITY button.cancel.accesskey      "C">
 <!ENTITY button.ok.label              "Save Changes">
 <!ENTITY button.ok.accesskey          "S">
--- a/browser/modules/ContentWebRTC.jsm
+++ b/browser/modules/ContentWebRTC.jsm
@@ -279,59 +279,74 @@ function updateIndicators() {
   // have the same top level window several times. We use a Set to avoid
   // sending duplicate notifications.
   let contentWindows = new Set();
   for (let i = 0; i < count; ++i) {
     contentWindows.add(contentWindowSupportsArray.GetElementAt(i).top);
   }
 
   for (let contentWindow of contentWindows) {
-    let camera = {}, microphone = {}, screen = {}, window = {}, app = {}, browser = {};
-    MediaManagerService.mediaCaptureWindowState(contentWindow, camera, microphone,
-                                                screen, window, app, browser);
-    let tabState = {camera: camera.value, microphone: microphone.value};
-    if (camera.value)
+    let tabState = getTabStateForContentWindow(contentWindow);
+    if (tabState.camera)
       state.showCameraIndicator = true;
-    if (microphone.value)
+    if (tabState.microphone)
       state.showMicrophoneIndicator = true;
-    if (screen.value) {
-      state.showScreenSharingIndicator = "Screen";
-      tabState.screen = "Screen";
+    if (tabState.screen) {
+      if (tabState.screen == "Screen") {
+        state.showScreenSharingIndicator = "Screen";
+      }
+      else if (tabState.screen == "Window") {
+        if (state.showScreenSharingIndicator != "Screen")
+          state.showScreenSharingIndicator = "Window";
+      }
+      else if (tabState.screen == "Application") {
+        if (!state.showScreenSharingIndicator)
+          state.showScreenSharingIndicator = "Application";
+      }
+      else if (tabState.screen == "Browser") {
+        if (!state.showScreenSharingIndicator)
+          state.showScreenSharingIndicator = "Browser";
+      }
     }
-    else if (window.value) {
-      if (state.showScreenSharingIndicator != "Screen")
-        state.showScreenSharingIndicator = "Window";
-      tabState.screen = "Window";
-    }
-    else if (app.value) {
-      if (!state.showScreenSharingIndicator)
-        state.showScreenSharingIndicator = "Application";
-      tabState.screen = "Application";
-    }
-    else if (browser.value) {
-      if (!state.showScreenSharingIndicator)
-        state.showScreenSharingIndicator = "Browser";
-      tabState.screen = "Browser";
-    }
-
-    tabState.windowId = getInnerWindowIDForWindow(contentWindow);
-    tabState.documentURI = contentWindow.document.documentURI;
     let mm = getMessageManagerForWindow(contentWindow);
     mm.sendAsyncMessage("webrtc:UpdateBrowserIndicators", tabState);
   }
 
   cpmm.sendAsyncMessage("webrtc:UpdateGlobalIndicators", state);
 }
 
 function removeBrowserSpecificIndicator(aSubject, aTopic, aData) {
-  let contentWindow = Services.wm.getOuterWindowWithId(aData);
+  let contentWindow = Services.wm.getOuterWindowWithId(aData).top;
+  let tabState = getTabStateForContentWindow(contentWindow);
+  if (!tabState.camera && !tabState.microphone && !tabState.screen)
+    tabState = {windowId: tabState.windowId};
+
   let mm = getMessageManagerForWindow(contentWindow);
   if (mm)
-    mm.sendAsyncMessage("webrtc:UpdateBrowserIndicators",
-                        {windowId: getInnerWindowIDForWindow(contentWindow)});
+    mm.sendAsyncMessage("webrtc:UpdateBrowserIndicators", tabState);
+}
+
+function getTabStateForContentWindow(aContentWindow) {
+  let camera = {}, microphone = {}, screen = {}, window = {}, app = {}, browser = {};
+  MediaManagerService.mediaCaptureWindowState(aContentWindow, camera, microphone,
+                                              screen, window, app, browser);
+  let tabState = {camera: camera.value, microphone: microphone.value};
+  if (screen.value)
+    tabState.screen = "Screen";
+  else if (window.value)
+    tabState.screen = "Window";
+  else if (app.value)
+    tabState.screen = "Application";
+  else if (browser.value)
+    tabState.screen = "Browser";
+
+  tabState.windowId = getInnerWindowIDForWindow(aContentWindow);
+  tabState.documentURI = aContentWindow.document.documentURI;
+
+  return tabState;
 }
 
 function getInnerWindowIDForWindow(aContentWindow) {
   return aContentWindow.QueryInterface(Ci.nsIInterfaceRequestor)
                        .getInterface(Ci.nsIDOMWindowUtils)
                        .currentInnerWindowID;
 }
 
--- a/browser/modules/webrtcUI.jsm
+++ b/browser/modules/webrtcUI.jsm
@@ -220,17 +220,28 @@ this.webrtcUI = {
         break;
       case "webrtc:UpdatingIndicators":
         webrtcUI._streams = [];
         break;
       case "webrtc:UpdateGlobalIndicators":
         updateIndicators(aMessage.data, aMessage.target);
         break;
       case "webrtc:UpdateBrowserIndicators":
-        webrtcUI._streams.push({browser: aMessage.target, state: aMessage.data});
+        let id = aMessage.data.windowId;
+        let index;
+        for (index = 0; index < webrtcUI._streams.length; ++index) {
+          if (webrtcUI._streams[index].state.windowId == id)
+            break;
+        }
+        // If there's no documentURI, the update is actually a removal of the
+        // stream, triggered by the recording-window-ended notification.
+        if (!aMessage.data.documentURI && index < webrtcUI._streams.length)
+          webrtcUI._streams.splice(index, 1);
+        else
+          webrtcUI._streams[index] = {browser: aMessage.target, state: aMessage.data};
         updateBrowserSpecificIndicator(aMessage.target, aMessage.data);
         break;
       case "child-process-shutdown":
         webrtcUI.processIndicators.delete(aMessage.target);
         updateIndicators(null, null);
         break;
     }
   }
--- a/build/sanitizers/lsan_suppressions.txt
+++ b/build/sanitizers/lsan_suppressions.txt
@@ -71,22 +71,16 @@ leak:nsPSPrinterList::GetPrinterList
 leak:_PR_Getfd
 
 # Bug 1028483 - The XML parser sometimes leaks an object. bc3
 leak:processInternalEntity
 
 # Bug 1187421 - With e10s, NSS does not always free the error stack. m1.
 leak:nss_ClearErrorStack
 
-# Bug 1122045 - Leaks in MessageLoop::MessageLoop()
-leak:MessageLoop::MessageLoop
-# This may not actually be related to MessageLoop.
-leak:base::WaitableEvent::TimedWait
-leak:MessageLoop::PostTask_Helper
-
 # Bug 1189430 - DNS leaks in mochitest-chrome.
 leak:nsDNSService::AsyncResolveExtended
 leak:_GetAddrInfo_Portable
 
 # Bug 1189568 - Indirect leaks of IMContextWrapper and nsIntRect.
 leak:nsWindow::Create
 leak:nsBaseWidget::StoreWindowClipRegion
 
--- a/devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-parameters-02.js
+++ b/devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-parameters-02.js
@@ -515,25 +515,25 @@ function testGetterSetterObject() {
     is(propEnums.length, 0,
       "The propEnums should contain all the created enumerable elements.");
     is(propNonEnums.length, 2,
       "The propEnums should contain all the created non-enumerable elements.");
 
     is(propNonEnums[0].querySelector(".name").getAttribute("value"), "get",
       "Should have the right property name for 'get'.");
     is(propNonEnums[0].querySelector(".value").getAttribute("value"),
-      "test/myVar.prop()",
+      "get prop()",
       "Should have the right property value for 'get'.");
     ok(propNonEnums[0].querySelector(".value").className.includes("token-other"),
       "Should have the right token class for 'get'.");
 
     is(propNonEnums[1].querySelector(".name").getAttribute("value"), "set",
       "Should have the right property name for 'set'.");
     is(propNonEnums[1].querySelector(".value").getAttribute("value"),
-      "test/myVar.prop(val)",
+      "set prop(val)",
       "Should have the right property value for 'set'.");
     ok(propNonEnums[1].querySelector(".value").className.includes("token-other"),
       "Should have the right token class for 'set'.");
 
     deferred.resolve();
   });
 
   myVar.expand();
--- a/devtools/client/inspector/breadcrumbs.js
+++ b/devtools/client/inspector/breadcrumbs.js
@@ -6,16 +6,17 @@
 
 "use strict";
 
 const {Cu, Ci} = require("chrome");
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 const Services = require("Services");
 const promise = require("promise");
 const FocusManager = Services.focus;
+const {waitForTick} = require("devtools/shared/DevToolsUtils");
 
 const ENSURE_SELECTION_VISIBLE_DELAY = 50; // ms
 const ELLIPSIS = Services.prefs.getComplexValue("intl.ellipsis", Ci.nsIPrefLocalizedString).data;
 const MAX_LABEL_LENGTH = 40;
 const LOW_PRIORITY_ELEMENTS = {
   "HEAD": true,
   "BASE": true,
   "BASEFONT": true,
@@ -655,17 +656,17 @@ HTMLBreadcrumbs.prototype = {
         // If the node has a child and we've not been destroyed in the meantime
         if (child && !this.isDestroyed) {
           // Show this child
           this.expand(child);
         }
       });
     }
 
-    return resolveNextTick(true);
+    return waitForTick().then(() => true);
   },
 
   /**
    * Ensure the selected node is visible.
    */
   scroll: function() {
     // FIXME bug 684352: make sure its immediate neighbors are visible too.
 
@@ -808,33 +809,18 @@ HTMLBreadcrumbs.prototype = {
       if (this.isDestroyed) {
         return;
       }
 
       this.updateSelectors();
 
       // Make sure the selected node and its neighbours are visible.
       this.scroll();
-      return resolveNextTick().then(() => {
+      return waitForTick().then(() => {
         this.inspector.emit("breadcrumbs-updated", this.selection.nodeFront);
         doneUpdating();
       });
     }).catch(err => {
       doneUpdating(this.selection.nodeFront);
       this.selectionGuardEnd(err);
     });
   }
 };
-
-/**
- * Returns a promise that resolves at the next main thread tick.
- */
-function resolveNextTick(value) {
-  let deferred = promise.defer();
-  Services.tm.mainThread.dispatch(() => {
-    try {
-      deferred.resolve(value);
-    } catch(e) {
-      deferred.reject(e);
-    }
-  }, Ci.nsIThread.DISPATCH_NORMAL);
-  return deferred.promise;
-}
--- a/devtools/client/inspector/inspector-panel.js
+++ b/devtools/client/inspector/inspector-panel.js
@@ -8,16 +8,17 @@
 
 const {Cc, Ci, Cu} = require("chrome");
 
 var Services = require("Services");
 var promise = require("promise");
 var EventEmitter = require("devtools/shared/event-emitter");
 var clipboard = require("sdk/clipboard");
 var {HostType} = require("devtools/client/framework/toolbox").Toolbox;
+const {executeSoon} = require("devtools/shared/DevToolsUtils");
 
 loader.lazyRequireGetter(this, "CSS", "CSS");
 
 loader.lazyGetter(this, "MarkupView", () => require("devtools/client/inspector/markup/markup").MarkupView);
 loader.lazyGetter(this, "HTMLBreadcrumbs", () => require("devtools/client/inspector/breadcrumbs").HTMLBreadcrumbs);
 loader.lazyGetter(this, "ToolSidebar", () => require("devtools/client/framework/sidebar").ToolSidebar);
 loader.lazyGetter(this, "InspectorSearch", () => require("devtools/client/inspector/inspector-search").InspectorSearch);
 loader.lazyGetter(this, "RuleViewTool", () => require("devtools/client/inspector/rules/rules").RuleViewTool);
@@ -506,23 +507,23 @@ InspectorPanel.prototype = {
         } else {
           console.warn("Could not set the unique selector for the newly "+
             "selected node, the inspector was destroyed.");
         }
       });
     }
 
     let selfUpdate = this.updating("inspector-panel");
-    Services.tm.mainThread.dispatch(() => {
+    executeSoon(() => {
       try {
         selfUpdate(selection);
-      } catch(ex) {
+      } catch (ex) {
         console.error(ex);
       }
-    }, Ci.nsIThread.DISPATCH_NORMAL);
+    });
   },
 
   /**
    * Delay the "inspector-updated" notification while a tool
    * is updating itself.  Returns a function that must be
    * invoked when the tool is done updating with the node
    * that the tool is viewing.
    */
--- a/devtools/client/responsive.html/test/browser/browser.ini
+++ b/devtools/client/responsive.html/test/browser/browser.ini
@@ -10,13 +10,13 @@ support-files =
   !/devtools/client/framework/test/shared-redux-head.js
 
 [browser_device_modal_exit.js]
 [browser_device_modal_submit.js]
 [browser_device_width.js]
 [browser_exit_button.js]
 [browser_menu_item_01.js]
 [browser_menu_item_02.js]
-skip-if = os == "win" && debug # Bug 1267278 - RDM's browser_menu_item_02 test is failing on Windows Debug
+skip-if = (e10s && debug) # Bug 1267278: browser.xul leaks
 [browser_mouse_resize.js]
 [browser_resize_cmd.js]
 [browser_screenshot_button.js]
 [browser_viewport_basics.js]
--- a/devtools/client/sourceeditor/codemirror/README
+++ b/devtools/client/sourceeditor/codemirror/README
@@ -1,16 +1,16 @@
 This is the CodeMirror editor packaged for the Mozilla Project. CodeMirror
 is a JavaScript component that provides a code editor in the browser. When
 a mode is available for the language you are coding in, it will color your
 code, and optionally help with indentation.
 
 # Upgrade
 
-Currently used version is 5.13.2. To upgrade, download a new version of
+Currently used version is 5.14.2. To upgrade, download a new version of
 CodeMirror from the project's page [1] and replace all JavaScript and
 CSS files inside the codemirror directory [2].
 
 To confirm the functionality run mochitests for the following components:
 
  * sourceeditor
  * scratchpad
  * debugger
--- a/devtools/client/sourceeditor/codemirror/addon/comment/comment.js
+++ b/devtools/client/sourceeditor/codemirror/addon/comment/comment.js
@@ -39,29 +39,36 @@
       } else if (mode == "un") {
         cm.uncomment(from, to, options);
       } else {
         cm.lineComment(from, to, options);
       }
     }
   });
 
+  // Rough heuristic to try and detect lines that are part of multi-line string
+  function probablyInsideString(cm, pos, line) {
+    return /\bstring\b/.test(cm.getTokenTypeAt(Pos(pos.line, 0))) && !/^[\'\"`]/.test(line)
+  }
+
   CodeMirror.defineExtension("lineComment", function(from, to, options) {
     if (!options) options = noOptions;
     var self = this, mode = self.getModeAt(from);
+    var firstLine = self.getLine(from.line);
+    if (firstLine == null || probablyInsideString(self, from, firstLine)) return;
+
     var commentString = options.lineComment || mode.lineComment;
     if (!commentString) {
       if (options.blockCommentStart || mode.blockCommentStart) {
         options.fullLines = true;
         self.blockComment(from, to, options);
       }
       return;
     }
-    var firstLine = self.getLine(from.line);
-    if (firstLine == null) return;
+
     var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1);
     var pad = options.padding == null ? " " : options.padding;
     var blankLines = options.commentBlankLines || from.line == to.line;
 
     self.operation(function() {
       if (options.indent) {
         var baseString = null;
         for (var i = from.line; i < end; ++i) {
--- a/devtools/client/sourceeditor/codemirror/addon/hint/show-hint.js
+++ b/devtools/client/sourceeditor/codemirror/addon/hint/show-hint.js
@@ -103,25 +103,21 @@
       } else {
         var self = this;
         this.debounce = requestAnimationFrame(function() {self.update();});
         if (this.widget) this.widget.disable();
       }
     },
 
     update: function(first) {
-      if (this.tick == null) return;
-      if (!this.options.hint.async) {
-        this.finishUpdate(this.options.hint(this.cm, this.options), first);
-      } else {
-        var myTick = ++this.tick, self = this;
-        this.options.hint(this.cm, function(data) {
-          if (self.tick == myTick) self.finishUpdate(data, first);
-        }, this.options);
-      }
+      if (this.tick == null) return
+      var self = this, myTick = ++this.tick
+      fetchHints(this.options.hint, this.cm, this.options, function(data) {
+        if (self.tick == myTick) self.finishUpdate(data, first)
+      })
     },
 
     finishUpdate: function(data, first) {
       if (this.data) CodeMirror.signal(this.data, "update");
 
       var picked = (this.widget && this.widget.picked) || (first && this.options.completeSingle);
       if (this.widget) this.widget.close();
 
@@ -357,50 +353,41 @@
   function applicableHelpers(cm, helpers) {
     if (!cm.somethingSelected()) return helpers
     var result = []
     for (var i = 0; i < helpers.length; i++)
       if (helpers[i].supportsSelection) result.push(helpers[i])
     return result
   }
 
+  function fetchHints(hint, cm, options, callback) {
+    if (hint.async) {
+      hint(cm, callback, options)
+    } else {
+      var result = hint(cm, options)
+      if (result && result.then) result.then(callback)
+      else callback(result)
+    }
+  }
+
   function resolveAutoHints(cm, pos) {
     var helpers = cm.getHelpers(pos, "hint"), words
     if (helpers.length) {
-      var async = false, resolved
-      for (var i = 0; i < helpers.length; i++) if (helpers[i].async) async = true
-      if (async) {
-        resolved = function(cm, callback, options) {
-          var app = applicableHelpers(cm, helpers)
-          function run(i, result) {
-            if (i == app.length) return callback(null)
-            var helper = app[i]
-            if (helper.async) {
-              helper(cm, function(result) {
-                if (result) callback(result)
-                else run(i + 1)
-              }, options)
-            } else {
-              var result = helper(cm, options)
-              if (result) callback(result)
-              else run(i + 1)
-            }
-          }
-          run(0)
+      var resolved = function(cm, callback, options) {
+        var app = applicableHelpers(cm, helpers);
+        function run(i) {
+          if (i == app.length) return callback(null)
+          fetchHints(app[i], cm, options, function(result) {
+            if (result && result.list.length > 0) callback(result)
+            else run(i + 1)
+          })
         }
-        resolved.async = true
-      } else {
-        resolved = function(cm, options) {
-          var app = applicableHelpers(cm, helpers)
-          for (var i = 0; i < app.length; i++) {
-            var cur = app[i](cm, options)
-            if (cur && cur.list.length) return cur
-          }
-        }
+        run(0)
       }
+      resolved.async = true
       resolved.supportsSelection = true
       return resolved
     } else if (words = cm.getHelper(cm.getCursor(), "hintWords")) {
       return function(cm) { return CodeMirror.hint.fromList(cm, {words: words}) }
     } else if (CodeMirror.hint.anyword) {
       return function(cm, options) { return CodeMirror.hint.anyword(cm, options) }
     } else {
       return function() {}
--- a/devtools/client/sourceeditor/codemirror/addon/search/match-highlighter.js
+++ b/devtools/client/sourceeditor/codemirror/addon/search/match-highlighter.js
@@ -11,47 +11,43 @@
 // {minChars, style, wordsOnly, showToken, delay} object to explicitly
 // configure it. minChars is the minimum amount of characters that should be
 // selected for the behavior to occur, and style is the token style to
 // apply to the matches. This will be prefixed by "cm-" to create an
 // actual CSS class name. If wordsOnly is enabled, the matches will be
 // highlighted only if the selected text is a word. showToken, when enabled,
 // will cause the current token to be highlighted when nothing is selected.
 // delay is used to specify how much time to wait, in milliseconds, before
-// highlighting the matches. If annotateScrollbar is enabled, the occurances
+// highlighting the matches. If annotateScrollbar is enabled, the occurences
 // will be highlighted on the scrollbar via the matchesonscrollbar addon.
 
 (function(mod) {
   if (typeof exports == "object" && typeof module == "object") // CommonJS
     mod(require("../../lib/codemirror"), require("./matchesonscrollbar"));
   else if (typeof define == "function" && define.amd) // AMD
     define(["../../lib/codemirror", "./matchesonscrollbar"], mod);
   else // Plain browser env
     mod(CodeMirror);
 })(function(CodeMirror) {
   "use strict";
 
-  var DEFAULT_MIN_CHARS = 2;
-  var DEFAULT_TOKEN_STYLE = "matchhighlight";
-  var DEFAULT_DELAY = 100;
-  var DEFAULT_WORDS_ONLY = false;
+  var defaults = {
+    style: "matchhighlight",
+    minChars: 2,
+    delay: 100,
+    wordsOnly: false,
+    annotateScrollbar: false,
+    showToken: false,
+    trim: true
+  }
 
   function State(options) {
-    if (typeof options == "object") {
-      this.minChars = options.minChars;
-      this.style = options.style;
-      this.showToken = options.showToken;
-      this.delay = options.delay;
-      this.wordsOnly = options.wordsOnly;
-      this.annotateScrollbar = options.annotateScrollbar;
-    }
-    if (this.style == null) this.style = DEFAULT_TOKEN_STYLE;
-    if (this.minChars == null) this.minChars = DEFAULT_MIN_CHARS;
-    if (this.delay == null) this.delay = DEFAULT_DELAY;
-    if (this.wordsOnly == null) this.wordsOnly = DEFAULT_WORDS_ONLY;
+    this.options = {}
+    for (var name in defaults)
+      this.options[name] = (options && options.hasOwnProperty(name) ? options : defaults)[name]
     this.overlay = this.timeout = null;
     this.matchesonscroll = null;
   }
 
   CodeMirror.defineOption("highlightSelectionMatches", false, function(cm, val, old) {
     if (old && old != CodeMirror.Init) {
       removeOverlay(cm);
       clearTimeout(cm.state.matchHighlighter.timeout);
@@ -63,60 +59,61 @@
       highlightMatches(cm);
       cm.on("cursorActivity", cursorActivity);
     }
   });
 
   function cursorActivity(cm) {
     var state = cm.state.matchHighlighter;
     clearTimeout(state.timeout);
-    state.timeout = setTimeout(function() {highlightMatches(cm);}, state.delay);
+    state.timeout = setTimeout(function() {highlightMatches(cm);}, state.options.delay);
   }
 
   function addOverlay(cm, query, hasBoundary, style) {
     var state = cm.state.matchHighlighter;
     cm.addOverlay(state.overlay = makeOverlay(query, hasBoundary, style));
-    if (state.annotateScrollbar) {
+    if (state.options.annotateScrollbar && cm.showMatchesOnScrollbar) {
       var searchFor = hasBoundary ? new RegExp("\\b" + query + "\\b") : query;
       state.matchesonscroll = cm.showMatchesOnScrollbar(searchFor, true,
         {className: "CodeMirror-selection-highlight-scrollbar"});
     }
   }
 
   function removeOverlay(cm) {
     var state = cm.state.matchHighlighter;
     if (state.overlay) {
       cm.removeOverlay(state.overlay);
       state.overlay = null;
-      if (state.annotateScrollbar) {
+      if (state.matchesonscroll) {
         state.matchesonscroll.clear();
         state.matchesonscroll = null;
       }
     }
   }
 
   function highlightMatches(cm) {
     cm.operation(function() {
       var state = cm.state.matchHighlighter;
       removeOverlay(cm);
-      if (!cm.somethingSelected() && state.showToken) {
-        var re = state.showToken === true ? /[\w$]/ : state.showToken;
+      if (!cm.somethingSelected() && state.options.showToken) {
+        var re = state.options.showToken === true ? /[\w$]/ : state.options.showToken;
         var cur = cm.getCursor(), line = cm.getLine(cur.line), start = cur.ch, end = start;
         while (start && re.test(line.charAt(start - 1))) --start;
         while (end < line.length && re.test(line.charAt(end))) ++end;
         if (start < end)
-          addOverlay(cm, line.slice(start, end), re, state.style);
+          addOverlay(cm, line.slice(start, end), re, state.options.style);
         return;
       }
       var from = cm.getCursor("from"), to = cm.getCursor("to");
       if (from.line != to.line) return;
-      if (state.wordsOnly && !isWord(cm, from, to)) return;
-      var selection = cm.getRange(from, to).replace(/^\s+|\s+$/g, "");
-      if (selection.length >= state.minChars)
-        addOverlay(cm, selection, false, state.style);
+      if (state.options.wordsOnly && !isWord(cm, from, to)) return;
+      var selection = cm.getRange(from, to)
+      if (state.options.trim) selection = selection.replace(/^\s+|\s+$/g, "")
+      if (selection.length >= state.options.minChars)
+        addOverlay(cm, selection, false, state.options.style);
     });
   }
 
   function isWord(cm, from, to) {
     var str = cm.getRange(from, to);
     if (str.match(/^\w+$/) !== null) {
         if (from.ch > 0) {
             var pos = {line: from.line, ch: from.ch - 1};
old mode 100755
new mode 100644
--- a/devtools/client/sourceeditor/codemirror/addon/search/search.js
+++ b/devtools/client/sourceeditor/codemirror/addon/search/search.js
@@ -131,17 +131,20 @@
     var state = getSearchState(cm);
     if (state.query) return findNext(cm, rev);
     var q = cm.getSelection() || state.lastQuery;
     if (persistent && cm.openDialog) {
       var hiding = null
       persistentDialog(cm, queryDialog, q, function(query, event) {
         CodeMirror.e_stop(event);
         if (!query) return;
-        if (query != state.queryText) startSearch(cm, state, query);
+        if (query != state.queryText) {
+          startSearch(cm, state, query);
+          state.posFrom = state.posTo = cm.getCursor();
+        }
         if (hiding) hiding.style.opacity = 1
         findNext(cm, event.shiftKey, function(_, to) {
           var dialog
           if (to.line < 3 && document.querySelector &&
               (dialog = cm.display.wrapper.querySelector(".CodeMirror-dialog")) &&
               dialog.getBoundingClientRect().bottom - 4 > cm.cursorCoords(to, "window").top)
             (hiding = dialog).style.opacity = .4
         })
@@ -203,17 +206,17 @@
       if (!query) return;
       query = parseQuery(query);
       dialog(cm, replacementQueryDialog, "Replace with:", "", function(text) {
         text = parseString(text)
         if (all) {
           replaceAll(cm, query, text)
         } else {
           clearSearch(cm);
-          var cursor = getSearchCursor(cm, query, cm.getCursor());
+          var cursor = getSearchCursor(cm, query, cm.getCursor("from"));
           var advance = function() {
             var start = cursor.from(), match;
             if (!(match = cursor.findNext())) {
               cursor = getSearchCursor(cm, query);
               if (!(match = cursor.findNext()) ||
                   (start && cursor.from().line == start.line && cursor.from().ch == start.ch)) return;
             }
             cm.setSelection(cursor.from(), cursor.to());
--- a/devtools/client/sourceeditor/codemirror/addon/tern/tern.js
+++ b/devtools/client/sourceeditor/codemirror/addon/tern/tern.js
@@ -174,17 +174,17 @@
     if (id instanceof CodeMirror) id = id.getDoc();
     if (id instanceof CodeMirror.Doc) return findDoc(ts, id);
   }
 
   function trackChange(ts, doc, change) {
     var data = findDoc(ts, doc);
 
     var argHints = ts.cachedArgHints;
-    if (argHints && argHints.doc == doc && cmpPos(argHints.start, change.to) <= 0)
+    if (argHints && argHints.doc == doc && cmpPos(argHints.start, change.to) >= 0)
       ts.cachedArgHints = null;
 
     var changed = data.changed;
     if (changed == null)
       data.changed = changed = {from: change.from.line, to: change.from.line};
     var end = change.from.line + (change.text.length - 1);
     if (change.from.line < changed.to) changed.to = changed.to - (change.to.line - end);
     if (end >= changed.to) changed.to = end + 1;
@@ -301,17 +301,17 @@
     var start = Pos(line, ch);
     var cache = ts.cachedArgHints;
     if (cache && cache.doc == cm.getDoc() && cmpPos(start, cache.start) == 0)
       return showArgHints(ts, cm, argPos);
 
     ts.request(cm, {type: "type", preferFunction: true, end: start}, function(error, data) {
       if (error || !data.type || !(/^fn\(/).test(data.type)) return;
       ts.cachedArgHints = {
-        start: pos,
+        start: start,
         type: parseFnType(data.type),
         name: data.exprName || data.name || "fn",
         guess: data.guess,
         doc: cm.getDoc()
       };
       showArgHints(ts, cm, argPos);
     });
   }
--- a/devtools/client/sourceeditor/codemirror/keymap/sublime.js
+++ b/devtools/client/sourceeditor/codemirror/keymap/sublime.js
@@ -50,16 +50,18 @@
       else
         return dir < 0 ? range.from() : range.to();
     });
   }
 
   cmds[map["Alt-Left"] = "goSubwordLeft"] = function(cm) { moveSubword(cm, -1); };
   cmds[map["Alt-Right"] = "goSubwordRight"] = function(cm) { moveSubword(cm, 1); };
 
+  if (mac) map["Cmd-Left"] = "goLineStartSmart";
+
   var scrollLineCombo = mac ? "Ctrl-Alt-" : "Ctrl-";
 
   cmds[map[scrollLineCombo + "Up"] = "scrollLineUp"] = function(cm) {
     var info = cm.getScrollInfo();
     if (!cm.somethingSelected()) {
       var visibleBottomLine = cm.lineAtHeight(info.top + info.clientHeight, "local");
       if (cm.getCursor().line >= visibleBottomLine)
         cm.execCommand("goLineUp");
--- a/devtools/client/sourceeditor/codemirror/keymap/vim.js
+++ b/devtools/client/sourceeditor/codemirror/keymap/vim.js
@@ -21,17 +21,17 @@
  *  'vim-mode-change' - raised on the editor anytime the current mode changes,
  *                      Event object: {mode: "visual", subMode: "linewise"}
  *
  * Code structure:
  *  1. Default keymap
  *  2. Variable declarations and short basic helpers
  *  3. Instance (External API) implementation
  *  4. Internal state tracking objects (input state, counter) implementation
- *     and instanstiation
+ *     and instantiation
  *  5. Key handler (the main command dispatcher) implementation
  *  6. Motion, operator, and action implementations
  *  7. Helper functions for the key handler, motions, operators, and actions
  *  8. Set up Vim to work as a keymap for CodeMirror.
  *  9. Ex command implementations.
  */
 
 (function(mod) {
@@ -221,16 +221,17 @@
     { name: 'redo', shortName: 'red' },
     { name: 'set', shortName: 'se' },
     { name: 'set', shortName: 'se' },
     { name: 'setlocal', shortName: 'setl' },
     { name: 'setglobal', shortName: 'setg' },
     { name: 'sort', shortName: 'sor' },
     { name: 'substitute', shortName: 's', possiblyAsync: true },
     { name: 'nohlsearch', shortName: 'noh' },
+    { name: 'yank', shortName: 'y' },
     { name: 'delmarks', shortName: 'delm' },
     { name: 'registers', shortName: 'reg', excludeFromCommandHistory: true },
     { name: 'global', shortName: 'g' }
   ];
 
   var Pos = CodeMirror.Pos;
 
   var Vim = function() {
@@ -636,17 +637,17 @@
         searchQuery: null,
         // Whether we are searching backwards.
         searchIsReversed: false,
         // Replace part of the last substituted pattern
         lastSubstituteReplacePart: undefined,
         jumpList: createCircularJumpList(),
         macroModeState: new MacroModeState,
         // Recording latest f, t, F or T motion command.
-        lastChararacterSearch: {increment:0, forward:true, selectedCharacter:''},
+        lastCharacterSearch: {increment:0, forward:true, selectedCharacter:''},
         registerController: new RegisterController({}),
         // search history buffer
         searchHistoryController: new HistoryController({}),
         // ex Command history buffer
         exCommandHistoryController : new HistoryController({})
       };
       for (var optionName in options) {
         var option = options[optionName];
@@ -1042,17 +1043,17 @@
       shiftNumericRegisters_: function() {
         for (var i = 9; i >= 2; i--) {
           this.registers[i] = this.getRegister('' + (i - 1));
         }
       }
     };
     function HistoryController() {
         this.historyBuffer = [];
-        this.iterator;
+        this.iterator = 0;
         this.initialPrefix = null;
     }
     HistoryController.prototype = {
       // the input argument here acts a user entered prefix for a small time
       // until we start autocompletion in which case it is the autocompleted.
       nextMatch: function (input, up) {
         var historyBuffer = this.historyBuffer;
         var dir = up ? -1 : 1;
@@ -1367,17 +1368,17 @@
                 onKeyDown: onPromptKeyDown});
           } else {
             showPrompt(cm, { onClose: onPromptClose, prefix: ':',
                 onKeyDown: onPromptKeyDown});
           }
         }
       },
       evalInput: function(cm, vim) {
-        // If the motion comand is set, execute both the operator and motion.
+        // If the motion command is set, execute both the operator and motion.
         // Otherwise return.
         var inputState = vim.inputState;
         var motion = inputState.motion;
         var motionArgs = inputState.motionArgs || {};
         var operator = inputState.operator;
         var operatorArgs = inputState.operatorArgs || {};
         var registerName = inputState.registerName;
         var sel = vim.sel;
@@ -1904,17 +1905,17 @@
         if (!cm.state.vim.visualMode) {
           return [tmp.start, tmp.end];
         } else {
           return expandSelection(cm, tmp.start, tmp.end);
         }
       },
 
       repeatLastCharacterSearch: function(cm, head, motionArgs) {
-        var lastSearch = vimGlobalState.lastChararacterSearch;
+        var lastSearch = vimGlobalState.lastCharacterSearch;
         var repeat = motionArgs.repeat;
         var forward = motionArgs.forward === lastSearch.forward;
         var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1);
         cm.moveH(-increment, 'char');
         motionArgs.inclusive = forward ? true : false;
         var curEnd = moveToCharacter(cm, repeat, forward, lastSearch.selectedCharacter);
         if (!curEnd) {
           cm.moveH(increment, 'char');
@@ -2997,17 +2998,17 @@
     // example, with the caret at the start of the last word on the line,
     // 'dw' should word, but not the newline, while 'w' should advance the
     // caret to the first character of the next line.
     function clipToLine(cm, curStart, curEnd) {
       var selection = cm.getRange(curStart, curEnd);
       // Only clip if the selection ends with trailing newline + whitespace
       if (/\n\s*$/.test(selection)) {
         var lines = selection.split('\n');
-        // We know this is all whitepsace.
+        // We know this is all whitespace.
         lines.pop();
 
         // Cases:
         // 1. Last word is an empty line - do not clip the trailing '\n'
         // 2. Last word is not an empty line - clip the trailing '\n'
         var line;
         // Find the line containing the last word, and clip all whitespace up
         // to it.
@@ -3083,19 +3084,19 @@
 
     function recordJumpPosition(cm, oldCur, newCur) {
       if (!cursorEqual(oldCur, newCur)) {
         vimGlobalState.jumpList.add(cm, oldCur, newCur);
       }
     }
 
     function recordLastCharacterSearch(increment, args) {
-        vimGlobalState.lastChararacterSearch.increment = increment;
-        vimGlobalState.lastChararacterSearch.forward = args.forward;
-        vimGlobalState.lastChararacterSearch.selectedCharacter = args.selectedCharacter;
+        vimGlobalState.lastCharacterSearch.increment = increment;
+        vimGlobalState.lastCharacterSearch.forward = args.forward;
+        vimGlobalState.lastCharacterSearch.selectedCharacter = args.selectedCharacter;
     }
 
     var symbolToMode = {
         '(': 'bracket', ')': 'bracket', '{': 'bracket', '}': 'bracket',
         '[': 'section', ']': 'section',
         '*': 'comment', '/': 'comment',
         'm': 'method', 'M': 'method',
         '#': 'preprocess'
@@ -3284,18 +3285,16 @@
         // Advance to next/prev line.
         lineNum += dir;
         if (!isLine(cm, lineNum)) {
           return null;
         }
         line = cm.getLine(lineNum);
         pos = (dir > 0) ? 0 : line.length;
       }
-      // Should never get here.
-      throw new Error('The impossible happened.');
     }
 
     /**
      * @param {CodeMirror} cm CodeMirror object.
      * @param {Pos} cur The position to start from.
      * @param {int} repeat Number of words to move past.
      * @param {boolean} forward True to search forward. False to search
      *     backward.
@@ -3447,17 +3446,17 @@
           if (isBoundary(i, -1, true)) { break; }
         }
       }
       start = new Pos(i, 0);
       return { start: start, end: end };
     }
 
     // TODO: perhaps this finagling of start and end positions belonds
-    // in codmirror/replaceRange?
+    // in codemirror/replaceRange?
     function selectCompanionObject(cm, head, symb, inclusive) {
       var cur = head, start, end;
 
       var bracketRegexp = ({
         '(': /[()]/, ')': /[()]/,
         '[': /[[\]]/, ']': /[[\]]/,
         '{': /[{}]/, '}': /[{}]/})[symb];
       var openSym = ({
@@ -4509,24 +4508,31 @@
         doReplace(cm, confirm, global, lineStart, lineEnd, cursor, query, replacePart, params.callback);
       },
       redo: CodeMirror.commands.redo,
       undo: CodeMirror.commands.undo,
       write: function(cm) {
         if (CodeMirror.commands.save) {
           // If a save command is defined, call it.
           CodeMirror.commands.save(cm);
-        } else {
-          // Saves to text area if no save command is defined.
+        } else if (cm.save) {
+          // Saves to text area if no save command is defined and cm.save() is available.
           cm.save();
         }
       },
       nohlsearch: function(cm) {
         clearSearchHighlight(cm);
       },
+      yank: function (cm) {
+        var cur = copyCursor(cm.getCursor());
+        var line = cur.line;
+        var lineText = cm.getLine(line);
+        vimGlobalState.registerController.pushText(
+          '0', 'yank', lineText, true, true);
+      },
       delmarks: function(cm, params) {
         if (!params.argString || !trim(params.argString)) {
           showConfirm(cm, 'Argument required');
           return;
         }
 
         var state = cm.state.vim;
         var stream = new CodeMirror.StringStream(trim(params.argString));
--- a/devtools/client/sourceeditor/codemirror/lib/codemirror.js
+++ b/devtools/client/sourceeditor/codemirror/lib/codemirror.js
@@ -36,16 +36,17 @@
   var safari = /Apple Computer/.test(navigator.vendor);
   var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent);
   var phantom = /PhantomJS/.test(userAgent);
 
   var ios = /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent);
   // This is woefully incomplete. Suggestions for alternative methods welcome.
   var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);
   var mac = ios || /Mac/.test(platform);
+  var chromeOS = /\bCrOS\b/.test(userAgent);
   var windows = /win/i.test(platform);
 
   var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/);
   if (presto_version) presto_version = Number(presto_version[1]);
   if (presto_version && presto_version >= 15) { presto = false; webkit = true; }
   // Some browsers use the wrong event properties to signal cmd/ctrl on OS X
   var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));
   var captureRightClick = gecko || (ie && ie_version >= 9);
@@ -3675,17 +3676,17 @@
         ourRange = ranges[ourIndex];
       else
         ourRange = new Range(start, start);
     } else {
       ourRange = doc.sel.primary();
       ourIndex = doc.sel.primIndex;
     }
 
-    if (e.altKey) {
+    if (chromeOS ? e.shiftKey && e.metaKey : e.altKey) {
       type = "rect";
       if (!addNew) ourRange = new Range(start, start);
       start = posFromMouse(cm, e, true, true);
       ourIndex = -1;
     } else if (type == "double") {
       var word = cm.findWordAt(start);
       if (cm.display.shift || doc.extend)
         ourRange = extendRange(doc, ourRange, word.anchor, word.head);
@@ -3900,16 +3901,17 @@
     }
   }
 
   function onDragStart(cm, e) {
     if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }
     if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;
 
     e.dataTransfer.setData("Text", cm.getSelection());
+    e.dataTransfer.effectAllowed = "copyMove"
 
     // Use dummy image instead of default browsers image.
     // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
     if (e.dataTransfer.setDragImage && !safari) {
       var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");
       img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
       if (presto) {
         img.width = img.height = 1;
@@ -7620,19 +7622,19 @@
     },
     findMarks: function(from, to, filter) {
       from = clipPos(this, from); to = clipPos(this, to);
       var found = [], lineNo = from.line;
       this.iter(from.line, to.line + 1, function(line) {
         var spans = line.markedSpans;
         if (spans) for (var i = 0; i < spans.length; i++) {
           var span = spans[i];
-          if (!(span.to != null && lineNo == from.line && from.ch > span.to ||
+          if (!(span.to != null && lineNo == from.line && from.ch >= span.to ||
                 span.from == null && lineNo != from.line ||
-                span.from != null && lineNo == to.line && span.from > to.ch) &&
+                span.from != null && lineNo == to.line && span.from >= to.ch) &&
               (!filter || filter(span.marker)))
             found.push(span.marker.parent || span.marker);
         }
         ++lineNo;
       });
       return found;
     },
     getAllMarks: function() {
@@ -7641,31 +7643,32 @@
         var sps = line.markedSpans;
         if (sps) for (var i = 0; i < sps.length; ++i)
           if (sps[i].from != null) markers.push(sps[i].marker);
       });
       return markers;
     },
 
     posFromIndex: function(off) {
-      var ch, lineNo = this.first;
+      var ch, lineNo = this.first, sepSize = this.lineSeparator().length;
       this.iter(function(line) {
-        var sz = line.text.length + 1;
+        var sz = line.text.length + sepSize;
         if (sz > off) { ch = off; return true; }
         off -= sz;
         ++lineNo;
       });
       return clipPos(this, Pos(lineNo, ch));
     },
     indexFromPos: function (coords) {
       coords = clipPos(this, coords);
       var index = coords.ch;
       if (coords.line < this.first || coords.ch < 0) return 0;
+      var sepSize = this.lineSeparator().length;
       this.iter(this.first, coords.line, function (line) {
-        index += line.text.length + 1;
+        index += line.text.length + sepSize;
       });
       return index;
     },
 
     copy: function(copyHistory) {
       var doc = new Doc(getLines(this, this.first, this.first + this.size),
                         this.modeOption, this.first, this.lineSep);
       doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;
@@ -8884,12 +8887,12 @@
         order.push(new BidiSpan(order[0].level, len, len));
 
       return order;
     };
   })();
 
   // THE END
 
-  CodeMirror.version = "5.13.2";
+  CodeMirror.version = "5.14.2";
 
   return CodeMirror;
 });
--- a/devtools/client/sourceeditor/codemirror/mode/clike.js
+++ b/devtools/client/sourceeditor/codemirror/mode/clike.js
@@ -662,17 +662,17 @@ CodeMirror.defineMode("clike", function(
     blockKeywords: words("case do else for if switch while struct"),
     atoms: words("null true false"),
     hooks: {"#": cppHook},
     modeProps: {fold: ["brace", "include"]}
   });
 
   def("text/x-objectivec", {
     name: "clike",
-    keywords: words(cKeywords + "inline restrict _Bool _Complex _Imaginery BOOL Class bycopy byref id IMP in " +
+    keywords: words(cKeywords + "inline restrict _Bool _Complex _Imaginary BOOL Class bycopy byref id IMP in " +
                     "inout nil oneway out Protocol SEL self super atomic nonatomic retain copy readwrite readonly"),
     types: words(cTypes),
     atoms: words("YES NO NULL NILL ON OFF true false"),
     hooks: {
       "@": function(stream) {
         stream.eatWhile(/[\w\$]/);
         return "keyword";
       },
--- a/devtools/client/sourceeditor/editor.js
+++ b/devtools/client/sourceeditor/editor.js
@@ -154,16 +154,17 @@ function Editor(config) {
     value: "",
     mode: Editor.modes.text,
     indentUnit: tabSize,
     tabSize: tabSize,
     contextMenu: null,
     matchBrackets: true,
     extraKeys: {},
     indentWithTabs: useTabs,
+    inputStyle: "textarea",
     styleActiveLine: true,
     autoCloseBrackets: "()[]{}''\"\"``",
     autoCloseEnabled: useAutoClose,
     theme: "mozilla",
     themeSwitching: true,
     autocomplete: false,
     autocompleteOpts: {}
   };
--- a/devtools/client/sourceeditor/test/codemirror/vim_test.js
+++ b/devtools/client/sourceeditor/test/codemirror/vim_test.js
@@ -268,20 +268,20 @@ testJumplist('jumplist_*_cachedCursor', 
 testJumplist('jumplist_#_cachedCursor', ['#', '<C-o>'], [1,3], [1,3]);
 testJumplist('jumplist_n', ['#', 'n', '<C-o>'], [1,1], [2,3]);
 testJumplist('jumplist_N', ['#', 'N', '<C-o>'], [1,1], [2,3]);
 testJumplist('jumplist_repeat_<c-o>', ['*', '*', '*', '3', '<C-o>'], [2,3], [2,3]);
 testJumplist('jumplist_repeat_<c-i>', ['*', '*', '*', '3', '<C-o>', '2', '<C-i>'], [5,0], [2,3]);
 testJumplist('jumplist_repeated_motion', ['3', '*', '<C-o>'], [2,3], [2,3]);
 testJumplist('jumplist_/', ['/', '<C-o>'], [2,3], [2,3], 'dialog');
 testJumplist('jumplist_?', ['?', '<C-o>'], [2,3], [2,3], 'dialog');
-testJumplist('jumplist_skip_delted_mark<c-o>',
+testJumplist('jumplist_skip_deleted_mark<c-o>',
              ['*', 'n', 'n', 'k', 'd', 'k', '<C-o>', '<C-o>', '<C-o>'],
              [0,2], [0,2]);
-testJumplist('jumplist_skip_delted_mark<c-i>',
+testJumplist('jumplist_skip_deleted_mark<c-i>',
              ['*', 'n', 'n', 'k', 'd', 'k', '<C-o>', '<C-i>', '<C-i>'],
              [1,0], [0,2]);
 
 /**
  * @param name Name of the test
  * @param keys An array of keys or a string with a single key to simulate.
  * @param endPos The expected end position of the cursor.
  * @param startPos The position the cursor should start at, defaults to 0, 0.
@@ -477,17 +477,17 @@ testVim('gj_gk', function(cm, vim, helpe
   helpers.doKeys('h');
   // Test bottom of document edge case.
   helpers.doKeys('100', 'g', 'j');
   var endingPos = cm.getCursor();
   is(endingPos != 0, 'gj should not be on wrapped line 0');
   var topLeftCharCoords = cm.charCoords(makeCursor(0, 0));
   var endingCharCoords = cm.charCoords(endingPos);
   is(topLeftCharCoords.left == endingCharCoords.left, 'gj should end up on column 0');
-},{ lineNumbers: false, lineWrapping:true, value: 'Thislineisintentiallylongtotestmovementofgjandgkoverwrappedlines.' });
+},{ lineNumbers: false, lineWrapping:true, value: 'Thislineisintentionallylongtotestmovementofgjandgkoverwrappedlines.' });
 testVim('}', function(cm, vim, helpers) {
   cm.setCursor(0, 0);
   helpers.doKeys('}');
   helpers.assertCursorAt(1, 0);
   cm.setCursor(0, 0);
   helpers.doKeys('2', '}');
   helpers.assertCursorAt(4, 0);
   cm.setCursor(0, 0);
@@ -3677,17 +3677,17 @@ function testSubstituteConfirm(name, com
     }
     try {
       eq(expectedValue, cm.getValue());
       helpers.assertCursorAt(finalPos);
       is(closed);
     } catch(e) {
       throw e
     } finally {
-      // Restore overriden functions.
+      // Restore overridden functions.
       CodeMirror.keyName = savedKeyName;
       cm.openDialog = savedOpenDialog;
     }
   }, { value: initialValue });
 };
 testSubstituteConfirm('ex_substitute_confirm_emptydoc',
     '%s/x/b/c', '', '', '', makeCursor(0, 0));
 testSubstituteConfirm('ex_substitute_confirm_nomatch',
@@ -3720,16 +3720,24 @@ testSubstituteConfirm('ex_substitute_con
 testVim('ex_noh_clearSearchHighlight', function(cm, vim, helpers) {
   cm.openDialog = helpers.fakeOpenDialog('match');
   helpers.doKeys('?');
   helpers.doEx('noh');
   eq(vim.searchState_.getOverlay(),null,'match-highlighting wasn\'t cleared');
   helpers.doKeys('n');
   helpers.assertCursorAt(0, 11,'can\'t resume search after clearing highlighting');
 }, { value: 'match nope match \n nope Match' });
+testVim('ex_yank', function (cm, vim, helpers) {
+  var curStart = makeCursor(3, 0);
+  cm.setCursor(curStart);
+  helpers.doEx('y');
+  var register = helpers.getRegisterController().getRegister();
+  var line = cm.getLine(3);
+  eq(line + '\n', register.toString());
+});
 testVim('set_boolean', function(cm, vim, helpers) {
   CodeMirror.Vim.defineOption('testoption', true, 'boolean');
   // Test default value is set.
   is(CodeMirror.Vim.getOption('testoption'));
   try {
     // Test fail to set to non-boolean
     CodeMirror.Vim.setOption('testoption', '5');
     fail();
--- a/devtools/server/actors/utils/TabSources.js
+++ b/devtools/server/actors/utils/TabSources.js
@@ -254,16 +254,20 @@ TabSources.prototype = {
    * Returns true if the URL likely points to a minified resource, false
    * otherwise.
    *
    * @param String aURL
    *        The URL to test.
    * @returns Boolean
    */
   _isMinifiedURL: function (aURL) {
+    if (!aURL) {
+      return false;
+    }
+
     try {
       let url = new URL(aURL);
       let pathname = url.pathname;
       return MINIFIED_SOURCE_REGEXP.test(pathname.slice(pathname.lastIndexOf("/") + 1));
     } catch (e) {
       // Not a valid URL so don't try to parse out the filename, just test the
       // whole thing with the minified source regexp.
       return MINIFIED_SOURCE_REGEXP.test(aURL);
--- a/dom/audiochannel/AudioChannelService.cpp
+++ b/dom/audiochannel/AudioChannelService.cpp
@@ -382,18 +382,18 @@ AudioChannelService::GetState(nsPIDOMWin
       *aVolume *= winData->mChannels[aAudioChannel].mVolume;
       *aMuted = *aMuted || winData->mChannels[aAudioChannel].mMuted;
     }
 
     *aVolume *= window->GetAudioVolume();
     // TODO : distiguish between suspend and mute, it would be done in bug1242874.
     *aMuted = *aMuted || window->GetMediaSuspended() || window->GetAudioMuted();
 
-    nsCOMPtr<nsPIDOMWindowOuter> win = window->GetScriptableParent();
-    if (window == win) {
+    nsCOMPtr<nsPIDOMWindowOuter> win = window->GetScriptableParentOrNull();
+    if (!win) {
       break;
     }
 
     window = do_QueryInterface(win);
 
     // If there is no parent, or we are the toplevel we don't continue.
   } while (window && window != aWindow);
 }
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -3653,18 +3653,18 @@ nsPIDOMWindowInner::CreatePerformanceObj
       !NS_SUCCEEDED(timedChannel->GetTimingEnabled(&timingEnabled)) ||
       !timingEnabled) {
     timedChannel = nullptr;
   }
   if (timing) {
     // If we are dealing with an iframe, we will need the parent's performance
     // object (so we can add the iframe as a resource of that page).
     nsPerformance* parentPerformance = nullptr;
-    nsCOMPtr<nsPIDOMWindowOuter> parentWindow = GetScriptableParent();
-    if (GetOuterWindow() != parentWindow) {
+    nsCOMPtr<nsPIDOMWindowOuter> parentWindow = GetScriptableParentOrNull();
+    if (parentWindow) {
       nsPIDOMWindowInner* parentInnerWindow = nullptr;
       if (parentWindow) {
         parentInnerWindow = parentWindow->GetCurrentInnerWindow();
       }
       if (parentInnerWindow) {
         parentPerformance = parentInnerWindow->GetPerformance();
       }
     }
@@ -3874,16 +3874,29 @@ nsGlobalWindow::GetScriptableParent()
 {
   FORWARD_TO_OUTER(GetScriptableParent, (), nullptr);
 
   nsCOMPtr<nsPIDOMWindowOuter> parent = GetParentOuter();
   return parent.get();
 }
 
 /**
+ * Behavies identically to GetScriptableParent extept that it returns null
+ * if GetScriptableParent would return this window.
+ */
+nsPIDOMWindowOuter*
+nsGlobalWindow::GetScriptableParentOrNull()
+{
+  FORWARD_TO_OUTER(GetScriptableParentOrNull, (), nullptr);
+
+  nsPIDOMWindowOuter* parent = GetScriptableParent();
+  return (Cast(parent) == this) ? nullptr : parent;
+}
+
+/**
  * nsPIDOMWindow::GetParent (when called from C++) is just a wrapper around
  * GetRealParent.
  */
 already_AddRefed<nsPIDOMWindowOuter>
 nsGlobalWindow::GetParent()
 {
   MOZ_ASSERT(IsOuterWindow());
 
--- a/dom/base/nsGlobalWindow.h
+++ b/dom/base/nsGlobalWindow.h
@@ -891,16 +891,17 @@ public:
                  mozilla::ErrorResult& aError);
   already_AddRefed<nsPIDOMWindowOuter> GetOpener() override;
   void SetOpener(JSContext* aCx, JS::Handle<JS::Value> aOpener,
                  mozilla::ErrorResult& aError);
   already_AddRefed<nsPIDOMWindowOuter> GetParentOuter();
   already_AddRefed<nsPIDOMWindowOuter> GetParent(mozilla::ErrorResult& aError);
   already_AddRefed<nsPIDOMWindowOuter> GetParent() override;
   nsPIDOMWindowOuter* GetScriptableParent() override;
+  nsPIDOMWindowOuter* GetScriptableParentOrNull() override;
   mozilla::dom::Element* GetFrameElementOuter();
   mozilla::dom::Element* GetFrameElement(mozilla::ErrorResult& aError);
   already_AddRefed<nsIDOMElement> GetFrameElement() override;
   already_AddRefed<nsPIDOMWindowOuter>
   OpenOuter(const nsAString& aUrl,
             const nsAString& aName,
             const nsAString& aOptions,
             mozilla::ErrorResult& aError);
--- a/dom/base/nsINode.cpp
+++ b/dom/base/nsINode.cpp
@@ -1652,16 +1652,177 @@ nsINode::GetNextElementSibling() const
       return nextSibling->AsElement();
     }
     nextSibling = nextSibling->GetNextSibling();
   }
 
   return nullptr;
 }
 
+static already_AddRefed<nsINode>
+GetNodeFromNodeOrString(const OwningNodeOrString& aNode,
+                        nsIDocument* aDocument)
+{
+  if (aNode.IsNode()) {
+    nsCOMPtr<nsINode> node = aNode.GetAsNode();
+    return node.forget();
+  }
+
+  if (aNode.IsString()){
+    RefPtr<nsTextNode> textNode =
+      aDocument->CreateTextNode(aNode.GetAsString());
+    return textNode.forget();
+  }
+
+  MOZ_CRASH("Impossible type");
+}
+
+/**
+ * Implement the algorithm specified at
+ * https://dom.spec.whatwg.org/#converting-nodes-into-a-node for |prepend()|,
+ * |append()|, |before()|, |after()|, and |replaceWith()| APIs.
+ */
+static already_AddRefed<nsINode>
+ConvertNodesOrStringsIntoNode(const Sequence<OwningNodeOrString>& aNodes,
+                              nsIDocument* aDocument,
+                              ErrorResult& aRv)
+{
+  if (aNodes.Length() == 1) {
+    return GetNodeFromNodeOrString(aNodes[0], aDocument);
+  }
+
+  nsCOMPtr<nsINode> fragment = aDocument->CreateDocumentFragment();
+
+  for (const auto& node : aNodes) {
+    nsCOMPtr<nsINode> childNode = GetNodeFromNodeOrString(node, aDocument);
+    fragment->AppendChild(*childNode, aRv);
+    if (aRv.Failed()) {
+      return nullptr;
+    }
+  }
+
+  return fragment.forget();
+}
+
+static void
+InsertNodesIntoHashset(const Sequence<OwningNodeOrString>& aNodes,
+                       nsTHashtable<nsPtrHashKey<nsINode>>& aHashset)
+{
+  for (const auto& node : aNodes) {
+    if (node.IsNode()) {
+      aHashset.PutEntry(node.GetAsNode());
+    }
+  }
+}
+
+static nsINode*
+FindViablePreviousSibling(const nsINode& aNode,
+                          const Sequence<OwningNodeOrString>& aNodes)
+{
+  nsTHashtable<nsPtrHashKey<nsINode>> nodeSet(16);
+  InsertNodesIntoHashset(aNodes, nodeSet);
+
+  nsINode* viablePreviousSibling = nullptr;
+  for (nsINode* sibling = aNode.GetPreviousSibling(); sibling;
+       sibling = sibling->GetPreviousSibling()) {
+    if (!nodeSet.Contains(sibling)) {
+      viablePreviousSibling = sibling;
+      break;
+    }
+  }
+
+  return viablePreviousSibling;
+}
+
+static nsINode*
+FindViableNextSibling(const nsINode& aNode,
+                      const Sequence<OwningNodeOrString>& aNodes)
+{
+  nsTHashtable<nsPtrHashKey<nsINode>> nodeSet(16);
+  InsertNodesIntoHashset(aNodes, nodeSet);
+
+  nsINode* viableNextSibling = nullptr;
+  for (nsINode* sibling = aNode.GetNextSibling(); sibling;
+       sibling = sibling->GetNextSibling()) {
+    if (!nodeSet.Contains(sibling)) {
+      viableNextSibling = sibling;
+      break;
+    }
+  }
+
+  return viableNextSibling;
+}
+
+void
+nsINode::Before(const Sequence<OwningNodeOrString>& aNodes,
+                ErrorResult& aRv)
+{
+  nsCOMPtr<nsINode> parent = GetParentNode();
+  if (!parent) {
+    return;
+  }
+
+  nsINode* viablePreviousSibling = FindViablePreviousSibling(*this, aNodes);
+
+  nsCOMPtr<nsINode> node =
+    ConvertNodesOrStringsIntoNode(aNodes, OwnerDoc(), aRv);
+  if (aRv.Failed()) {
+    return;
+  }
+
+  viablePreviousSibling = viablePreviousSibling ?
+    viablePreviousSibling->GetNextSibling() : parent->GetFirstChild();
+
+  parent->InsertBefore(*node, viablePreviousSibling, aRv);
+}
+
+void
+nsINode::After(const Sequence<OwningNodeOrString>& aNodes,
+               ErrorResult& aRv)
+{
+  nsCOMPtr<nsINode> parent = GetParentNode();
+  if (!parent) {
+    return;
+  }
+
+  nsINode* viableNextSibling = FindViableNextSibling(*this, aNodes);
+
+  nsCOMPtr<nsINode> node =
+    ConvertNodesOrStringsIntoNode(aNodes, OwnerDoc(), aRv);
+  if (aRv.Failed()) {
+    return;
+  }
+
+  parent->InsertBefore(*node, viableNextSibling, aRv);
+}
+
+void
+nsINode::ReplaceWith(const Sequence<OwningNodeOrString>& aNodes,
+                     ErrorResult& aRv)
+{
+  nsCOMPtr<nsINode> parent = GetParentNode();
+  if (!parent) {
+    return;
+  }
+
+  nsINode* viableNextSibling = FindViableNextSibling(*this, aNodes);
+
+  nsCOMPtr<nsINode> node =
+    ConvertNodesOrStringsIntoNode(aNodes, OwnerDoc(), aRv);
+  if (aRv.Failed()) {
+    return;
+  }
+
+  if (parent == GetParentNode()) {
+    parent->ReplaceChild(*node, *this, aRv);
+  } else {
+    parent->InsertBefore(*node, viableNextSibling, aRv);
+  }
+}
+
 void
 nsINode::Remove()
 {
   nsCOMPtr<nsINode> parent = GetParentNode();
   if (!parent) {
     return;
   }
   int32_t index = parent->IndexOf(this);
@@ -1696,16 +1857,42 @@ nsINode::GetLastElementChild() const
       return child->AsElement();
     }
   }
 
   return nullptr;
 }
 
 void
+nsINode::Prepend(const Sequence<OwningNodeOrString>& aNodes,
+                 ErrorResult& aRv)
+{
+  nsCOMPtr<nsINode> node =
+    ConvertNodesOrStringsIntoNode(aNodes, OwnerDoc(), aRv);
+  if (aRv.Failed()) {
+    return;
+  }
+
+  InsertBefore(*node, mFirstChild, aRv);
+}
+
+void
+nsINode::Append(const Sequence<OwningNodeOrString>& aNodes,
+                 ErrorResult& aRv)
+{
+  nsCOMPtr<nsINode> node =
+    ConvertNodesOrStringsIntoNode(aNodes, OwnerDoc(), aRv);
+  if (aRv.Failed()) {
+    return;
+  }
+
+  AppendChild(*node, aRv);
+}
+
+void
 nsINode::doRemoveChildAt(uint32_t aIndex, bool aNotify,
                          nsIContent* aKid, nsAttrAndChildArray& aChildArray)
 {
   NS_PRECONDITION(aKid && aKid->GetParentNode() == this &&
                   aKid == GetChildAt(aIndex) &&
                   IndexOf(aKid) == (int32_t)aIndex, "Bogus aKid");
 
   nsMutationGuard::DidMutate();
--- a/dom/base/nsINode.h
+++ b/dom/base/nsINode.h
@@ -71,16 +71,18 @@ inline bool IsSpaceCharacter(char aChar)
 struct BoxQuadOptions;
 struct ConvertCoordinateOptions;
 class DOMPoint;
 class DOMQuad;
 class DOMRectReadOnly;
 class Element;
 class EventHandlerNonNull;
 template<typename T> class Optional;
+class OwningNodeOrString;
+template<typename> class Sequence;
 class Text;
 class TextOrElementOrDocument;
 struct DOMPointInit;
 } // namespace dom
 } // namespace mozilla
 
 #define NODE_FLAG_BIT(n_) \
   (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (n_)))
@@ -263,19 +265,23 @@ class nsINode : public mozilla::dom::Eve
 {
 public:
   typedef mozilla::dom::BoxQuadOptions BoxQuadOptions;
   typedef mozilla::dom::ConvertCoordinateOptions ConvertCoordinateOptions;
   typedef mozilla::dom::DOMPoint DOMPoint;
   typedef mozilla::dom::DOMPointInit DOMPointInit;
   typedef mozilla::dom::DOMQuad DOMQuad;
   typedef mozilla::dom::DOMRectReadOnly DOMRectReadOnly;
+  typedef mozilla::dom::OwningNodeOrString OwningNodeOrString;
   typedef mozilla::dom::TextOrElementOrDocument TextOrElementOrDocument;
   typedef mozilla::ErrorResult ErrorResult;
 
+  template<class T>
+  using Sequence = mozilla::dom::Sequence<T>;
+
   NS_DECLARE_STATIC_IID_ACCESSOR(NS_INODE_IID)
 
   // Among the sub-classes that inherit (directly or indirectly) from nsINode,
   // measurement of the following members may be added later if DMD finds it is
   // worthwhile:
   // - nsGenericHTMLElement:  mForm, mFieldSet
   // - nsGenericHTMLFrameElement: mFrameLoader (bug 672539)
   // - HTMLBodyElement:       mContentStyleRule
@@ -1790,25 +1796,33 @@ public:
     mozilla::ErrorResult rv;
     parent->RemoveChild(*this, rv);
     return rv.StealNSResult();
   }
 
   // ChildNode methods
   mozilla::dom::Element* GetPreviousElementSibling() const;
   mozilla::dom::Element* GetNextElementSibling() const;
+
+  void Before(const Sequence<OwningNodeOrString>& aNodes, ErrorResult& aRv);
+  void After(const Sequence<OwningNodeOrString>& aNodes, ErrorResult& aRv);
+  void ReplaceWith(const Sequence<OwningNodeOrString>& aNodes,
+                   ErrorResult& aRv);
   /**
    * Remove this node from its parent, if any.
    */
   void Remove();
 
   // ParentNode methods
   mozilla::dom::Element* GetFirstElementChild() const;
   mozilla::dom::Element* GetLastElementChild() const;
 
+  void Prepend(const Sequence<OwningNodeOrString>& aNodes, ErrorResult& aRv);
+  void Append(const Sequence<OwningNodeOrString>& aNodes, ErrorResult& aRv);
+
   void GetBoxQuads(const BoxQuadOptions& aOptions,
                    nsTArray<RefPtr<DOMQuad> >& aResult,
                    mozilla::ErrorResult& aRv);
 
   already_AddRefed<DOMQuad> ConvertQuadFromNode(DOMQuad& aQuad,
                                                 const TextOrElementOrDocument& aFrom,
                                                 const ConvertCoordinateOptions& aOptions,
                                                 ErrorResult& aRv);
--- a/dom/base/nsPIDOMWindow.h
+++ b/dom/base/nsPIDOMWindow.h
@@ -113,16 +113,22 @@ public:
    */
 
   virtual already_AddRefed<nsPIDOMWindowOuter> GetTop() = 0; // Outer only
   virtual already_AddRefed<nsPIDOMWindowOuter> GetParent() = 0;
   virtual nsPIDOMWindowOuter* GetScriptableTop() = 0;
   virtual nsPIDOMWindowOuter* GetScriptableParent() = 0;
   virtual already_AddRefed<nsPIWindowRoot> GetTopWindowRoot() = 0;
 
+  /**
+   * Behavies identically to GetScriptableParent extept that it returns null
+   * if GetScriptableParent would return this window.
+   */
+  virtual nsPIDOMWindowOuter* GetScriptableParentOrNull() = 0;
+
   // Inner windows only.
   virtual nsresult RegisterIdleObserver(nsIIdleObserver* aIdleObserver) = 0;
   virtual nsresult UnregisterIdleObserver(nsIIdleObserver* aIdleObserver) = 0;
 
   virtual bool IsTopLevelWindowActive() = 0;
 
   // Outer windows only.
   virtual void SetActive(bool aActive)
--- a/dom/base/test/referrer_helper.js
+++ b/dom/base/test/referrer_helper.js
@@ -18,25 +18,26 @@ window.addEventListener("message", funct
   }
 });
 
 /**
  * helper to perform an XHR
  * to do checkIndividualResults and resetState
  */
 function doXHR(aUrl, onSuccess, onFail) {
-  var xhr = new XMLHttpRequest();
+  // The server is at http[s]://example.com so we need cross-origin XHR.
+  var xhr = new XMLHttpRequest({mozSystem: true});
   xhr.responseType = "json";
   xhr.onload = function () {
     onSuccess(xhr);
   };
   xhr.onerror = function () {
     onFail(xhr);
   };
-  xhr.open('GET', aUrl, true);
+  xhr.open('GET', "http" + aUrl, true);
   xhr.send(null);
 }
 
 /**
  * Grabs the results via XHR and passes to checker.
  */
 function checkIndividualResults(aTestname, aExpectedReferrer, aName) {
   var onload = xhr => {
@@ -64,16 +65,18 @@ function resetState() {
 
 /**
  * testing if anchor and area referrer attributes are honoured (1174913)
  */
 var tests = (function() {
 
   // enable referrer attribute
   yield SpecialPowers.pushPrefEnv({"set": [['network.http.enablePerElementReferrer', true]]}, advance);
+  yield SpecialPowers.pushPrefEnv({"set": [['security.mixed_content.block_active_content', false]]}, advance);
+  yield SpecialPowers.pushPermissions([{'type': 'systemXHR', 'allow': true, 'context': document}], advance);
 
   var iframe = document.getElementById("testframe");
 
   for (var j = 0; j < testCases.length; j++) {
     var actions = testCases[j].ACTION;
     var tests = testCases[j].TESTS;
     for (var k = 0; k < actions.length; k++) {
       var actionString = actions[k];
@@ -82,17 +85,18 @@ var tests = (function() {
         var searchParams = new URLSearchParams();
         searchParams.append("ACTION", actionString);
         searchParams.append("NAME", tests[i].NAME);
         for (var l of PARAMS) {
           if (tests[i][l]) {
             searchParams.append(l, tests[i][l]);
           }
         }
-        yield iframe.src = SJS + searchParams.toString();
+        var schemeFrom = tests[i].SCHEME_FROM || "http";
+        yield iframe.src = schemeFrom + SJS + searchParams.toString();
         yield checkIndividualResults(tests[i].DESC, tests[i].RESULT, tests[i].NAME);
       };
     };
   };
 
   // complete.  Be sure to yield so we don't call this twice.
   yield SimpleTest.finish();
 })();
\ No newline at end of file
--- a/dom/base/test/referrer_testserver.sjs
+++ b/dom/base/test/referrer_testserver.sjs
@@ -11,27 +11,31 @@ const BASE_URL = "example.com/tests/dom/
 const SHARED_KEY = SJS;
 const SAME_ORIGIN = "mochi.test:8888/tests/dom/base/test/" + SJS;
 const CROSS_ORIGIN = "test1.example.com/tests/dom/base/test/" + SJS;
 
 const IMG_BYTES = atob(
   "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12" +
   "P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==");
 
-function createTestUrl(aPolicy, aAction, aName, aType) {
-  return "http://" + BASE_URL +
+function createTestUrl(aPolicy, aAction, aName, aType, aSchemeFrom, aSchemeTo) {
+  var schemeTo = aSchemeTo || "http";
+  var schemeFrom = aSchemeFrom || "http";
+  return schemeTo + "://" + BASE_URL +
          "ACTION=" + aAction + "&" +
          "policy=" + aPolicy + "&" +
          "NAME=" + aName + "&" +
-         "type=" + aType;
+         "type=" + aType + "&" +
+         "SCHEME_FROM=" + schemeFrom;
 }
 
 // test page using iframe referrer attribute
 // if aParams are set this creates a test where the iframe url is a redirect
-function createIframeTestPageUsingRefferer(aMetaPolicy, aAttributePolicy, aNewAttributePolicy, aName, aParams, aChangingMethod) {
+function createIframeTestPageUsingRefferer(aMetaPolicy, aAttributePolicy, aNewAttributePolicy, aName, aParams,
+                                           aSchemeFrom, aSchemeTo, aChangingMethod) {
   var metaString = "";
   if (aMetaPolicy) {
     metaString = `<meta name="referrer" content="${aMetaPolicy}">`;
   }
   var changeString = "";
   if (aChangingMethod === "setAttribute") {
     changeString = `document.getElementById("myframe").setAttribute("referrerpolicy", "${aNewAttributePolicy}")`;
   } else if (aChangingMethod === "property") {
@@ -39,17 +43,17 @@ function createIframeTestPageUsingReffer
   }
   var iFrameString = `<iframe src="" id="myframe" ${aAttributePolicy ? ` referrerpolicy="${aAttributePolicy}"` : ""}>iframe</iframe>`;
   var iframeUrl = "";
   if (aParams) {
     aParams.delete("ACTION");
     aParams.append("ACTION", "redirectIframe");
     iframeUrl = "http://" + CROSS_ORIGIN + aParams.toString();
   } else {
-    iframeUrl = createTestUrl(aAttributePolicy, "test", aName, "iframe");
+    iframeUrl = createTestUrl(aAttributePolicy, "test", aName, "iframe", aSchemeFrom, aSchemeTo);
   }
 
   return `<!DOCTYPE HTML>
            <html>
              <head>
              ${metaString}
              </head>
              <body>
@@ -62,53 +66,53 @@ function createIframeTestPageUsingReffer
                    };
                    document.getElementById("myframe").src = "${iframeUrl}";
                  }.bind(window), false);
                </script>
              </body>
            </html>`;
 }
 
-function buildAnchorString(aMetaPolicy, aReferrerPolicy, aName, aRelString){
+function buildAnchorString(aMetaPolicy, aReferrerPolicy, aName, aRelString, aSchemeFrom, aSchemeTo){
   if (aReferrerPolicy) {
-    return `<a href="${createTestUrl(aReferrerPolicy, 'test', aName, 'link')}" referrerpolicy="${aReferrerPolicy}" id="link" ${aRelString}>${aReferrerPolicy}</a>`;
+    return `<a href="${createTestUrl(aReferrerPolicy, 'test', aName, 'link', aSchemeFrom, aSchemeTo)}" referrerpolicy="${aReferrerPolicy}" id="link" ${aRelString}>${aReferrerPolicy}</a>`;
   }
-  return `<a href="${createTestUrl(aMetaPolicy, 'test', aName, 'link')}" id="link" ${aRelString}>link</a>`;
+  return `<a href="${createTestUrl(aMetaPolicy, 'test', aName, 'link', aSchemeFrom, aSchemeTo)}" id="link" ${aRelString}>link</a>`;
 }
 
-function buildAreaString(aMetaPolicy, aReferrerPolicy, aName, aRelString){
+function buildAreaString(aMetaPolicy, aReferrerPolicy, aName, aRelString, aSchemeFrom, aSchemeTo){
   var result = `<img src="file_mozfiledataurl_img.jpg" alt="image" usemap="#imageMap">`;
   result += `<map name="imageMap">`;
   if (aReferrerPolicy) {
-    result += `<area shape="circle" coords="1,1,1" href="${createTestUrl(aReferrerPolicy, 'test', aName, 'link')}" alt="theArea" referrerpolicy="${aReferrerPolicy}" id="link" ${aRelString}>`;
+    result += `<area shape="circle" coords="1,1,1" href="${createTestUrl(aReferrerPolicy, 'test', aName, 'link', aSchemeFrom, aSchemeTo)}" alt="theArea" referrerpolicy="${aReferrerPolicy}" id="link" ${aRelString}>`;
   } else {
-    result += `<area shape="circle" coords="1,1,1" href="${createTestUrl(aMetaPolicy, 'test', aName, 'link')}" alt="theArea" id="link" ${aRelString}>`;
+    result += `<area shape="circle" coords="1,1,1" href="${createTestUrl(aMetaPolicy, 'test', aName, 'link', aSchemeFrom, aSchemeTo)}" alt="theArea" id="link" ${aRelString}>`;
   }
   result += `</map>`;
 
   return result;
 }
 
 // test page using anchor or area referrer attribute
-function createAETestPageUsingRefferer(aMetaPolicy, aAttributePolicy, aNewAttributePolicy, aName, aRel, aStringBuilder, aChangingMethod) {
+function createAETestPageUsingRefferer(aMetaPolicy, aAttributePolicy, aNewAttributePolicy, aName, aRel, aStringBuilder, aSchemeFrom, aSchemeTo, aChangingMethod) {
   var metaString = "";
   if (aMetaPolicy) {
     metaString = `<head><meta name="referrer" content="${aMetaPolicy}"></head>`;
   }
   var changeString = "";
   if (aChangingMethod === "setAttribute") {
     changeString = `document.getElementById("link").setAttribute("referrerpolicy", "${aNewAttributePolicy}")`;
   } else if (aChangingMethod === "property") {
     changeString = `document.getElementById("link").referrerPolicy = "${aNewAttributePolicy}"`;
   }
   var relString = "";
   if (aRel) {
     relString = `rel="noreferrer"`;
   }
-  var elementString = aStringBuilder(aMetaPolicy, aAttributePolicy, aName, relString);
+  var elementString = aStringBuilder(aMetaPolicy, aAttributePolicy, aName, relString, aSchemeFrom, aSchemeTo);
 
   return `<!DOCTYPE HTML>
            <html>
              ${metaString}
              <body>
                ${elementString}
                <script>
                  window.addEventListener("load", function() {
@@ -146,16 +150,18 @@ function createRedirectImgTestCase(aPara
           </script>
           </body>
           </html>`;
 }
 
 function handleRequest(request, response) {
   var params = new URLSearchParams(request.queryString);
   var action = params.get("ACTION");
+  var schemeFrom = params.get("SCHEME_FROM") || "http";
+  var schemeTo = params.get("SCHEME_TO") || "http";
 
   if (action === "resetState") {
     setSharedState(SHARED_KEY, "{}");
     response.write("");
     return;
   }
   if (action === "get-test-results") {
     // ?action=get-result
@@ -196,17 +202,17 @@ function handleRequest(request, response
     result = result ? JSON.parse(result) : {};
 
     var referrerLevel = "none";
     var test = {}
     if (request.hasHeader("Referer")) {
       var referrer = request.getHeader("Referer");
       if (referrer.indexOf("referrer_testserver") > 0) {
         referrerLevel = "full";
-      } else if (referrer.indexOf("http://mochi.test:8888") == 0) {
+      } else if (referrer.indexOf(schemeFrom + "://example.com") == 0) {
         referrerLevel = "origin";
       } else {
         // this is never supposed to happen
         referrerLevel = "other-origin";
       }
       test.referrer = referrer;
     } else {
       test.referrer = "";
@@ -245,18 +251,18 @@ function handleRequest(request, response
   var attributePolicy = params.get("ATTRIBUTE_POLICY") || "";
   var newAttributePolicy = params.get("NEW_ATTRIBUTE_POLICY") || "";
   var metaPolicy = params.get("META_POLICY") || "";
   var rel = params.get("REL") || "";
   var name = params.get("NAME");
 
   // anchor & area
   var _getPage = createAETestPageUsingRefferer.bind(null, metaPolicy, attributePolicy, newAttributePolicy, name, rel);
-  var _getAnchorPage = _getPage.bind(null, buildAnchorString);
-  var _getAreaPage = _getPage.bind(null, buildAreaString);
+  var _getAnchorPage = _getPage.bind(null, buildAnchorString, schemeFrom, schemeTo);
+  var _getAreaPage = _getPage.bind(null, buildAreaString, schemeFrom, schemeTo);
 
   // aMetaPolicy, aAttributePolicy, aNewAttributePolicy, aName, aChangingMethod, aStringBuilder
   if (action === "generate-anchor-policy-test") {
     response.write(_getAnchorPage());
     return;
   }
   if (action === "generate-anchor-changing-policy-test-set-attribute") {
     response.write(_getAnchorPage("setAttribute"));
@@ -275,17 +281,18 @@ function handleRequest(request, response
     return;
   }
   if (action === "generate-area-changing-policy-test-property") {
     response.write(_getAreaPage("property"));
     return;
   }
 
   // iframe
-  _getPage = createIframeTestPageUsingRefferer.bind(null, metaPolicy, attributePolicy, newAttributePolicy, name, "");
+  _getPage = createIframeTestPageUsingRefferer.bind(null, metaPolicy, attributePolicy, newAttributePolicy, name, "",
+                                                    schemeFrom, schemeTo);
 
   // aMetaPolicy, aAttributePolicy, aNewAttributePolicy, aName, aChangingMethod
   if (action === "generate-iframe-policy-test") {
     response.write(_getPage());
     return;
   }
   if (action === "generate-iframe-changing-policy-test-set-attribute") {
     response.write(_getPage("setAttribute"));
@@ -297,15 +304,16 @@ function handleRequest(request, response
   }
 
   // redirect tests with img and iframe
   if (action === "generate-img-redirect-policy-test") {
     response.write(createRedirectImgTestCase(params, attributePolicy));
     return;
   }
   if (action === "generate-iframe-redirect-policy-test") {
-    response.write(createIframeTestPageUsingRefferer(metaPolicy, attributePolicy, newAttributePolicy, name, params));
+    response.write(createIframeTestPageUsingRefferer(metaPolicy, attributePolicy, newAttributePolicy, name, params,
+                                                     schemeFrom, schemeTo));
     return;
   }
 
   response.write("I don't know action " + action);
   return;
 }
--- a/dom/base/test/test_anchor_area_referrer.html
+++ b/dom/base/test/test_anchor_area_referrer.html
@@ -9,18 +9,18 @@
   <!--
   Testing that anchor and area referrer attributes are honoured correctly
   * anchor tag with referrer attribute (generate-anchor-policy-test)
   https://bugzilla.mozilla.org/show_bug.cgi?id=1174913
   -->
 
   <script type="application/javascript;version=1.8">
 
-  const SJS = "/tests/dom/base/test/referrer_testserver.sjs?";
-  const PARAMS = ["ATTRIBUTE_POLICY", "NEW_ATTRIBUTE_POLICY", "META_POLICY", "REL"];
+  const SJS = "://example.com/tests/dom/base/test/referrer_testserver.sjs?";
+  const PARAMS = ["ATTRIBUTE_POLICY", "NEW_ATTRIBUTE_POLICY", "META_POLICY", "REL", "SCHEME_FROM", "SCHEME_TO"];
 
   const testCases = [
     {ACTION: ["generate-anchor-policy-test", "generate-area-policy-test"],
       TESTS: [
         {ATTRIBUTE_POLICY: 'unsafe-url',
          NAME: 'unsafe-url-with-origin-in-meta',
          META_POLICY: 'origin',
          DESC: "unsafe-url (anchor) with origin in meta",
@@ -34,16 +34,38 @@
          NAME: 'no-referrer-with-origin-in-meta',
          META_POLICY: 'origin',
          DESC: "no-referrer (anchor) with origin in meta",
          RESULT: 'none'},
         {NAME: 'no-referrer-in-meta',
          META_POLICY: 'no-referrer',
          DESC: "no-referrer in meta",
          RESULT: 'none'},
+
+         // Test if element attr would override meta referr policy.
+
+         // 1. Downgrade.
+        {ATTRIBUTE_POLICY: 'no-referrer-when-downgrade',
+         NAME: 'origin-in-meta-downgrade-in-attr',
+         META_POLICY: 'origin',
+         DESC: 'origin in meta downgrade in attr',
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'http',
+         RESULT: 'none'},
+
+         // 2. No downgrade.
+        {ATTRIBUTE_POLICY: 'no-referrer-when-downgrade',
+         NAME: 'origin-in-meta-downgrade-in-attr',
+         META_POLICY: 'origin',
+         DESC: 'origin in meta downgrade in attr',
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'https',
+         RESULT: 'full'},
+         // End of element attr overriding test..
+
         {ATTRIBUTE_POLICY: 'origin',
          NAME: 'origin-with-no-meta',
          META_POLICY: '',
          DESC: "origin (anchor) with no meta",
          RESULT: 'origin'}]}
   ];
   </script>
   <script type="application/javascript;version=1.7" src="/tests/dom/base/test/referrer_helper.js"></script>
--- a/dom/base/test/test_anchor_area_referrer_changing.html
+++ b/dom/base/test/test_anchor_area_referrer_changing.html
@@ -10,17 +10,17 @@
   Testing that anchor and area referrer attributes are honoured correctly
   This test is split due to errors on b2g
   * testing setAttribute and .referrer (generate-anchor-changing-test)
   https://bugzilla.mozilla.org/show_bug.cgi?id=1174913
   -->
 
   <script type="application/javascript;version=1.8">
 
-  const SJS = "/tests/dom/base/test/referrer_testserver.sjs?";
+  const SJS = "://example.com/tests/dom/base/test/referrer_testserver.sjs?";
   const PARAMS = ["ATTRIBUTE_POLICY", "NEW_ATTRIBUTE_POLICY", "META_POLICY", "REL"];
 
   const testCases = [
     {ACTION: ["generate-anchor-changing-policy-test-set-attribute", "generate-area-changing-policy-test-set-attribute"],
       TESTS: [
         {ATTRIBUTE_POLICY: 'unsafe-url',
          NEW_ATTRIBUTE_POLICY: 'no-referrer',
          NAME: 'no-referrer-unsafe-url-with-origin-in-meta',
--- a/dom/base/test/test_anchor_area_referrer_invalid.html
+++ b/dom/base/test/test_anchor_area_referrer_invalid.html
@@ -9,52 +9,63 @@
   <!--
   Testing that anchor and area referrer attributes are honoured correctly
   * anchor tag with invalid referrer attributes
   https://bugzilla.mozilla.org/show_bug.cgi?id=1174913
   -->
 
   <script type="application/javascript;version=1.8">
 
-  const SJS = "/tests/dom/base/test/referrer_testserver.sjs?";
-  const PARAMS = ["ATTRIBUTE_POLICY", "NEW_ATTRIBUTE_POLICY", "META_POLICY", "REL"];
+  const SJS = "://example.com/tests/dom/base/test/referrer_testserver.sjs?";
+  const PARAMS = ["ATTRIBUTE_POLICY", "NEW_ATTRIBUTE_POLICY", "META_POLICY", "REL", , "SCHEME_FROM", "SCHEME_TO"];
 
   const testCases = [
     {ACTION: ["generate-anchor-policy-test", "generate-area-policy-test"],
       TESTS: [
         // setting invalid refer values -> we expect either full referrer (default)
         // or whatever is specified in the meta referrer policy
+
+        // Note that for those test cases which require cross-origin test, we use different
+        // scheme to result in cross-origin request.
         {ATTRIBUTE_POLICY: 'origin-when-cross-origin',
          NAME: 'origin-when-cross-origin-with-no-meta',
          META_POLICY: '',
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'http',
          DESC: "origin-when-cross-origin (anchor) with no meta",
-         RESULT: 'full'},
+         RESULT: 'origin'},
         {ATTRIBUTE_POLICY: 'default',
          NAME: 'default-with-no-meta',
          META_POLICY: '',
          DESC: "default (anchor) with no meta",
          RESULT: 'full'},
         {ATTRIBUTE_POLICY: 'something',
          NAME: 'something-with-no-meta',
          META_POLICY: '',
          DESC: "something (anchor) with no meta",
          RESULT: 'full'},
         {ATTRIBUTE_POLICY: 'origin-when-cross-origin',
          NAME: 'origin-when-cross-origin-with-no-referrer-in-meta',
          META_POLICY: 'no-referrer',
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'http',
          DESC: "origin-when-cross-origin (anchor) with no-referrer in meta",
-         RESULT: 'none'},
+         RESULT: 'origin'},
         {ATTRIBUTE_POLICY: 'origin-when-cross-origin',
          NAME: 'origin-when-cross-origin-with-unsafe-url-in-meta',
          META_POLICY: 'unsafe-url',
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'http',
          DESC: "origin-when-cross-origin (anchor) with unsafe-url in meta",
-         RESULT: 'full'},
+         RESULT: 'origin'},
         {ATTRIBUTE_POLICY: 'origin-when-cross-origin',
          NAME: 'origin-when-cross-origin-with-origin-in-meta',
          META_POLICY: 'origin',
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'http',
          DESC: "origin-when-cross-origin (anchor) with origin in meta",
          RESULT: 'origin'}]}
   ];
   </script>
   <script type="application/javascript;version=1.7" src="/tests/dom/base/test/referrer_helper.js"></script>
 </head>
 <body onload="tests.next();">
   <iframe id="testframe"></iframe>
--- a/dom/base/test/test_anchor_area_referrer_rel.html
+++ b/dom/base/test/test_anchor_area_referrer_rel.html
@@ -9,17 +9,17 @@
   <!--
   Testing that anchor and area referrer attributes are honoured correctly
   * anchor tag with referrer attribute with rel=noreferrer
   https://bugzilla.mozilla.org/show_bug.cgi?id=1174913
   -->
 
   <script type="application/javascript;version=1.8">
 
-  const SJS = "/tests/dom/base/test/referrer_testserver.sjs?";
+  const SJS = "://example.com/tests/dom/base/test/referrer_testserver.sjs?";
   const PARAMS = ["ATTRIBUTE_POLICY", "NEW_ATTRIBUTE_POLICY", "META_POLICY", "REL"];
 
   const testCases = [
     {ACTION: ["generate-anchor-policy-test", "generate-area-policy-test"],
       TESTS: [
         // setting rel=noreferrer -> we expect no referrer
         {ATTRIBUTE_POLICY: 'unsafe-url',
          NAME: 'unsafe-url-with-origin-in-meta-rel',
--- a/dom/base/test/test_iframe_referrer.html
+++ b/dom/base/test/test_iframe_referrer.html
@@ -10,17 +10,17 @@
   Testing that iframe referrer attribute is honoured correctly
   * regular loads
   * regression tests that meta referrer is still working even if attribute referrers are enabled
   https://bugzilla.mozilla.org/show_bug.cgi?id=1175736
   -->
 
   <script type="application/javascript;version=1.7">
 
-  const SJS = "/tests/dom/base/test/referrer_testserver.sjs?";
+  const SJS = "://example.com/tests/dom/base/test/referrer_testserver.sjs?";
   const PARAMS = ["ATTRIBUTE_POLICY", "NEW_ATTRIBUTE_POLICY", "META_POLICY"];
 
   const testCases = [
     {ACTION: ["generate-iframe-policy-test"],
       TESTS: [
         {ATTRIBUTE_POLICY: 'unsafe-url',
          NAME: 'unsafe-url-with-origin-in-meta',
          META_POLICY: 'origin',
--- a/dom/base/test/test_iframe_referrer_changing.html
+++ b/dom/base/test/test_iframe_referrer_changing.html
@@ -9,17 +9,17 @@
   <!--
   Testing that iframe referrer attribute is honoured correctly
   * testing setAttribute and .referrer
   https://bugzilla.mozilla.org/show_bug.cgi?id=1175736
   -->
 
   <script type="application/javascript;version=1.7">
 
-  const SJS = "/tests/dom/base/test/referrer_testserver.sjs?";
+  const SJS = "://example.com/tests/dom/base/test/referrer_testserver.sjs?";
   const PARAMS = ["ATTRIBUTE_POLICY", "NEW_ATTRIBUTE_POLICY", "META_POLICY"];
 
   const testCases = [
     {ACTION: ["generate-iframe-changing-policy-test-set-attribute"],
       TESTS: [
         {ATTRIBUTE_POLICY: 'unsafe-url',
          NEW_ATTRIBUTE_POLICY: 'no-referrer',
          NAME: 'no-referrer-unsafe-url-with-origin-in-meta',
--- a/dom/base/test/test_iframe_referrer_invalid.html
+++ b/dom/base/test/test_iframe_referrer_invalid.html
@@ -9,53 +9,64 @@
   <!--
   Testing that iframe referrer attribute is honoured correctly
   * invalid referrer policies
   https://bugzilla.mozilla.org/show_bug.cgi?id=1175736
   -->
 
   <script type="application/javascript;version=1.7">
 
-  const SJS = "/tests/dom/base/test/referrer_testserver.sjs?";
-  const PARAMS = ["ATTRIBUTE_POLICY", "NEW_ATTRIBUTE_POLICY", "META_POLICY"];
+  const SJS = "://example.com/tests/dom/base/test/referrer_testserver.sjs?";
+  const PARAMS = ["ATTRIBUTE_POLICY", "NEW_ATTRIBUTE_POLICY", "META_POLICY", "SCHEME_FROM", "SCHEME_TO"];
 
   const testCases = [
     {ACTION: ["generate-iframe-policy-test"],
       TESTS: [
         // setting invalid refer values -> we expect either full referrer (default)
         // or whatever is specified in the meta referrer policy
+
+        // Note that for those test cases which require cross-origin test, we use different
+        // scheme to result in cross-origin request.
         {ATTRIBUTE_POLICY: 'origin-when-cross-origin',
          NAME: 'origin-when-cross-origin-with-no-meta',
          META_POLICY: '',
          DESC: "origin-when-cross-origin (iframe) with no meta",
-         RESULT: 'full'},
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'http',
+         RESULT: 'origin'},
         {ATTRIBUTE_POLICY: 'default',
          NAME: 'default-with-no-meta',
          META_POLICY: '',
          DESC: "default (iframe) with no meta",
          RESULT: 'full'},
         {ATTRIBUTE_POLICY: 'something',
          NAME: 'something-with-no-meta',
          META_POLICY: '',
          DESC: "something (iframe) with no meta",
          RESULT: 'full'},
         {ATTRIBUTE_POLICY: 'origin-when-cross-origin',
          NAME: 'origin-when-cross-origin-with-no-referrer-in-meta',
          META_POLICY: 'no-referrer',
          DESC: "origin-when-cross-origin (iframe) with no-referrer in meta",
-         RESULT: 'none'},
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'http',
+         RESULT: 'origin'},
         {ATTRIBUTE_POLICY: 'origin-when-cross-origin',
          NAME: 'origin-when-cross-origin-with-unsafe-url-in-meta',
          META_POLICY: 'unsafe-url',
          DESC: "origin-when-cross-origin (iframe) with unsafe-url in meta",
-         RESULT: 'full'},
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'http',
+         RESULT: 'origin'},
         {ATTRIBUTE_POLICY: 'origin-when-cross-origin',
          NAME: 'origin-when-cross-origin-with-origin-in-meta',
          META_POLICY: 'origin',
          DESC: "origin-when-cross-origin (iframe) with origin in meta",
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'http',
          RESULT: 'origin'},
         {NAME: 'origin-in-meta',
          META_POLICY: 'origin',
          DESC: "origin in meta",
          RESULT: 'origin'},
         {NAME: 'no-referrer-in-meta',
          META_POLICY: 'no-referrer',
          DESC: "no-referrer in meta",
--- a/dom/base/test/test_referrer_redirect.html
+++ b/dom/base/test/test_referrer_redirect.html
@@ -8,17 +8,17 @@
 
   <!--
   Testing referrer headers after redirects.
   https://bugzilla.mozilla.org/show_bug.cgi?id=1184781
   -->
 
   <script type="application/javascript;version=1.8">
 
-  const SJS = "/tests/dom/base/test/referrer_testserver.sjs?";
+  const SJS = "://example.com/tests/dom/base/test/referrer_testserver.sjs?";
   const PARAMS = ["ATTRIBUTE_POLICY", "NEW_ATTRIBUTE_POLICY", "META_POLICY"];
 
   const testCases = [
     {ACTION: ["generate-img-redirect-policy-test", "generate-iframe-redirect-policy-test"],
       TESTS: [
         {
           ATTRIBUTE_POLICY: "no-referrer",
            NAME: "no-referrer-with-no-meta",
--- a/dom/canvas/moz.build
+++ b/dom/canvas/moz.build
@@ -6,18 +6,19 @@
 
 TEST_DIRS += ['compiledtest']
 
 # Number changes to this file to avoid bug 1081323 (clobber after changing a manifest):
 # 12
 
 MOCHITEST_MANIFESTS += [
     'test/crossorigin/mochitest.ini',
-    'test/mochitest-subsuite-webgl.ini',
     'test/mochitest.ini',
+    'test/webgl-conf/generated-mochitest.ini',
+    'test/webgl-mochitest/mochitest.ini',
 ]
 
 MOCHITEST_CHROME_MANIFESTS += ['test/chrome/chrome.ini']
 
 EXPORTS += [
     'nsICanvasRenderingContextInternal.h',
 ]
 
deleted file mode 100644
--- a/dom/canvas/test/_webgl-conformance.ini
+++ /dev/null
@@ -1,847 +0,0 @@
-# This is a GENERATED FILE. Do not edit it directly.
-# Regenerated it by using `python generate-wrappers-and-manifest.py`.
-# Mark skipped tests in mochitest-errata.ini.
-# Mark failing tests in mochi-single.html.
-
-[DEFAULT]
-subsuite = webgl
-skip-if = os == 'b2g' || ((os == 'linux') && (buildapp == 'b2g')) || ((os == 'linux') && (buildapp == 'mulet'))
-
-support-files = webgl-conformance/../webgl-mochitest/driver-info.js
-                webgl-conformance/always-fail.html
-                webgl-conformance/conformance/00_readme.txt
-                webgl-conformance/conformance/00_test_list.txt
-                webgl-conformance/conformance/LICENSE_CHROMIUM
-                webgl-conformance/conformance/attribs/00_test_list.txt
-                webgl-conformance/conformance/attribs/gl-enable-vertex-attrib.html