merge mozilla-inbound to mozilla-central a=merge
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Fri, 12 May 2017 14:36:44 +0200
changeset 358072 030c0a7c878192d8dc1b04c182575c2f7858cdd0
parent 358071 bcb5e1ff13f807387595d5b6b5dbdb4c3b8ad501 (current diff)
parent 357970 ebad7f51280d3a0dddbc6decb73f5aa0078b6e7e (diff)
child 358073 eac6de13a9e7665668fa1fa346107bd4d41a6619
push id90256
push userryanvm@gmail.com
push dateFri, 12 May 2017 16:11:50 +0000
treeherdermozilla-inbound@823615e72783 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone55.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
merge mozilla-inbound to mozilla-central a=merge
browser/app/profile/firefox.js
browser/base/content/browser.js
browser/base/content/tabbrowser.xml
browser/components/sessionstore/SessionStore.jsm
browser/components/sessionstore/test/browser.ini
dom/media/MediaPrefs.h
ipc/chromium/src/third_party/libevent/Makefile.in
ipc/chromium/src/third_party/libevent/README
ipc/chromium/src/third_party/libevent/WIN32-Code/event2/event-config.h
ipc/chromium/src/third_party/libevent/aclocal.m4
ipc/chromium/src/third_party/libevent/compile
ipc/chromium/src/third_party/libevent/config.guess
ipc/chromium/src/third_party/libevent/config.h.in
ipc/chromium/src/third_party/libevent/config.sub
ipc/chromium/src/third_party/libevent/configure
ipc/chromium/src/third_party/libevent/depcomp
ipc/chromium/src/third_party/libevent/evdns.h
ipc/chromium/src/third_party/libevent/event.h
ipc/chromium/src/third_party/libevent/evhttp.h
ipc/chromium/src/third_party/libevent/evrpc.h
ipc/chromium/src/third_party/libevent/evutil.h
ipc/chromium/src/third_party/libevent/include/Makefile.am
ipc/chromium/src/third_party/libevent/include/Makefile.in
ipc/chromium/src/third_party/libevent/install-sh
ipc/chromium/src/third_party/libevent/ltmain.sh
ipc/chromium/src/third_party/libevent/m4/libtool.m4
ipc/chromium/src/third_party/libevent/m4/ltoptions.m4
ipc/chromium/src/third_party/libevent/m4/ltsugar.m4
ipc/chromium/src/third_party/libevent/m4/ltversion.m4
ipc/chromium/src/third_party/libevent/m4/lt~obsolete.m4
ipc/chromium/src/third_party/libevent/missing
ipc/chromium/src/third_party/libevent/patches/avoid-empty-sighandler.patch
ipc/chromium/src/third_party/libevent/patches/backport-upstream-fixes.patch
ipc/chromium/src/third_party/libevent/patches/fix-kqueue-workaround.patch
ipc/chromium/src/third_party/libevent/sample/Makefile.am
ipc/chromium/src/third_party/libevent/sample/Makefile.in
ipc/chromium/src/third_party/libevent/sample/event-test.c
ipc/chromium/src/third_party/libevent/test/Makefile.am
ipc/chromium/src/third_party/libevent/test/Makefile.in
ipc/chromium/src/third_party/libevent/test/regress.gen.c
ipc/chromium/src/third_party/libevent/test/regress.gen.h
js/src/tests/test262/annexB/built-ins/escape/B.2.1.js
js/src/tests/test262/annexB/built-ins/escape/B.2.1.propertyCheck.js
js/src/tests/test262/annexB/built-ins/unescape/B.2.2.js
js/src/tests/test262/annexB/built-ins/unescape/B.2.2.propertyCheck.js
js/src/tests/test262/annexB/language/eval-code/direct/func-block-decl-eval-func-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-block-decl-eval-func-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-block-decl-eval-func-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-block-decl-eval-func-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-block-decl-eval-func-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-block-decl-eval-func-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-else-decl-a-eval-func-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-else-decl-a-eval-func-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-else-decl-a-eval-func-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-else-decl-a-eval-func-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-else-decl-a-eval-func-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-else-decl-a-eval-func-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-else-decl-b-eval-func-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-else-decl-b-eval-func-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-else-decl-b-eval-func-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-else-decl-b-eval-func-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-else-decl-b-eval-func-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-else-decl-b-eval-func-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-else-stmt-eval-func-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-else-stmt-eval-func-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-else-stmt-eval-func-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-else-stmt-eval-func-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-else-stmt-eval-func-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-else-stmt-eval-func-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-no-else-eval-func-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-no-else-eval-func-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-no-else-eval-func-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-no-else-eval-func-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-no-else-eval-func-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-decl-no-else-eval-func-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-stmt-else-decl-eval-func-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-stmt-else-decl-eval-func-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-stmt-else-decl-eval-func-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-stmt-else-decl-eval-func-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-stmt-else-decl-eval-func-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-if-stmt-else-decl-eval-func-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-switch-case-eval-func-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-switch-case-eval-func-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-switch-case-eval-func-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-switch-case-eval-func-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-switch-case-eval-func-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-switch-case-eval-func-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-switch-dflt-eval-func-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-switch-dflt-eval-func-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-switch-dflt-eval-func-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-switch-dflt-eval-func-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/func-switch-dflt-eval-func-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/func-switch-dflt-eval-func-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-block-decl-eval-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-block-decl-eval-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-block-decl-eval-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-block-decl-eval-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-block-decl-eval-global-exsting-global-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-block-decl-eval-global-exsting-global-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-block-decl-eval-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-block-decl-eval-global-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-decl-a-eval-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-decl-a-eval-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-decl-a-eval-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-decl-a-eval-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-decl-a-eval-global-exsting-global-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-decl-a-eval-global-exsting-global-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-decl-a-eval-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-decl-a-eval-global-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-decl-b-eval-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-decl-b-eval-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-decl-b-eval-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-decl-b-eval-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-decl-b-eval-global-exsting-global-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-decl-b-eval-global-exsting-global-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-decl-b-eval-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-decl-b-eval-global-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-stmt-eval-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-stmt-eval-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-stmt-eval-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-stmt-eval-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-stmt-eval-global-exsting-global-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-stmt-eval-global-exsting-global-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-stmt-eval-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-else-stmt-eval-global-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-no-else-eval-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-no-else-eval-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-no-else-eval-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-no-else-eval-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-no-else-eval-global-exsting-global-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-no-else-eval-global-exsting-global-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-no-else-eval-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-decl-no-else-eval-global-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-stmt-else-decl-eval-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-stmt-else-decl-eval-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-stmt-else-decl-eval-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-stmt-else-decl-eval-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-stmt-else-decl-eval-global-exsting-global-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-stmt-else-decl-eval-global-exsting-global-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-stmt-else-decl-eval-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-if-stmt-else-decl-eval-global-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-switch-case-eval-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-switch-case-eval-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-switch-case-eval-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-switch-case-eval-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-switch-case-eval-global-exsting-global-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-switch-case-eval-global-exsting-global-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-switch-case-eval-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-switch-case-eval-global-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-switch-dflt-eval-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-switch-dflt-eval-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-switch-dflt-eval-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-switch-dflt-eval-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-switch-dflt-eval-global-exsting-global-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-switch-dflt-eval-global-exsting-global-update.js
js/src/tests/test262/annexB/language/eval-code/direct/global-switch-dflt-eval-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/direct/global-switch-dflt-eval-global-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-block-decl-eval-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-block-decl-eval-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-block-decl-eval-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-block-decl-eval-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-block-decl-eval-global-exsting-global-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-block-decl-eval-global-exsting-global-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-block-decl-eval-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-block-decl-eval-global-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-decl-a-eval-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-decl-a-eval-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-decl-a-eval-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-decl-a-eval-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-decl-a-eval-global-exsting-global-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-decl-a-eval-global-exsting-global-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-decl-a-eval-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-decl-a-eval-global-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-decl-b-eval-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-decl-b-eval-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-decl-b-eval-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-decl-b-eval-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-decl-b-eval-global-exsting-global-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-decl-b-eval-global-exsting-global-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-decl-b-eval-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-decl-b-eval-global-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-stmt-eval-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-stmt-eval-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-stmt-eval-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-stmt-eval-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-stmt-eval-global-exsting-global-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-stmt-eval-global-exsting-global-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-stmt-eval-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-else-stmt-eval-global-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-no-else-eval-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-no-else-eval-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-no-else-eval-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-no-else-eval-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-no-else-eval-global-exsting-global-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-no-else-eval-global-exsting-global-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-no-else-eval-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-decl-no-else-eval-global-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-stmt-else-decl-eval-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-stmt-else-decl-eval-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-stmt-else-decl-eval-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-stmt-else-decl-eval-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-stmt-else-decl-eval-global-exsting-global-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-stmt-else-decl-eval-global-exsting-global-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-stmt-else-decl-eval-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-if-stmt-else-decl-eval-global-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-switch-case-eval-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-switch-case-eval-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-switch-case-eval-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-switch-case-eval-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-switch-case-eval-global-exsting-global-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-switch-case-eval-global-exsting-global-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-switch-case-eval-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-switch-case-eval-global-exsting-var-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-switch-dflt-eval-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-switch-dflt-eval-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-switch-dflt-eval-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-switch-dflt-eval-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-switch-dflt-eval-global-exsting-global-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-switch-dflt-eval-global-exsting-global-update.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-switch-dflt-eval-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/eval-code/indirect/global-switch-dflt-eval-global-exsting-var-update.js
js/src/tests/test262/annexB/language/function-code/block-decl-func-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/function-code/block-decl-func-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/function-code/block-decl-func-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/function-code/block-decl-func-exsting-fn-update.js
js/src/tests/test262/annexB/language/function-code/block-decl-func-exsting-var-no-init.js
js/src/tests/test262/annexB/language/function-code/block-decl-func-exsting-var-update.js
js/src/tests/test262/annexB/language/function-code/if-decl-else-decl-a-func-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/function-code/if-decl-else-decl-a-func-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/function-code/if-decl-else-decl-a-func-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/function-code/if-decl-else-decl-a-func-exsting-fn-update.js
js/src/tests/test262/annexB/language/function-code/if-decl-else-decl-a-func-exsting-var-no-init.js
js/src/tests/test262/annexB/language/function-code/if-decl-else-decl-a-func-exsting-var-update.js
js/src/tests/test262/annexB/language/function-code/if-decl-else-decl-b-func-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/function-code/if-decl-else-decl-b-func-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/function-code/if-decl-else-decl-b-func-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/function-code/if-decl-else-decl-b-func-exsting-fn-update.js
js/src/tests/test262/annexB/language/function-code/if-decl-else-decl-b-func-exsting-var-no-init.js
js/src/tests/test262/annexB/language/function-code/if-decl-else-decl-b-func-exsting-var-update.js
js/src/tests/test262/annexB/language/function-code/if-decl-else-stmt-func-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/function-code/if-decl-else-stmt-func-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/function-code/if-decl-else-stmt-func-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/function-code/if-decl-else-stmt-func-exsting-fn-update.js
js/src/tests/test262/annexB/language/function-code/if-decl-else-stmt-func-exsting-var-no-init.js
js/src/tests/test262/annexB/language/function-code/if-decl-else-stmt-func-exsting-var-update.js
js/src/tests/test262/annexB/language/function-code/if-decl-no-else-func-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/function-code/if-decl-no-else-func-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/function-code/if-decl-no-else-func-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/function-code/if-decl-no-else-func-exsting-fn-update.js
js/src/tests/test262/annexB/language/function-code/if-decl-no-else-func-exsting-var-no-init.js
js/src/tests/test262/annexB/language/function-code/if-decl-no-else-func-exsting-var-update.js
js/src/tests/test262/annexB/language/function-code/if-stmt-else-decl-func-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/function-code/if-stmt-else-decl-func-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/function-code/if-stmt-else-decl-func-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/function-code/if-stmt-else-decl-func-exsting-fn-update.js
js/src/tests/test262/annexB/language/function-code/if-stmt-else-decl-func-exsting-var-no-init.js
js/src/tests/test262/annexB/language/function-code/if-stmt-else-decl-func-exsting-var-update.js
js/src/tests/test262/annexB/language/function-code/switch-case-func-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/function-code/switch-case-func-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/function-code/switch-case-func-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/function-code/switch-case-func-exsting-fn-update.js
js/src/tests/test262/annexB/language/function-code/switch-case-func-exsting-var-no-init.js
js/src/tests/test262/annexB/language/function-code/switch-case-func-exsting-var-update.js
js/src/tests/test262/annexB/language/function-code/switch-dflt-func-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/function-code/switch-dflt-func-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/function-code/switch-dflt-func-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/function-code/switch-dflt-func-exsting-fn-update.js
js/src/tests/test262/annexB/language/function-code/switch-dflt-func-exsting-var-no-init.js
js/src/tests/test262/annexB/language/function-code/switch-dflt-func-exsting-var-update.js
js/src/tests/test262/annexB/language/global-code/block-decl-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/global-code/block-decl-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/global-code/block-decl-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/global-code/block-decl-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/global-code/block-decl-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/global-code/block-decl-global-exsting-var-update.js
js/src/tests/test262/annexB/language/global-code/if-decl-else-decl-a-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/global-code/if-decl-else-decl-a-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/global-code/if-decl-else-decl-a-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/global-code/if-decl-else-decl-a-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/global-code/if-decl-else-decl-a-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/global-code/if-decl-else-decl-a-global-exsting-var-update.js
js/src/tests/test262/annexB/language/global-code/if-decl-else-decl-b-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/global-code/if-decl-else-decl-b-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/global-code/if-decl-else-decl-b-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/global-code/if-decl-else-decl-b-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/global-code/if-decl-else-decl-b-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/global-code/if-decl-else-decl-b-global-exsting-var-update.js
js/src/tests/test262/annexB/language/global-code/if-decl-else-stmt-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/global-code/if-decl-else-stmt-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/global-code/if-decl-else-stmt-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/global-code/if-decl-else-stmt-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/global-code/if-decl-else-stmt-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/global-code/if-decl-else-stmt-global-exsting-var-update.js
js/src/tests/test262/annexB/language/global-code/if-decl-no-else-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/global-code/if-decl-no-else-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/global-code/if-decl-no-else-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/global-code/if-decl-no-else-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/global-code/if-decl-no-else-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/global-code/if-decl-no-else-global-exsting-var-update.js
js/src/tests/test262/annexB/language/global-code/if-stmt-else-decl-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/global-code/if-stmt-else-decl-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/global-code/if-stmt-else-decl-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/global-code/if-stmt-else-decl-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/global-code/if-stmt-else-decl-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/global-code/if-stmt-else-decl-global-exsting-var-update.js
js/src/tests/test262/annexB/language/global-code/switch-case-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/global-code/switch-case-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/global-code/switch-case-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/global-code/switch-case-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/global-code/switch-case-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/global-code/switch-case-global-exsting-var-update.js
js/src/tests/test262/annexB/language/global-code/switch-dflt-global-exsting-block-fn-no-init.js
js/src/tests/test262/annexB/language/global-code/switch-dflt-global-exsting-block-fn-update.js
js/src/tests/test262/annexB/language/global-code/switch-dflt-global-exsting-fn-no-init.js
js/src/tests/test262/annexB/language/global-code/switch-dflt-global-exsting-fn-update.js
js/src/tests/test262/annexB/language/global-code/switch-dflt-global-exsting-var-no-init.js
js/src/tests/test262/annexB/language/global-code/switch-dflt-global-exsting-var-update.js
js/src/tests/test262/built-ins/Array/15.4.5.1-3.d-1.js
js/src/tests/test262/built-ins/Array/15.4.5.1-3.d-2.js
js/src/tests/test262/built-ins/Array/15.4.5.1-3.d-3.js
js/src/tests/test262/built-ins/Array/S15.4.3_A2.1.js
js/src/tests/test262/built-ins/Array/S15.4.3_A2.2.js
js/src/tests/test262/built-ins/Array/S15.4.3_A2.3.js
js/src/tests/test262/built-ins/Array/S15.4.3_A2.4.js
js/src/tests/test262/built-ins/Array/S15.4.5.1_A1.1_T1.js
js/src/tests/test262/built-ins/Array/S15.4.5.1_A1.1_T2.js
js/src/tests/test262/built-ins/Array/S15.4.5.1_A1.2_T1.js
js/src/tests/test262/built-ins/Array/S15.4.5.1_A1.2_T3.js
js/src/tests/test262/built-ins/Array/S15.4.5.1_A1.3_T1.js
js/src/tests/test262/built-ins/Array/S15.4.5.1_A1.3_T2.js
js/src/tests/test262/built-ins/Array/S15.4.5.2_A3_T4.js
js/src/tests/test262/built-ins/Array/S15.4_A1.1_T1.js
js/src/tests/test262/built-ins/Array/S15.4_A1.1_T2.js
js/src/tests/test262/built-ins/Array/S15.4_A1.1_T3.js
js/src/tests/test262/built-ins/Array/define-own-prop-length-overflow-realm.js
js/src/tests/test262/built-ins/Array/prototype/S15.4.3.1_A1.js
js/src/tests/test262/built-ins/Array/prototype/S15.4.3.1_A2.js
js/src/tests/test262/built-ins/Array/prototype/S15.4.3.1_A3.js
js/src/tests/test262/built-ins/Array/prototype/S15.4.3.1_A4.js
js/src/tests/test262/built-ins/Array/prototype/S15.4.3.1_A5.js
js/src/tests/test262/built-ins/Array/prototype/S15.4.4_A1.1_T1.js
js/src/tests/test262/built-ins/Array/prototype/S15.4.4_A1.1_T2.js
js/src/tests/test262/built-ins/Array/prototype/S15.4.4_A1.1_T3.js
js/src/tests/test262/built-ins/Array/prototype/S15.4.4_A1.2_T1.js
js/src/tests/test262/built-ins/Array/prototype/S15.4.4_A1.3_T1.js
js/src/tests/test262/built-ins/Array/prototype/S15.4.4_A2.1_T1.js
js/src/tests/test262/built-ins/Array/prototype/S15.4.4_A2.1_T2.js
js/src/tests/test262/built-ins/Array/prototype/concat/Array.prototype.concat_arity.js
js/src/tests/test262/built-ins/Array/prototype/concat/Array.prototype.concat_descriptor.js
js/src/tests/test262/built-ins/Array/prototype/concat/S15.4.4.4_A4.1.js
js/src/tests/test262/built-ins/Array/prototype/concat/S15.4.4.4_A4.2.js
js/src/tests/test262/built-ins/Array/prototype/concat/S15.4.4.4_A4.3.js
js/src/tests/test262/built-ins/Array/prototype/concat/S15.4.4.4_A4.4.js
js/src/tests/test262/built-ins/Array/prototype/concat/S15.4.4.4_A4.5.js
js/src/tests/test262/built-ins/Array/prototype/concat/S15.4.4.4_A4.6.js
js/src/tests/test262/built-ins/Array/prototype/concat/S15.4.4.4_A4.7.js
js/src/tests/test262/built-ins/Array/prototype/constructor/S15.4.4.1_A1_T1.js
js/src/tests/test262/built-ins/Array/prototype/constructor/S15.4.4.1_A2.js
js/src/tests/test262/built-ins/Array/prototype/constructor/browser.js
js/src/tests/test262/built-ins/Array/prototype/constructor/shell.js
js/src/tests/test262/built-ins/Array/prototype/copyWithin/copyWithin.js
js/src/tests/test262/built-ins/Array/prototype/entries/entries.js
js/src/tests/test262/built-ins/Array/prototype/fill/fill.js
js/src/tests/test262/built-ins/Array/prototype/filter/15.4.4.20-0-1.js
js/src/tests/test262/built-ins/Array/prototype/filter/15.4.4.20-0-2.js
js/src/tests/test262/built-ins/Array/prototype/find/find.js
js/src/tests/test262/built-ins/Array/prototype/findIndex/findIndex.js
js/src/tests/test262/built-ins/Array/prototype/forEach/15.4.4.18-0-1.js
js/src/tests/test262/built-ins/Array/prototype/forEach/15.4.4.18-0-2.js
js/src/tests/test262/built-ins/Array/prototype/indexOf/15.4.4.14-0-1.js
js/src/tests/test262/built-ins/Array/prototype/indexOf/15.4.4.14-0-2.js
js/src/tests/test262/built-ins/Array/prototype/join/S15.4.4.5_A6.1.js
js/src/tests/test262/built-ins/Array/prototype/join/S15.4.4.5_A6.2.js
js/src/tests/test262/built-ins/Array/prototype/join/S15.4.4.5_A6.3.js
js/src/tests/test262/built-ins/Array/prototype/join/S15.4.4.5_A6.4.js
js/src/tests/test262/built-ins/Array/prototype/join/S15.4.4.5_A6.5.js
js/src/tests/test262/built-ins/Array/prototype/keys/keys.js
js/src/tests/test262/built-ins/Array/prototype/lastIndexOf/15.4.4.15-0-1.js
js/src/tests/test262/built-ins/Array/prototype/lastIndexOf/15.4.4.15-0-2.js
js/src/tests/test262/built-ins/Array/prototype/map/15.4.4.19-0-1.js
js/src/tests/test262/built-ins/Array/prototype/map/15.4.4.19-0-2.js
js/src/tests/test262/built-ins/Array/prototype/pop/S15.4.4.6_A5.1.js
js/src/tests/test262/built-ins/Array/prototype/pop/S15.4.4.6_A5.2.js
js/src/tests/test262/built-ins/Array/prototype/pop/S15.4.4.6_A5.3.js
js/src/tests/test262/built-ins/Array/prototype/pop/S15.4.4.6_A5.4.js
js/src/tests/test262/built-ins/Array/prototype/pop/S15.4.4.6_A5.5.js
js/src/tests/test262/built-ins/Array/prototype/pop/S15.4.4.6_A5.6.js
js/src/tests/test262/built-ins/Array/prototype/push/S15.4.4.7_A6.1.js
js/src/tests/test262/built-ins/Array/prototype/push/S15.4.4.7_A6.2.js
js/src/tests/test262/built-ins/Array/prototype/push/S15.4.4.7_A6.3.js
js/src/tests/test262/built-ins/Array/prototype/push/S15.4.4.7_A6.4.js
js/src/tests/test262/built-ins/Array/prototype/push/S15.4.4.7_A6.5.js
js/src/tests/test262/built-ins/Array/prototype/push/S15.4.4.7_A6.6.js
js/src/tests/test262/built-ins/Array/prototype/reduce/15.4.4.21-0-1.js
js/src/tests/test262/built-ins/Array/prototype/reduce/15.4.4.21-0-2.js
js/src/tests/test262/built-ins/Array/prototype/reduceRight/15.4.4.22-0-1.js
js/src/tests/test262/built-ins/Array/prototype/reduceRight/15.4.4.22-0-2.js
js/src/tests/test262/built-ins/Array/prototype/reverse/S15.4.4.8_A5.1.js
js/src/tests/test262/built-ins/Array/prototype/reverse/S15.4.4.8_A5.2.js
js/src/tests/test262/built-ins/Array/prototype/reverse/S15.4.4.8_A5.3.js
js/src/tests/test262/built-ins/Array/prototype/reverse/S15.4.4.8_A5.4.js
js/src/tests/test262/built-ins/Array/prototype/reverse/S15.4.4.8_A5.5.js
js/src/tests/test262/built-ins/Array/prototype/reverse/S15.4.4.8_A5.6.js
js/src/tests/test262/built-ins/Array/prototype/shift/S15.4.4.9_A5.1.js
js/src/tests/test262/built-ins/Array/prototype/shift/S15.4.4.9_A5.2.js
js/src/tests/test262/built-ins/Array/prototype/shift/S15.4.4.9_A5.3.js
js/src/tests/test262/built-ins/Array/prototype/shift/S15.4.4.9_A5.4.js
js/src/tests/test262/built-ins/Array/prototype/shift/S15.4.4.9_A5.5.js
js/src/tests/test262/built-ins/Array/prototype/shift/S15.4.4.9_A5.6.js
js/src/tests/test262/built-ins/Array/prototype/slice/S15.4.4.10_A5.1.js
js/src/tests/test262/built-ins/Array/prototype/slice/S15.4.4.10_A5.2.js
js/src/tests/test262/built-ins/Array/prototype/slice/S15.4.4.10_A5.3.js
js/src/tests/test262/built-ins/Array/prototype/slice/S15.4.4.10_A5.4.js
js/src/tests/test262/built-ins/Array/prototype/slice/S15.4.4.10_A5.5.js
js/src/tests/test262/built-ins/Array/prototype/slice/S15.4.4.10_A5.6.js
js/src/tests/test262/built-ins/Array/prototype/some/15.4.4.17-0-1.js
js/src/tests/test262/built-ins/Array/prototype/some/15.4.4.17-0-2.js
js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A7.1.js
js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A7.2.js
js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A7.3.js
js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A7.4.js
js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A7.5.js
js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A7.6.js
js/src/tests/test262/built-ins/Array/prototype/splice/S15.4.4.12_A5.1.js
js/src/tests/test262/built-ins/Array/prototype/splice/S15.4.4.12_A5.2.js
js/src/tests/test262/built-ins/Array/prototype/splice/S15.4.4.12_A5.3.js
js/src/tests/test262/built-ins/Array/prototype/splice/S15.4.4.12_A5.4.js
js/src/tests/test262/built-ins/Array/prototype/splice/S15.4.4.12_A5.5.js
js/src/tests/test262/built-ins/Array/prototype/splice/S15.4.4.12_A5.6.js
js/src/tests/test262/built-ins/Array/prototype/toLocaleString/S15.4.4.3_A4.1.js
js/src/tests/test262/built-ins/Array/prototype/toLocaleString/S15.4.4.3_A4.2.js
js/src/tests/test262/built-ins/Array/prototype/toLocaleString/S15.4.4.3_A4.3.js
js/src/tests/test262/built-ins/Array/prototype/toLocaleString/S15.4.4.3_A4.4.js
js/src/tests/test262/built-ins/Array/prototype/toLocaleString/S15.4.4.3_A4.5.js
js/src/tests/test262/built-ins/Array/prototype/toLocaleString/S15.4.4.3_A4.6.js
js/src/tests/test262/built-ins/Array/prototype/toString/S15.4.4.2_A4.5.js
js/src/tests/test262/built-ins/Array/prototype/toString/S15.4.4.2_A4.6.js
js/src/tests/test262/built-ins/Array/prototype/unshift/S15.4.4.13_A5.1.js
js/src/tests/test262/built-ins/Array/prototype/unshift/S15.4.4.13_A5.2.js
js/src/tests/test262/built-ins/Array/prototype/unshift/S15.4.4.13_A5.3.js
js/src/tests/test262/built-ins/Array/prototype/unshift/S15.4.4.13_A5.4.js
js/src/tests/test262/built-ins/Array/prototype/unshift/S15.4.4.13_A5.5.js
js/src/tests/test262/built-ins/Array/prototype/unshift/S15.4.4.13_A5.6.js
js/src/tests/test262/built-ins/AsyncFunction/instance-construct.js
js/src/tests/test262/built-ins/Function/prototype/toString/async-method.js
js/src/tests/test262/built-ins/Function/prototype/toString/getter-class-static.js
js/src/tests/test262/built-ins/Function/prototype/toString/getter-class.js
js/src/tests/test262/built-ins/Function/prototype/toString/method-class-static.js
js/src/tests/test262/built-ins/Function/prototype/toString/method-class.js
js/src/tests/test262/built-ins/Function/prototype/toString/setter-class-static.js
js/src/tests/test262/built-ins/Function/prototype/toString/setter-class.js
js/src/tests/test262/built-ins/Math/E/S15.8.1.1_A2.js
js/src/tests/test262/built-ins/Math/E/S15.8.1.1_A3.js
js/src/tests/test262/built-ins/Math/E/S15.8.1.1_A4.js
js/src/tests/test262/built-ins/Math/LN10/S15.8.1.2_A2.js
js/src/tests/test262/built-ins/Math/LN10/S15.8.1.2_A3.js
js/src/tests/test262/built-ins/Math/LN10/S15.8.1.2_A4.js
js/src/tests/test262/built-ins/Math/LN2/S15.8.1.3_A2.js
js/src/tests/test262/built-ins/Math/LN2/S15.8.1.3_A3.js
js/src/tests/test262/built-ins/Math/LN2/S15.8.1.3_A4.js
js/src/tests/test262/built-ins/Math/LOG10E/S15.8.1.5_A2.js
js/src/tests/test262/built-ins/Math/LOG10E/S15.8.1.5_A3.js
js/src/tests/test262/built-ins/Math/LOG10E/S15.8.1.5_A4.js
js/src/tests/test262/built-ins/Math/LOG2E/S15.8.1.4_A2.js
js/src/tests/test262/built-ins/Math/LOG2E/S15.8.1.4_A3.js
js/src/tests/test262/built-ins/Math/LOG2E/S15.8.1.4_A4.js
js/src/tests/test262/built-ins/Math/PI/S15.8.1.6_A2.js
js/src/tests/test262/built-ins/Math/PI/S15.8.1.6_A3.js
js/src/tests/test262/built-ins/Math/PI/S15.8.1.6_A4.js
js/src/tests/test262/built-ins/Math/SQRT1_2/S15.8.1.7_A2.js
js/src/tests/test262/built-ins/Math/SQRT1_2/S15.8.1.7_A3.js
js/src/tests/test262/built-ins/Math/SQRT1_2/S15.8.1.7_A4.js
js/src/tests/test262/built-ins/Math/SQRT2/S15.8.1.8_A2.js
js/src/tests/test262/built-ins/Math/SQRT2/S15.8.1.8_A3.js
js/src/tests/test262/built-ins/Math/SQRT2/S15.8.1.8_A4.js
js/src/tests/test262/built-ins/Math/acosh/acosh-descriptor.js
js/src/tests/test262/built-ins/Math/acosh/acosh-length.js
js/src/tests/test262/built-ins/Math/asinh/asinh-descriptor.js
js/src/tests/test262/built-ins/Math/asinh/asinh-length.js
js/src/tests/test262/built-ins/Math/atanh/atanh-descriptor.js
js/src/tests/test262/built-ins/Math/atanh/atanh-length.js
js/src/tests/test262/built-ins/Math/cbrt/cbrt-descriptor.js
js/src/tests/test262/built-ins/Math/cbrt/cbrt-length.js
js/src/tests/test262/built-ins/Math/cosh/cosh-descriptor.js
js/src/tests/test262/built-ins/Math/cosh/cosh-length.js
js/src/tests/test262/built-ins/Math/expm1/expm1-descriptor.js
js/src/tests/test262/built-ins/Math/expm1/expm1-length.js
js/src/tests/test262/built-ins/Math/hypot/Math.hypot_lengthProp.js
js/src/tests/test262/built-ins/Math/hypot/hypot-descriptor.js
js/src/tests/test262/built-ins/Math/imul/imul-descriptor.js
js/src/tests/test262/built-ins/Math/imul/imul-length.js
js/src/tests/test262/built-ins/Math/log10/Log10-descriptor.js
js/src/tests/test262/built-ins/Math/log10/Log10-length.js
js/src/tests/test262/built-ins/Math/log1p/Log1p-descriptor.js
js/src/tests/test262/built-ins/Math/log1p/Log1p-length.js
js/src/tests/test262/built-ins/Math/log2/log2-descriptor.js
js/src/tests/test262/built-ins/Math/log2/log2-length.js
js/src/tests/test262/built-ins/Math/pow/math.pow.js
js/src/tests/test262/built-ins/Math/sign/sign-descriptor.js
js/src/tests/test262/built-ins/Math/sign/sign-length.js
js/src/tests/test262/built-ins/Math/sinh/sinh-descriptor.js
js/src/tests/test262/built-ins/Math/sinh/sinh-length.js
js/src/tests/test262/built-ins/Math/tanh/tanh-descriptor.js
js/src/tests/test262/built-ins/Math/tanh/tanh-length.js
js/src/tests/test262/built-ins/Math/trunc/trunc-descriptor.js
js/src/tests/test262/built-ins/Math/trunc/trunc-length.js
js/src/tests/test262/built-ins/Object/prototype/toString/proxy.js
js/src/tests/test262/built-ins/RegExp/S15.10.4.1_A5_T2.js
js/src/tests/test262/built-ins/String/prototype/indexOf/S15.5.4.7_A1_T11.js
js/src/tests/test262/intl402/PluralRules/this-not-ignored.js
js/src/tests/test262/language/expressions/arrow-function/params-dflt-abrupt.js
js/src/tests/test262/language/expressions/arrow-function/params-dflt-arg-val-not-undefined.js
js/src/tests/test262/language/expressions/arrow-function/params-dflt-arg-val-undefined.js
js/src/tests/test262/language/expressions/arrow-function/params-dflt-duplicates.js
js/src/tests/test262/language/expressions/arrow-function/params-dflt-ref-later.js
js/src/tests/test262/language/expressions/arrow-function/params-dflt-ref-prior.js
js/src/tests/test262/language/expressions/arrow-function/params-dflt-ref-self.js
js/src/tests/test262/language/expressions/arrow-function/params-dflt-rest.js
js/src/tests/test262/language/expressions/arrow-function/params-trailing-comma-length.js
js/src/tests/test262/language/expressions/arrow-function/params-trailing-comma.js
js/src/tests/test262/language/expressions/assignment/dstr-array-elem-init-simple-strict-strict.js
js/src/tests/test262/language/expressions/async-generators/browser.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-NSPL-with-USD.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-arguments-in-formal-parameters-strict.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-await-as-function-binding-identifier.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-binding-identifier-arguments-strict.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-binding-identifier-eval-strict.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-body-contains-super-call.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-body-contains-super-property.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-eval-in-formal-parameters-strict.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-formals-body-duplicate-const.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-formals-body-duplicate-let.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-formals-contains-await-expr.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-formals-contains-await.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-formals-contains-super-call.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-formals-contains-super-property.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-formals-contains-yield-expr.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-formals-contains-yield.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-label-name-await.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-label-name-yield.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-not-simple-assignment-target.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-yield-as-function-binding-identifier.js
js/src/tests/test262/language/expressions/async-generators/early-errors-expression-yield-star-after-newline.js
js/src/tests/test262/language/expressions/async-generators/expression-await-as-yield-operand.js
js/src/tests/test262/language/expressions/async-generators/expression-await-promise-as-yield-operand.js
js/src/tests/test262/language/expressions/async-generators/expression-await-thenable-as-yield-operand.js
js/src/tests/test262/language/expressions/async-generators/expression-yield-as-operand.js
js/src/tests/test262/language/expressions/async-generators/expression-yield-as-statement.js
js/src/tests/test262/language/expressions/async-generators/expression-yield-newline.js
js/src/tests/test262/language/expressions/async-generators/expression-yield-star-before-newline.js
js/src/tests/test262/language/expressions/async-generators/return-suspendedStart-promise.js
js/src/tests/test262/language/expressions/async-generators/return-suspendedStart.js
js/src/tests/test262/language/expressions/async-generators/return-suspendedYield-promise.js
js/src/tests/test262/language/expressions/async-generators/return-suspendedYield-try-finally-return.js
js/src/tests/test262/language/expressions/async-generators/return-suspendedYield-try-finally-throw.js
js/src/tests/test262/language/expressions/async-generators/return-suspendedYield-try-finally.js
js/src/tests/test262/language/expressions/async-generators/return-suspendedYield.js
js/src/tests/test262/language/expressions/async-generators/shell.js
js/src/tests/test262/language/expressions/async-generators/throw-suspendedStart-promise.js
js/src/tests/test262/language/expressions/async-generators/throw-suspendedStart.js
js/src/tests/test262/language/expressions/async-generators/throw-suspendedYield-promise.js
js/src/tests/test262/language/expressions/async-generators/throw-suspendedYield-try-catch.js
js/src/tests/test262/language/expressions/async-generators/throw-suspendedYield-try-finally-return.js
js/src/tests/test262/language/expressions/async-generators/throw-suspendedYield-try-finally-throw.js
js/src/tests/test262/language/expressions/async-generators/throw-suspendedYield-try-finally.js
js/src/tests/test262/language/expressions/async-generators/throw-suspendedYield.js
js/src/tests/test262/language/expressions/class/params-dflt-gen-meth-abrupt.js
js/src/tests/test262/language/expressions/class/params-dflt-gen-meth-arg-val-not-undefined.js
js/src/tests/test262/language/expressions/class/params-dflt-gen-meth-arg-val-undefined.js
js/src/tests/test262/language/expressions/class/params-dflt-gen-meth-duplicates.js
js/src/tests/test262/language/expressions/class/params-dflt-gen-meth-ref-later.js
js/src/tests/test262/language/expressions/class/params-dflt-gen-meth-ref-prior.js
js/src/tests/test262/language/expressions/class/params-dflt-gen-meth-ref-self.js
js/src/tests/test262/language/expressions/class/params-dflt-gen-meth-rest.js
js/src/tests/test262/language/expressions/class/params-dflt-gen-meth-static-abrupt.js
js/src/tests/test262/language/expressions/class/params-dflt-gen-meth-static-arg-val-not-undefined.js
js/src/tests/test262/language/expressions/class/params-dflt-gen-meth-static-arg-val-undefined.js
js/src/tests/test262/language/expressions/class/params-dflt-gen-meth-static-duplicates.js
js/src/tests/test262/language/expressions/class/params-dflt-gen-meth-static-ref-later.js
js/src/tests/test262/language/expressions/class/params-dflt-gen-meth-static-ref-prior.js
js/src/tests/test262/language/expressions/class/params-dflt-gen-meth-static-ref-self.js
js/src/tests/test262/language/expressions/class/params-dflt-gen-meth-static-rest.js
js/src/tests/test262/language/expressions/class/params-dflt-meth-abrupt.js
js/src/tests/test262/language/expressions/class/params-dflt-meth-arg-val-not-undefined.js
js/src/tests/test262/language/expressions/class/params-dflt-meth-arg-val-undefined.js
js/src/tests/test262/language/expressions/class/params-dflt-meth-duplicates.js
js/src/tests/test262/language/expressions/class/params-dflt-meth-ref-later.js
js/src/tests/test262/language/expressions/class/params-dflt-meth-ref-prior.js
js/src/tests/test262/language/expressions/class/params-dflt-meth-ref-self.js
js/src/tests/test262/language/expressions/class/params-dflt-meth-rest.js
js/src/tests/test262/language/expressions/class/params-dflt-meth-static-abrupt.js
js/src/tests/test262/language/expressions/class/params-dflt-meth-static-arg-val-not-undefined.js
js/src/tests/test262/language/expressions/class/params-dflt-meth-static-arg-val-undefined.js
js/src/tests/test262/language/expressions/class/params-dflt-meth-static-duplicates.js
js/src/tests/test262/language/expressions/class/params-dflt-meth-static-ref-later.js
js/src/tests/test262/language/expressions/class/params-dflt-meth-static-ref-prior.js
js/src/tests/test262/language/expressions/class/params-dflt-meth-static-ref-self.js
js/src/tests/test262/language/expressions/class/params-dflt-meth-static-rest.js
js/src/tests/test262/language/expressions/function/params-dflt-abrupt.js
js/src/tests/test262/language/expressions/function/params-dflt-arg-val-not-undefined.js
js/src/tests/test262/language/expressions/function/params-dflt-arg-val-undefined.js
js/src/tests/test262/language/expressions/function/params-dflt-duplicates.js
js/src/tests/test262/language/expressions/function/params-dflt-ref-later.js
js/src/tests/test262/language/expressions/function/params-dflt-ref-prior.js
js/src/tests/test262/language/expressions/function/params-dflt-ref-self.js
js/src/tests/test262/language/expressions/function/params-dflt-rest.js
js/src/tests/test262/language/expressions/function/params-trailing-comma-arguments.js
js/src/tests/test262/language/expressions/function/params-trailing-comma-length.js
js/src/tests/test262/language/expressions/function/params-trailing-comma.js
js/src/tests/test262/language/expressions/generators/params-dflt-abrupt.js
js/src/tests/test262/language/expressions/generators/params-dflt-arg-val-not-undefined.js
js/src/tests/test262/language/expressions/generators/params-dflt-arg-val-undefined.js
js/src/tests/test262/language/expressions/generators/params-dflt-duplicates.js
js/src/tests/test262/language/expressions/generators/params-dflt-ref-later.js
js/src/tests/test262/language/expressions/generators/params-dflt-ref-prior.js
js/src/tests/test262/language/expressions/generators/params-dflt-ref-self.js
js/src/tests/test262/language/expressions/generators/params-dflt-rest.js
js/src/tests/test262/language/expressions/generators/params-trailing-comma-arguments.js
js/src/tests/test262/language/expressions/generators/params-trailing-comma-length.js
js/src/tests/test262/language/expressions/generators/params-trailing-comma.js
js/src/tests/test262/language/expressions/object/method-definition/generator-yield-identifier-non-strict.js
js/src/tests/test262/language/expressions/object/method-definition/generator-yield-identifier-spread-non-strict.js
js/src/tests/test262/language/expressions/object/method-definition/generator-yield-identifier-spread-strict-strict.js
js/src/tests/test262/language/expressions/object/method-definition/generator-yield-identifier-strict-strict.js
js/src/tests/test262/language/expressions/object/method-definition/generator-yield-spread-arr-multiple.js
js/src/tests/test262/language/expressions/object/method-definition/generator-yield-spread-arr-single.js
js/src/tests/test262/language/expressions/object/method-definition/generator-yield-spread-obj.js
js/src/tests/test262/language/expressions/object/method-definition/params-dflt-gen-meth-abrupt.js
js/src/tests/test262/language/expressions/object/method-definition/params-dflt-gen-meth-arg-val-not-undefined.js
js/src/tests/test262/language/expressions/object/method-definition/params-dflt-gen-meth-arg-val-undefined.js
js/src/tests/test262/language/expressions/object/method-definition/params-dflt-gen-meth-duplicates.js
js/src/tests/test262/language/expressions/object/method-definition/params-dflt-gen-meth-ref-later.js
js/src/tests/test262/language/expressions/object/method-definition/params-dflt-gen-meth-ref-prior.js
js/src/tests/test262/language/expressions/object/method-definition/params-dflt-gen-meth-ref-self.js
js/src/tests/test262/language/expressions/object/method-definition/params-dflt-gen-meth-rest.js
js/src/tests/test262/language/expressions/object/method-definition/params-dflt-meth-abrupt.js
js/src/tests/test262/language/expressions/object/method-definition/params-dflt-meth-arg-val-not-undefined.js
js/src/tests/test262/language/expressions/object/method-definition/params-dflt-meth-arg-val-undefined.js
js/src/tests/test262/language/expressions/object/method-definition/params-dflt-meth-duplicates.js
js/src/tests/test262/language/expressions/object/method-definition/params-dflt-meth-ref-later.js
js/src/tests/test262/language/expressions/object/method-definition/params-dflt-meth-ref-prior.js
js/src/tests/test262/language/expressions/object/method-definition/params-dflt-meth-ref-self.js
js/src/tests/test262/language/expressions/object/method-definition/params-dflt-meth-rest.js
js/src/tests/test262/language/expressions/object/method-definition/params-trailing-comma-arguments.js
js/src/tests/test262/language/expressions/object/method-definition/params-trailing-comma-length.js
js/src/tests/test262/language/expressions/object/method-definition/params-trailing-comma-rest.js
js/src/tests/test262/language/expressions/object/method-definition/params-trailing-comma.js
js/src/tests/test262/language/rest-parameters/params-trailing-comma-rest.js
js/src/tests/test262/language/statements/class/definition/params-trailing-comma-arguments.js
js/src/tests/test262/language/statements/class/definition/params-trailing-comma-length.js
js/src/tests/test262/language/statements/class/definition/params-trailing-comma-rest.js
js/src/tests/test262/language/statements/class/definition/params-trailing-comma.js
js/src/tests/test262/language/statements/class/params-dflt-gen-meth-abrupt.js
js/src/tests/test262/language/statements/class/params-dflt-gen-meth-arg-val-not-undefined.js
js/src/tests/test262/language/statements/class/params-dflt-gen-meth-arg-val-undefined.js
js/src/tests/test262/language/statements/class/params-dflt-gen-meth-duplicates.js
js/src/tests/test262/language/statements/class/params-dflt-gen-meth-ref-later.js
js/src/tests/test262/language/statements/class/params-dflt-gen-meth-ref-prior.js
js/src/tests/test262/language/statements/class/params-dflt-gen-meth-ref-self.js
js/src/tests/test262/language/statements/class/params-dflt-gen-meth-rest.js
js/src/tests/test262/language/statements/class/params-dflt-gen-meth-static-abrupt.js
js/src/tests/test262/language/statements/class/params-dflt-gen-meth-static-arg-val-not-undefined.js
js/src/tests/test262/language/statements/class/params-dflt-gen-meth-static-arg-val-undefined.js
js/src/tests/test262/language/statements/class/params-dflt-gen-meth-static-duplicates.js
js/src/tests/test262/language/statements/class/params-dflt-gen-meth-static-ref-later.js
js/src/tests/test262/language/statements/class/params-dflt-gen-meth-static-ref-prior.js
js/src/tests/test262/language/statements/class/params-dflt-gen-meth-static-ref-self.js
js/src/tests/test262/language/statements/class/params-dflt-gen-meth-static-rest.js
js/src/tests/test262/language/statements/class/params-dflt-meth-abrupt.js
js/src/tests/test262/language/statements/class/params-dflt-meth-arg-val-not-undefined.js
js/src/tests/test262/language/statements/class/params-dflt-meth-arg-val-undefined.js
js/src/tests/test262/language/statements/class/params-dflt-meth-duplicates.js
js/src/tests/test262/language/statements/class/params-dflt-meth-ref-later.js
js/src/tests/test262/language/statements/class/params-dflt-meth-ref-prior.js
js/src/tests/test262/language/statements/class/params-dflt-meth-ref-self.js
js/src/tests/test262/language/statements/class/params-dflt-meth-rest.js
js/src/tests/test262/language/statements/class/params-dflt-meth-static-abrupt.js
js/src/tests/test262/language/statements/class/params-dflt-meth-static-arg-val-not-undefined.js
js/src/tests/test262/language/statements/class/params-dflt-meth-static-arg-val-undefined.js
js/src/tests/test262/language/statements/class/params-dflt-meth-static-duplicates.js
js/src/tests/test262/language/statements/class/params-dflt-meth-static-ref-later.js
js/src/tests/test262/language/statements/class/params-dflt-meth-static-ref-prior.js
js/src/tests/test262/language/statements/class/params-dflt-meth-static-ref-self.js
js/src/tests/test262/language/statements/class/params-dflt-meth-static-rest.js
js/src/tests/test262/language/statements/for-in/dstr-array-elem-init-simple-strict-strict.js
js/src/tests/test262/language/statements/for-of/dstr-array-elem-init-simple-strict-strict.js
js/src/tests/test262/language/statements/function/params-dflt-abrupt.js
js/src/tests/test262/language/statements/function/params-dflt-arg-val-not-undefined.js
js/src/tests/test262/language/statements/function/params-dflt-arg-val-undefined.js
js/src/tests/test262/language/statements/function/params-dflt-duplicates.js
js/src/tests/test262/language/statements/function/params-dflt-ref-later.js
js/src/tests/test262/language/statements/function/params-dflt-ref-prior.js
js/src/tests/test262/language/statements/function/params-dflt-ref-self.js
js/src/tests/test262/language/statements/function/params-dflt-rest.js
js/src/tests/test262/language/statements/function/params-trailing-comma-arguments.js
js/src/tests/test262/language/statements/function/params-trailing-comma-length.js
js/src/tests/test262/language/statements/function/params-trailing-comma.js
js/src/tests/test262/language/statements/generators/params-dflt-abrupt.js
js/src/tests/test262/language/statements/generators/params-dflt-arg-val-not-undefined.js
js/src/tests/test262/language/statements/generators/params-dflt-arg-val-undefined.js
js/src/tests/test262/language/statements/generators/params-dflt-duplicates.js
js/src/tests/test262/language/statements/generators/params-dflt-ref-later.js
js/src/tests/test262/language/statements/generators/params-dflt-ref-prior.js
js/src/tests/test262/language/statements/generators/params-dflt-ref-self.js
js/src/tests/test262/language/statements/generators/params-dflt-rest.js
js/src/tests/test262/language/statements/generators/params-trailing-comma-length.js
js/src/tests/test262/language/statements/generators/params-trailing-comma.js
js/src/tests/test262/local/async-generator-tostring/AsyncGenerator.js
js/src/tests/test262/local/async-generator-tostring/async-generator-declaration.js
js/src/tests/test262/local/async-generator-tostring/async-generator-expression.js
js/src/tests/test262/local/async-generator-tostring/async-generator-method.js
js/src/tests/test262/local/async-generator-tostring/browser.js
js/src/tests/test262/local/async-generator-tostring/shell.js
js/src/tests/test262/local/early-errors-arrow-formals-lineterminator.js
js/src/tests/test262/local/early-errors-arrow-ident-lineterminator.js
js/src/tests/test262/local/early-errors-object-method-async-lineterminator.js
layout/style/nsStyleStruct.cpp
toolkit/components/places/tests/unit/test_PlacesUtils_asyncGetBookmarkIds.js
toolkit/mozapps/extensions/internal/XPIProvider.jsm
toolkit/mozapps/extensions/test/addons/test_bug594058/install.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_migrate.rdf
toolkit/mozapps/extensions/test/xpcshell/data/test_migrate4.rdf
toolkit/mozapps/extensions/test/xpcshell/test_bug594058.js
toolkit/mozapps/extensions/test/xpcshell/test_migrate1.js
toolkit/mozapps/extensions/test/xpcshell/test_migrate2.js
toolkit/mozapps/extensions/test/xpcshell/test_migrate3.js
toolkit/mozapps/extensions/test/xpcshell/test_migrate4.js
toolkit/mozapps/extensions/test/xpcshell/test_migrate5.js
toolkit/mozapps/extensions/test/xpcshell/test_migrateAddonRepository.js
toolkit/mozapps/extensions/test/xpcshell/test_migrate_max_version.js
--- a/accessible/windows/msaa/AccessibleWrap.cpp
+++ b/accessible/windows/msaa/AccessibleWrap.cpp
@@ -10,16 +10,17 @@
 #include "Compatibility.h"
 #include "DocAccessible-inl.h"
 #include "mozilla/a11y/DocAccessibleParent.h"
 #include "EnumVariant.h"
 #include "GeckoCustom.h"
 #include "nsAccUtils.h"
 #include "nsCoreUtils.h"
 #include "nsIAccessibleEvent.h"
+#include "nsWindowsHelpers.h"
 #include "nsWinUtils.h"
 #include "mozilla/a11y/ProxyAccessible.h"
 #include "ProxyWrappers.h"
 #include "ServiceProvider.h"
 #include "Relation.h"
 #include "Role.h"
 #include "RootAccessible.h"
 #include "sdnAccessible.h"
@@ -1560,23 +1561,22 @@ AccessibleWrap::UpdateSystemCaretFor(Acc
   LayoutDeviceIntRect caretRect = text->GetCaretRect(&widget);
   HWND caretWnd;
   if (caretRect.IsEmpty() || !(caretWnd = (HWND)widget->GetNativeData(NS_NATIVE_WINDOW))) {
     return;
   }
 
   // Create invisible bitmap for caret, otherwise its appearance interferes
   // with Gecko caret
-  HBITMAP caretBitMap = CreateBitmap(1, caretRect.height, 1, 1, nullptr);
+  nsAutoBitmap caretBitMap(CreateBitmap(1, caretRect.height, 1, 1, nullptr));
   if (::CreateCaret(caretWnd, caretBitMap, 1, caretRect.height)) {  // Also destroys the last caret
     ::ShowCaret(caretWnd);
     RECT windowRect;
     ::GetWindowRect(caretWnd, &windowRect);
     ::SetCaretPos(caretRect.x - windowRect.left, caretRect.y - windowRect.top);
-    ::DeleteObject(caretBitMap);
   }
 }
 
 ITypeInfo*
 AccessibleWrap::GetTI(LCID lcid)
 {
   if (gTypeInfo)
     return gTypeInfo;
--- a/browser/app/nsBrowserApp.cpp
+++ b/browser/app/nsBrowserApp.cpp
@@ -256,24 +256,23 @@ InitXPCOMGlue(const char *argv0)
 
   return NS_OK;
 }
 
 int main(int argc, char* argv[], char* envp[])
 {
   mozilla::TimeStamp start = mozilla::TimeStamp::Now();
 
-#ifdef HAS_DLL_BLOCKLIST
-  DllBlocklist_Initialize();
-#endif
-
 #ifdef MOZ_BROWSER_CAN_BE_CONTENTPROC
   // We are launching as a content process, delegate to the appropriate
   // main
   if (argc > 1 && IsArg(argv[1], "contentproc")) {
+#ifdef HAS_DLL_BLOCKLIST
+    DllBlocklist_Initialize(eDllBlocklistInitFlagIsChildProcess);
+#endif
 #if defined(XP_WIN) && defined(MOZ_SANDBOX)
     // We need to initialize the sandbox TargetServices before InitXPCOMGlue
     // because we might need the sandbox broker to give access to some files.
     if (IsSandboxedProcess() && !sandboxing::GetInitializedTargetServices()) {
       Output("Failed to initialize the sandbox target services.");
       return 255;
     }
 #endif
@@ -287,16 +286,19 @@ int main(int argc, char* argv[], char* e
 
     // InitXPCOMGlue calls NS_LogInit, so we need to balance it here.
     gBootstrap->NS_LogTerm();
 
     return result;
   }
 #endif
 
+#ifdef HAS_DLL_BLOCKLIST
+  DllBlocklist_Initialize();
+#endif
 
   nsresult rv = InitXPCOMGlue(argv[0]);
   if (NS_FAILED(rv)) {
     return 255;
   }
 
   gBootstrap->XRE_StartupTimelineRecord(mozilla::StartupTimeline::START, start);
 
--- a/browser/base/content/browser-places.js
+++ b/browser/base/content/browser-places.js
@@ -1282,17 +1282,17 @@ var BookmarkingUI = {
 
   STATUS_UPDATING: -1,
   STATUS_UNSTARRED: 0,
   STATUS_STARRED: 1,
   get status() {
     if (!this._shouldUpdateStarState()) {
       return this.STATUS_UNSTARRED;
     }
-    if (this._pendingStmt)
+    if (this._pendingUpdate)
       return this.STATUS_UPDATING;
     return this.button.hasAttribute("starred") ? this.STATUS_STARRED
                                                : this.STATUS_UNSTARRED;
   },
 
   get _starredTooltip() {
     delete this._starredTooltip;
     return this._starredTooltip =
@@ -1637,90 +1637,88 @@ var BookmarkingUI = {
   },
 
   init() {
     CustomizableUI.addListener(this);
     this._updateCustomizationState();
   },
 
   _hasBookmarksObserver: false,
-  _itemIds: [],
+  _itemGuids: [],
   uninit: function BUI_uninit() {
     this._updateBookmarkPageMenuItem(true);
     CustomizableUI.removeListener(this);
 
     this._uninitView();
 
     if (this._hasBookmarksObserver) {
       PlacesUtils.removeLazyBookmarkObserver(this);
     }
 
-    if (this._pendingStmt) {
-      this._pendingStmt.cancel();
-      delete this._pendingStmt;
+    if (this._pendingUpdate) {
+      delete this._pendingUpdate;
     }
   },
 
   onLocationChange: function BUI_onLocationChange() {
     if (this._uri && gBrowser.currentURI.equals(this._uri)) {
       return;
     }
     this.updateStarState();
   },
 
   updateStarState: function BUI_updateStarState() {
-    // Reset tracked values.
     this._uri = gBrowser.currentURI;
-    this._itemIds = [];
+    this._itemGuids = [];
+    let aItemGuids = [];
 
-    if (this._pendingStmt) {
-      this._pendingStmt.cancel();
-      delete this._pendingStmt;
-    }
+    // those objects are use to check if we are in the current iteration before
+    // returning any result.
+    let pendingUpdate = this._pendingUpdate = {};
 
-    this._pendingStmt = PlacesUtils.asyncGetBookmarkIds(this._uri, (aItemIds, aURI) => {
-      // Safety check that the bookmarked URI equals the tracked one.
-      if (!aURI.equals(this._uri)) {
-        Components.utils.reportError("BookmarkingUI did not receive current URI");
-        return;
-      }
+    PlacesUtils.bookmarks.fetch({url: this._uri}, b => aItemGuids.push(b.guid))
+      .catch(Components.utils.reportError)
+      .then(() => {
+         if (pendingUpdate != this._pendingUpdate) {
+           return;
+         }
 
-      // It's possible that onItemAdded gets called before the async statement
-      // calls back.  For such an edge case, retain all unique entries from both
-      // arrays.
-      this._itemIds = this._itemIds.filter(
-        id => !aItemIds.includes(id)
-      ).concat(aItemIds);
+         // It's possible that onItemAdded gets called before the async statement
+         // calls back.  For such an edge case, retain all unique entries from the
+         // array.
+         this._itemGuids = this._itemGuids.filter(
+           guid => !aItemGuids.includes(guid)
+         ).concat(aItemGuids);
 
-      this._updateStar();
+         this._updateStar();
 
-      // Start observing bookmarks if needed.
-      if (!this._hasBookmarksObserver) {
-        try {
-          PlacesUtils.addLazyBookmarkObserver(this);
-          this._hasBookmarksObserver = true;
-        } catch (ex) {
-          Components.utils.reportError("BookmarkingUI failed adding a bookmarks observer: " + ex);
-        }
-      }
+         // Start observing bookmarks if needed.
+         if (!this._hasBookmarksObserver) {
+           try {
+             PlacesUtils.addLazyBookmarkObserver(this);
+             this._hasBookmarksObserver = true;
+           } catch (ex) {
+             Components.utils.reportError("BookmarkingUI failed adding a bookmarks observer: " + ex);
+           }
+         }
 
-      delete this._pendingStmt;
-    });
+         delete this._pendingUpdate;
+       });
   },
 
   _updateStar: function BUI__updateStar() {
     if (!this._shouldUpdateStarState()) {
       if (this.broadcaster.hasAttribute("starred")) {
         this.broadcaster.removeAttribute("starred");
         this.broadcaster.removeAttribute("buttontooltiptext");
       }
       return;
     }
 
-    if (this._itemIds.length > 0) {
+    if (this._itemGuids.length > 0) {
       this.broadcaster.setAttribute("starred", "true");
       this.broadcaster.setAttribute("buttontooltiptext", this._starredTooltip);
       if (this.button.getAttribute("overflowedItem") == "true") {
         this.button.setAttribute("label", this._starButtonOverflowedStarredLabel);
       }
     } else {
       this.broadcaster.removeAttribute("starred");
       this.broadcaster.setAttribute("buttontooltiptext", this._unstarredTooltip);
@@ -1730,17 +1728,17 @@ var BookmarkingUI = {
     }
   },
 
   /**
    * forceReset is passed when we're destroyed and the label should go back
    * to the default (Bookmark This Page) for OS X.
    */
   _updateBookmarkPageMenuItem: function BUI__updateBookmarkPageMenuItem(forceReset) {
-    let isStarred = !forceReset && this._itemIds.length > 0;
+    let isStarred = !forceReset && this._itemGuids.length > 0;
     let label = isStarred ? "editlabel" : "bookmarklabel";
     if (this.broadcaster) {
       this.broadcaster.setAttribute("label", this.broadcaster.getAttribute(label));
     }
   },
 
   onMainMenuPopupShowing: function BUI_onMainMenuPopupShowing(event) {
     // Don't handle events for submenus.
@@ -1827,31 +1825,31 @@ var BookmarkingUI = {
   },
 
   onCommand: function BUI_onCommand(aEvent) {
     if (aEvent.target != aEvent.currentTarget) {
       return;
     }
 
     // Handle special case when the button is in the panel.
-    let isBookmarked = this._itemIds.length > 0;
+    let isBookmarked = this._itemGuids.length > 0;
 
     if (this._currentAreaType == CustomizableUI.TYPE_MENU_PANEL) {
       this._showSubview();
       return;
     }
     let widget = CustomizableUI.getWidget(this.BOOKMARK_BUTTON_ID)
                                .forWindow(window);
     if (widget.overflowed) {
       // Close the overflow panel because the Edit Bookmark panel will appear.
       widget.node.removeAttribute("closemenu");
     }
 
     // Ignore clicks on the star if we are updating its state.
-    if (!this._pendingStmt) {
+    if (!this._pendingUpdate) {
       if (!isBookmarked)
         this._showBookmarkedNotification();
       PlacesCommandHook.bookmarkCurrentPage(true);
     }
   },
 
   onCurrentPageContextPopupShowing() {
     this._updateBookmarkPageMenuItem();
@@ -1906,59 +1904,58 @@ var BookmarkingUI = {
     if (PlacesUtils.nodeIsContainer(target._placesNode))
       PlacesCommandHook.showPlacesOrganizer([ "BookmarksMenu", target._placesNode.itemId ]);
     else
       PlacesUIUtils.openNodeWithEvent(target._placesNode, aEvent, aView);
     PanelUI.hide();
   },
 
   // nsINavBookmarkObserver
-  onItemAdded: function BUI_onItemAdded(aItemId, aParentId, aIndex, aItemType,
-                                        aURI) {
+  onItemAdded(aItemId, aParentId, aIndex, aItemType, aURI, aTitle, aDateAdded, aGuid) {
     if (aURI && aURI.equals(this._uri)) {
       // If a new bookmark has been added to the tracked uri, register it.
-      if (!this._itemIds.includes(aItemId)) {
-        this._itemIds.push(aItemId);
+      if (!this._itemGuids.includes(aGuid)) {
+        this._itemGuids.push(aGuid);
         // Only need to update the UI if it wasn't marked as starred before:
-        if (this._itemIds.length == 1) {
+        if (this._itemGuids.length == 1) {
           this._updateStar();
         }
       }
     }
   },
 
-  onItemRemoved: function BUI_onItemRemoved(aItemId) {
-    let index = this._itemIds.indexOf(aItemId);
+  onItemRemoved(aItemId, aParentId, aIndex, aItemType, aURI, aGuid) {
+    let index = this._itemGuids.indexOf(aGuid);
     // If one of the tracked bookmarks has been removed, unregister it.
     if (index != -1) {
-      this._itemIds.splice(index, 1);
+      this._itemGuids.splice(index, 1);
       // Only need to update the UI if the page is no longer starred
-      if (this._itemIds.length == 0) {
+      if (this._itemGuids.length == 0) {
         this._updateStar();
       }
     }
   },
 
-  onItemChanged: function BUI_onItemChanged(aItemId, aProperty,
-                                            aIsAnnotationProperty, aNewValue) {
+  onItemChanged(aItemId, aProperty, aIsAnnotationProperty, aNewValue, aLastModified,
+                aItemType, aParentId, aGuid) {
     if (aProperty == "uri") {
-      let index = this._itemIds.indexOf(aItemId);
+      let index = this._itemGuids.indexOf(aGuid);
       // If the changed bookmark was tracked, check if it is now pointing to
       // a different uri and unregister it.
       if (index != -1 && aNewValue != this._uri.spec) {
-        this._itemIds.splice(index, 1);
+        this._itemGuids.splice(index, 1);
         // Only need to update the UI if the page is no longer starred
-        if (this._itemIds.length == 0) {
+        if (this._itemGuids.length == 0) {
           this._updateStar();
         }
       } else if (index == -1 && aNewValue == this._uri.spec) {
         // If another bookmark is now pointing to the tracked uri, register it.
-        this._itemIds.push(aItemId);
+        this._itemGuids.push(aGuid);
         // Only need to update the UI if it wasn't marked as starred before:
-        if (this._itemIds.length == 1) {
+        if (this._itemGuids.length == 1) {
           this._updateStar();
         }
       }
     }
   },
 
   onBeginUpdateBatch() {},
   onEndUpdateBatch() {},
@@ -1983,18 +1980,18 @@ var BookmarkingUI = {
     if (aNode.id != this.BOOKMARK_BUTTON_ID || win != window)
       return;
 
     let currentLabel = aNode.getAttribute("label");
     if (!this._starButtonLabel)
       this._starButtonLabel = currentLabel;
 
     if (currentLabel == this._starButtonLabel) {
-      let desiredLabel = this._itemIds.length > 0 ? this._starButtonOverflowedStarredLabel
-                                                 : this._starButtonOverflowedLabel;
+      let desiredLabel = this._itemGuids.length > 0 ? this._starButtonOverflowedStarredLabel
+                                                    : this._starButtonOverflowedLabel;
       aNode.setAttribute("label", desiredLabel);
     }
   },
 
   onWidgetUnderflow(aNode, aContainer) {
     let win = aNode.ownerGlobal;
     if (aNode.id != this.BOOKMARK_BUTTON_ID || win != window)
       return;
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -2144,18 +2144,18 @@
       </method>
 
       <method name="_insertBrowser">
         <parameter name="aTab"/>
         <body>
           <![CDATA[
             "use strict";
 
-            // If browser is already inserted don't do anything.
-            if (aTab.linkedPanel) {
+            // If browser is already inserted or window is closed don't do anything.
+            if (aTab.linkedPanel || window.closed) {
               return;
             }
 
             let browser = aTab.linkedBrowser;
 
             // If browser is a lazy browser, delete the substitute properties.
             if (this._browserBindingProperties[0] in browser) {
               for (let name of this._browserBindingProperties) {
@@ -2274,19 +2274,27 @@
             }
 
             // if we're adding tabs, we're past interrupt mode, ditch the owner
             if (this.mCurrentTab.owner)
               this.mCurrentTab.owner = null;
 
             var t = document.createElementNS(NS_XUL, "tab");
 
-            var uriIsAboutBlank = !aURI || aURI == "about:blank";
-
-            if (!aURI || isBlankPageURL(aURI)) {
+            aURI = aURI || "about:blank";
+
+            let lazyBrowserURI;
+            if (aCreateLazyBrowser && aURI != "about:blank") {
+              lazyBrowserURI = Services.io.newURI(aURI);
+              aURI = "about:blank";
+            }
+
+            var uriIsAboutBlank = aURI == "about:blank";
+
+            if (isBlankPageURL(aURI)) {
               t.setAttribute("label", this.mStringBundle.getString("tabs.emptyTabTitle"));
             } else if (aURI.toLowerCase().startsWith("javascript:")) {
               // This can go away when bug 672618 or bug 55696 are fixed.
               t.setAttribute("label", aURI);
             }
 
             if (aIsPrerendered) {
               t.setAttribute("hidden", "true");
@@ -2388,16 +2396,23 @@
             t.permanentKey = b.permanentKey;
             t._browserParams = { uriIsAboutBlank,
                                  remoteType,
                                  usingPreloadedContent };
 
             // If the caller opts in, create a lazy browser.
             if (aCreateLazyBrowser) {
               this._createLazyBrowser(t);
+
+              if (lazyBrowserURI) {
+                // Lazy browser must be explicitly registered so tab will appear as
+                // a switch-to-tab candidate in autocomplete.
+                this._unifiedComplete.registerOpenPage(lazyBrowserURI, aUserContextId);
+                b.registeredOpenURI = lazyBrowserURI;
+              }
             } else {
               this._insertBrowser(t);
             }
 
             // Dispatch a new tab notification.  We do this once we're
             // entirely done, so that things are in a consistent state
             // even if the event listener opens or closes tabs.
             var detail = aEventDetail || {};
--- a/browser/base/content/test/permissions/browser_permissions.js
+++ b/browser/base/content/test/permissions/browser_permissions.js
@@ -1,21 +1,14 @@
 /*
  * Test the Permissions section in the Control Center.
  */
 
 const PERMISSIONS_PAGE  = getRootDirectory(gTestPath).replace("chrome://mochitests/content", "https://example.com") + "permissions.html";
 
-registerCleanupFunction(function() {
-  SitePermissions.remove(gBrowser.currentURI, "cookie");
-  SitePermissions.remove(gBrowser.currentURI, "geo");
-  SitePermissions.remove(gBrowser.currentURI, "camera");
-  SitePermissions.remove(gBrowser.currentURI, "microphone");
-});
-
 function* openIdentityPopup() {
   let promise = BrowserTestUtils.waitForEvent(gIdentityHandler._identityPopup, "popupshown");
   gIdentityHandler._identityBox.click();
   return promise;
 }
 
 function* closeIdentityPopup() {
   let promise = BrowserTestUtils.waitForEvent(gIdentityHandler._identityPopup, "popuphidden");
@@ -174,10 +167,12 @@ add_task(function* testPermissionIcons()
       .querySelector(".blocked-permission-icon[data-permission-id='camera']");
     ok(!cameraIcon.hasAttribute("showing"),
       "allowed permission icon is not shown");
 
     SitePermissions.remove(gBrowser.currentURI, "geo");
 
     ok(!geoIcon.hasAttribute("showing"),
       "blocked permission icon is not shown after reset");
+
+    SitePermissions.remove(gBrowser.currentURI, "camera");
   });
 });
--- a/browser/base/content/test/permissions/browser_temporary_permissions_expiry.js
+++ b/browser/base/content/test/permissions/browser_temporary_permissions_expiry.js
@@ -6,57 +6,58 @@
 const ORIGIN = "https://example.com";
 const PERMISSIONS_PAGE = getRootDirectory(gTestPath).replace("chrome://mochitests/content", ORIGIN) + "permissions.html";
 
 const EXPIRE_TIME_MS = 100;
 const TIMEOUT_MS = 500;
 
 // Test that temporary permissions can be re-requested after they expired
 // and that the identity block is updated accordingly.
-// TODO (bug 1349144): Write a check for webrtc permissions,
-// because they use a different code path.
 add_task(function* testTempPermissionRequestAfterExpiry() {
   yield SpecialPowers.pushPrefEnv({set: [
         ["privacy.temporary_permission_expire_time_ms", EXPIRE_TIME_MS],
+        ["media.navigator.permission.fake", true],
   ]});
 
   let uri = NetUtil.newURI(ORIGIN);
-  let id = "geo";
+  let ids = ["geo", "camera"];
+
+  for (let id of ids) {
+    yield BrowserTestUtils.withNewTab(PERMISSIONS_PAGE, function*(browser) {
+      let blockedIcon = gIdentityHandler._identityBox
+        .querySelector(`.blocked-permission-icon[data-permission-id='${id}']`);
+
+      SitePermissions.set(uri, id, SitePermissions.BLOCK, SitePermissions.SCOPE_TEMPORARY, browser);
 
-  yield BrowserTestUtils.withNewTab(PERMISSIONS_PAGE, function*(browser) {
-    let blockedIcon = gIdentityHandler._identityBox
-      .querySelector(`.blocked-permission-icon[data-permission-id='${id}']`);
+      Assert.deepEqual(SitePermissions.get(uri, id, browser), {
+        state: SitePermissions.BLOCK,
+        scope: SitePermissions.SCOPE_TEMPORARY,
+      });
 
-    SitePermissions.set(uri, id, SitePermissions.BLOCK, SitePermissions.SCOPE_TEMPORARY, browser);
+      ok(blockedIcon.hasAttribute("showing"), "blocked permission icon is shown");
+
+      yield new Promise((c) => setTimeout(c, TIMEOUT_MS));
 
-    Assert.deepEqual(SitePermissions.get(uri, id, browser), {
-      state: SitePermissions.BLOCK,
-      scope: SitePermissions.SCOPE_TEMPORARY,
-    });
+      Assert.deepEqual(SitePermissions.get(uri, id, browser), {
+        state: SitePermissions.UNKNOWN,
+        scope: SitePermissions.SCOPE_PERSISTENT,
+      });
+
+      let popupshown = BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popupshown");
+
+      // Request a permission;
+      yield BrowserTestUtils.synthesizeMouseAtCenter(`#${id}`, {}, browser);
 
-    ok(blockedIcon.hasAttribute("showing"), "blocked permission icon is shown");
+      yield popupshown;
 
-    yield new Promise((c) => setTimeout(c, TIMEOUT_MS));
+      ok(!blockedIcon.hasAttribute("showing"), "blocked permission icon is not shown");
+
+      let popuphidden = BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popuphidden");
 
-    Assert.deepEqual(SitePermissions.get(uri, id, browser), {
-      state: SitePermissions.UNKNOWN,
-      scope: SitePermissions.SCOPE_PERSISTENT,
+      let notification = PopupNotifications.panel.firstChild;
+      EventUtils.synthesizeMouseAtCenter(notification.secondaryButton, {});
+
+      yield popuphidden;
+
+      SitePermissions.remove(uri, id, browser);
     });
-
-    let popupshown = BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popupshown");
-
-    // Request a permission;
-    yield BrowserTestUtils.synthesizeMouseAtCenter(`#${id}`, {}, browser);
-
-    yield popupshown;
-
-    ok(!blockedIcon.hasAttribute("showing"), "blocked permission icon is not shown");
-
-    let popuphidden = BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popuphidden");
-
-    let notification = PopupNotifications.panel.firstChild;
-    EventUtils.synthesizeMouseAtCenter(notification.secondaryButton, {});
-
-    yield popuphidden;
-
-    SitePermissions.remove(uri, id, browser);
-  });
+  }
 });
--- a/browser/base/content/test/permissions/permissions.html
+++ b/browser/base/content/test/permissions/permissions.html
@@ -5,10 +5,11 @@
 <html dir="ltr" xml:lang="en-US" lang="en-US">
   <head>
     <meta charset="utf8">
   </head>
   <body>
 	<!-- This page could eventually request permissions from content
 	     and make sure that chrome responds appropriately -->
   <button id="geo" onclick="navigator.geolocation.getCurrentPosition(() => {})">Geolocation</button>
+  <button id="camera" onclick="navigator.mediaDevices.getUserMedia({video: true, fake: true})">Camera</button>
   </body>
 </html>
--- a/browser/components/sessionstore/SessionStore.jsm
+++ b/browser/components/sessionstore/SessionStore.jsm
@@ -3273,20 +3273,31 @@ var SessionStoreInternal = {
     if (!overwriteTabs && firstWindow) {
       initialTabs = Array.slice(tabbrowser.tabs);
     }
 
     let restoreTabsLazily = this._prefBranch.getBoolPref("sessionstore.restore_tabs_lazily") &&
       this._prefBranch.getBoolPref("sessionstore.restore_on_demand");
 
     for (var t = 0; t < newTabCount; t++) {
-      let userContextId = winData.tabs[t].userContextId;
+      let tabData = winData.tabs[t];
+
+      let userContextId = tabData.userContextId;
       let select = t == selectTab - 1;
-      let createLazyBrowser = restoreTabsLazily && !select && !winData.tabs[t].pinned;
-      let tab = tabbrowser.addTab("about:blank",
+      let createLazyBrowser = restoreTabsLazily && !select && !tabData.pinned;
+
+      let url = "about:blank";
+      if (createLazyBrowser) {
+        // Let tabbrowser know the future URI because progress listeners won't
+        // get onLocationChange notification before the browser is inserted.
+        let activeIndex = (tabData.index || tabData.entries.length) - 1;
+        url = tabData.entries[activeIndex].url;
+      }
+
+      let tab = tabbrowser.addTab(url,
                                   { createLazyBrowser,
                                     skipAnimation: true,
                                     userContextId,
                                     skipBackgroundNotify: true });
 
       if (select) {
         // Select a new tab first to prevent the removeTab loop from changing
         // the selected tab over and over again.
@@ -3296,17 +3307,17 @@ var SessionStoreInternal = {
         for (let i = 0; i < tabsToRemove; i++) {
           tabbrowser.removeTab(tabbrowser.tabs[0]);
         }
         tabsToRemove = 0;
       }
 
       tabs.push(tab);
 
-      if (winData.tabs[t].hidden) {
+      if (tabData.hidden) {
         tabbrowser.hideTab(tabs[t]);
       }
     }
 
     for (let i = 0; i < newTabCount; ++i) {
       if (winData.tabs[i].pinned) {
         tabbrowser.pinTab(tabs[i]);
       } else {
--- a/browser/components/sessionstore/test/browser.ini
+++ b/browser/components/sessionstore/test/browser.ini
@@ -220,16 +220,17 @@ skip-if = (os == 'win' && bits == 64) ||
 skip-if = true
 [browser_464620_b.js]
 skip-if = true
 
 # Disabled on OS X:
 [browser_625016.js]
 skip-if = os == "mac"
 
+[browser_906076_lazy_tabs.js]
 [browser_911547.js]
 [browser_send_async_message_oom.js]
 [browser_multiple_navigateAndRestore.js]
 run-if = e10s
 [browser_async_window_flushing.js]
 [browser_forget_async_closings.js]
 [browser_newtab_userTypedValue.js]
 [browser_parentProcessRestoreHash.js]
new file mode 100644
--- /dev/null
+++ b/browser/components/sessionstore/test/browser_906076_lazy_tabs.js
@@ -0,0 +1,88 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+const TEST_STATE = {
+  windows: [{
+    tabs: [
+      { entries: [{ url: "http://example.com" }] },
+      { entries: [{ url: "http://example.com" }] },
+      { entries: [{ url: "http://example.com" }] },
+      { entries: [{ url: "http://example.com" }] },
+      { entries: [{ url: "http://example.com" }] },
+      { entries: [{ url: "http://example.com" }] },
+      { entries: [{ url: "http://example.com" }] },
+      { entries: [{ url: "http://example.com" }] },
+      { entries: [{ url: "http://example.com" }] },
+      { entries: [{ url: "http://example.com" }] },
+    ]
+  }]
+};
+
+function countNonLazyTabs(win) {
+  win = win || window;
+  let count = 0;
+  for (let browser of win.gBrowser.browsers) {
+    if (browser.isConnected) {
+      count++;
+    }
+  }
+  return count;
+}
+
+/**
+ * Test that lazy browsers do not get prematurely inserted by
+ * code accessing browser bound properties on the unbound browser.
+ */
+
+add_task(function* test() {
+  yield SpecialPowers.pushPrefEnv({
+    "set": [
+      ["browser.sessionstore.restore_on_demand", true],
+      ["browser.sessionstore.restore_tabs_lazily", true],
+    ]
+  });
+
+  let backupState = SessionStore.getBrowserState();
+
+  yield promiseBrowserState(TEST_STATE);
+
+  info("Check that no lazy browsers get unnecessarily inserted after session restore");
+  is(countNonLazyTabs(), 1, "Window has only 1 non-lazy tab");
+
+  yield TestUtils.topicObserved("sessionstore-state-write-complete");
+
+  // When sessionstore write occurs, tabs are checked for state changes.
+  // Make sure none of them insert their browsers when this happens.
+  info("Check that no lazy browsers get inserted after sessionstore write");
+  is(countNonLazyTabs(), 1, "Window has only 1 non-lazy tab");
+
+  info("Check that lazy browser gets inserted properly");
+  ok(!gBrowser.browsers[1].isConnected, "The browser that we're attempting to insert is indeed lazy");
+  gBrowser._insertBrowser(gBrowser.tabs[1]);
+  is(countNonLazyTabs(), 2, "Window now has 2 non-lazy tabs");
+
+  // Check if any lazy tabs got inserted when window closes.
+  let newWindow = yield promiseNewWindowLoaded();
+
+  SessionStore.setWindowState(newWindow, JSON.stringify(TEST_STATE));
+
+  yield new Promise(resolve => {
+    newWindow.addEventListener("unload", () => {
+      info("Check that no lazy browsers get inserted when window closes");
+      is(countNonLazyTabs(newWindow), 1, "Window has only 1 non-lazy tab");
+
+      info("Check that it is not possible to insert a lazy browser after the window closed");
+      ok(!newWindow.gBrowser.browsers[1].isConnected, "The browser that we're attempting to insert is indeed lazy");
+      newWindow.gBrowser._insertBrowser(newWindow.gBrowser.tabs[1]);
+      is(countNonLazyTabs(newWindow), 1, "Window still has only 1 non-lazy tab");
+
+      resolve();
+    }, { once: true });
+
+    newWindow.close();
+  });
+
+  // Cleanup.
+  yield promiseBrowserState(backupState);
+});
+
--- a/devtools/client/inspector/webpack.config.js
+++ b/devtools/client/inspector/webpack.config.js
@@ -18,16 +18,18 @@ module.exports = envConfig => {
       path.join(__dirname, "local-toolbox.js")
     ],
     output: {
       path: path.join(__dirname, "assets/build"),
       filename: "inspector.js",
       publicPath: "/"
     },
     module: {
+      noParse: /(debugger\/new)|netmonitor\/panel\.js/i,
+
       // Disable handling of unknown requires
       unknownContextRegExp: /$^/,
       unknownContextCritical: false,
 
       // Disable handling of requires with a single expression
       exprContextRegExp: /$^/,
       exprContextCritical: false,
 
--- a/devtools/client/locales/en-US/webconsole.properties
+++ b/devtools/client/locales/en-US/webconsole.properties
@@ -90,16 +90,19 @@ noCounterLabel=<no label>
 # console.group messages with no label provided.
 noGroupLabel=<no group label>
 
 # LOCALIZATION NOTE (Autocomplete.blank): this string is used when inputnode
 # string containing anchor doesn't matches to any property in the content.
 Autocomplete.blank=  <- no result
 
 maxTimersExceeded=The maximum allowed number of timers in this page was exceeded.
+timerAlreadyExists=Timer “%S” already exists.
+timerDoesntExist=Timer “%S” doesn’t exist.
+timerJSError=Failed to process the timer name.
 
 # LOCALIZATION NOTE (maxCountersExceeded): Error message shown when the maximum
 # number of console.count()-counters was exceeded.
 maxCountersExceeded=The maximum allowed number of counters in this page was exceeded.
 
 # LOCALIZATION NOTE (longStringEllipsis): the string displayed after a long
 # string. This string is clickable such that the rest of the string is
 # retrieved from the server.
--- a/devtools/client/netmonitor/src/components/toolbar.js
+++ b/devtools/client/netmonitor/src/components/toolbar.js
@@ -7,17 +7,17 @@
 const {
   createClass,
   createFactory,
   DOM,
   PropTypes,
 } = require("devtools/client/shared/vendor/react");
 const { connect } = require("devtools/client/shared/vendor/react-redux");
 const Actions = require("../actions/index");
-const { FILTER_SEARCH_DELAY } = require("../constants");
+const { FILTER_SEARCH_DELAY, FILTER_FLAGS } = require("../constants");
 const {
   getDisplayedRequestsSummary,
   getRequestFilterTypes,
   isNetworkDetailsToggleButtonDisabled,
 } = require("../selectors/index");
 
 const { L10N } = require("../utils/l10n");
 
@@ -104,16 +104,17 @@ const Toolbar = createClass({
         ),
         span({ className: "devtools-toolbar-group" },
           SearchBox({
             delay: FILTER_SEARCH_DELAY,
             keyShortcut: SEARCH_KEY_SHORTCUT,
             placeholder: SEARCH_PLACE_HOLDER,
             type: "filter",
             onChange: setRequestFilterText,
+            autocompleteList: FILTER_FLAGS.map((item) => `${item}:`),
           }),
           button({
             className: toggleButtonClassName.join(" "),
             title: networkDetailsOpen ? COLLPASE_DETAILS_PANE : EXPAND_DETAILS_PANE,
             disabled: networkDetailsToggleDisabled,
             tabIndex: "0",
             onClick: toggleNetworkDetails,
           }),
--- a/devtools/client/netmonitor/src/constants.js
+++ b/devtools/client/netmonitor/src/constants.js
@@ -153,16 +153,32 @@ const HEADERS = [
     canFilter: true,
   },
   {
     name: "waterfall",
     canFilter: false,
   }
 ];
 
+const HEADER_FILTERS = HEADERS
+  .filter(h => h.canFilter)
+  .map(h => h.filterKey || h.name);
+
+const FILTER_FLAGS = [
+  ...HEADER_FILTERS,
+  "set-cookie-domain",
+  "set-cookie-name",
+  "set-cookie-value",
+  "mime-type",
+  "larger-than",
+  "is",
+  "has-response-header",
+  "regexp",
+];
+
 const REQUESTS_WATERFALL = {
   BACKGROUND_TICKS_MULTIPLE: 5, // ms
   BACKGROUND_TICKS_SCALES: 3,
   BACKGROUND_TICKS_SPACING_MIN: 10, // px
   BACKGROUND_TICKS_COLOR_RGB: [128, 136, 144],
   // 8-bit value of the alpha component of the tick color
   BACKGROUND_TICKS_OPACITY_MIN: 32,
   BACKGROUND_TICKS_OPACITY_ADD: 32,
@@ -175,14 +191,15 @@ const REQUESTS_WATERFALL = {
   LABEL_WIDTH: 50, // px
 };
 
 const general = {
   ACTIVITY_TYPE,
   EVENTS,
   FILTER_SEARCH_DELAY: 200,
   HEADERS,
+  FILTER_FLAGS,
   SOURCE_EDITOR_SYNTAX_HIGHLIGHT_MAX_SIZE: 51200, // 50 KB in bytes
   REQUESTS_WATERFALL,
 };
 
 // flatten constants
 module.exports = Object.assign({}, general, actionTypes);
--- a/devtools/client/netmonitor/src/utils/filter-text-utils.js
+++ b/devtools/client/netmonitor/src/utils/filter-text-utils.js
@@ -25,33 +25,18 @@
  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 "use strict";
 
-const { HEADERS } = require("../constants");
+const { FILTER_FLAGS } = require("../constants");
 const { getFormattedIPAndPort } = require("./format-utils");
-const HEADER_FILTERS = HEADERS
-  .filter(h => h.canFilter)
-  .map(h => h.filterKey || h.name);
-
-const FILTER_FLAGS = [
-  ...HEADER_FILTERS,
-  "set-cookie-domain",
-  "set-cookie-name",
-  "set-cookie-value",
-  "mime-type",
-  "larger-than",
-  "is",
-  "has-response-header",
-  "regexp",
-];
 
 /*
   The function `parseFilters` is from:
   https://github.com/ChromeDevTools/devtools-frontend/
 
   front_end/network/FilterSuggestionBuilder.js#L138-L163
   Commit f340aefd7ec9b702de9366a812288cfb12111fce
 */
--- a/devtools/client/netmonitor/webpack.config.js
+++ b/devtools/client/netmonitor/webpack.config.js
@@ -37,16 +37,17 @@ let webpackConfig = {
   resolve: {
     fallback: path.join(__dirname, "node_modules"),
     alias: {
       "react": path.join(__dirname, "node_modules/react"),
       "devtools/client/framework/devtools": path.join(__dirname, "../../client/shims/devtools"),
       "devtools/client/framework/menu": "devtools-modules/src/menu",
       "devtools/client/framework/menu-item": path.join(__dirname, "../../client/framework/menu-item"),
       "devtools/client/locales": path.join(__dirname, "../../client/locales/en-US"),
+      "devtools/client/shared/components/autocomplete-popup": path.join(__dirname, "../../client/shared/components/autocomplete-popup"),
       "devtools/client/shared/components/reps/reps": path.join(__dirname, "../../client/shared/components/reps/reps"),
       "devtools/client/shared/components/search-box": path.join(__dirname, "../../client/shared/components/search-box"),
       "devtools/client/shared/components/splitter/draggable": path.join(__dirname, "../../client/shared/components/splitter/draggable"),
       "devtools/client/shared/components/splitter/split-box": path.join(__dirname, "../../client/shared/components/splitter/split-box"),
       "devtools/client/shared/components/stack-trace": path.join(__dirname, "../../client/shared/components/stack-trace"),
       "devtools/client/shared/components/tabs/tabbar": path.join(__dirname, "../../client/shared/components/tabs/tabbar"),
       "devtools/client/shared/components/tabs/tabs": path.join(__dirname, "../../client/shared/components/tabs/tabs"),
       "devtools/client/shared/components/tree/tree-view": path.join(__dirname, "../../client/shared/components/tree/tree-view"),
new file mode 100644
--- /dev/null
+++ b/devtools/client/shared/components/autocomplete-popup.js
@@ -0,0 +1,122 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const { DOM: dom, createClass, PropTypes } = require("devtools/client/shared/vendor/react");
+
+module.exports = createClass({
+  displayName: "AutocompletePopup",
+
+  propTypes: {
+    list: PropTypes.array.isRequired,
+    filter: PropTypes.string.isRequired,
+    onItemSelected: PropTypes.func.isRequired,
+  },
+
+  getInitialState() {
+    return this.computeState(this.props);
+  },
+
+  componentWillReceiveProps(nextProps) {
+    if (this.props.filter === nextProps.filter) {
+      return;
+    }
+    this.setState(this.computeState(nextProps));
+  },
+
+  componentDidUpdate() {
+    if (this.refs.selected) {
+      this.refs.selected.scrollIntoView(false);
+    }
+  },
+
+  computeState({ filter, list }) {
+    let filteredList = list.filter((item) => {
+      return item.toLowerCase().startsWith(filter.toLowerCase())
+        && item.toLowerCase() !== filter.toLowerCase();
+    }).sort();
+    let selectedIndex = filteredList.length == 1 ? 0 : -1;
+
+    return { filteredList, selectedIndex };
+  },
+
+  /**
+   * Use this method to select the top-most item
+   * This method is public, called outside of the autocomplete-popup component.
+   */
+  jumpToTop() {
+    this.setState({ selectedIndex: 0 });
+  },
+
+  /**
+   * Use this method to select the bottom-most item
+   * This method is public.
+   */
+  jumpToBottom() {
+    let selectedIndex = this.state.filteredList.length - 1;
+    this.setState({ selectedIndex });
+  },
+
+  /**
+   * Increment the selected index with the provided increment value. Will cycle to the
+   * beginning/end of the list if the index exceeds the list boundaries.
+   * This method is public.
+   *
+   * @param {number} increment - No. of hops in the direction
+   */
+  jumpBy(increment = 1) {
+    let { filteredList, selectedIndex } = this.state;
+    let nextIndex = selectedIndex + increment;
+    if (increment > 0) {
+      // Positive cycling
+      nextIndex = nextIndex > filteredList.length - 1 ? 0 : nextIndex;
+    } else if (increment < 0) {
+      // Inverse cycling
+      nextIndex = nextIndex < 0 ? filteredList.length - 1 : nextIndex;
+    }
+    this.setState({selectedIndex: nextIndex});
+  },
+
+  /**
+   * Submit the currently selected item to the onItemSelected callback
+   * This method is public.
+   */
+  select() {
+    if (this.refs.selected) {
+      this.props.onItemSelected(this.refs.selected.textContent);
+    }
+  },
+
+  onMouseDown(e) {
+    e.preventDefault();
+    this.setState({ selectedIndex: Number(e.target.dataset.index) }, this.select);
+  },
+
+  render() {
+    let { filteredList } = this.state;
+
+    return filteredList.length > 0 && dom.div(
+      { className: "devtools-autocomplete-popup devtools-monospace" },
+      dom.ul(
+        { className: "devtools-autocomplete-listbox" },
+        filteredList.map((item, i) => {
+          let isSelected = this.state.selectedIndex == i;
+          let itemClassList = ["autocomplete-item"];
+
+          if (isSelected) {
+            itemClassList.push("autocomplete-selected");
+          }
+          return dom.li({
+            key: i,
+            "data-index": i,
+            className: itemClassList.join(" "),
+            ref: isSelected ? "selected" : null,
+            onMouseDown: this.onMouseDown,
+          }, item);
+        })
+      )
+    );
+  }
+});
--- a/devtools/client/shared/components/moz.build
+++ b/devtools/client/shared/components/moz.build
@@ -7,16 +7,17 @@
 DIRS += [
     'reps',
     'splitter',
     'tabs',
     'tree'
 ]
 
 DevToolsModules(
+    'autocomplete-popup.js',
     'frame.js',
     'h-split-box.js',
     'notification-box.css',
     'notification-box.js',
     'search-box.js',
     'sidebar-toggle.css',
     'sidebar-toggle.js',
     'stack-trace.js',
--- a/devtools/client/shared/components/search-box.js
+++ b/devtools/client/shared/components/search-box.js
@@ -1,36 +1,45 @@
 /* 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/. */
 
 /* global window */
 
 "use strict";
 
-const { DOM: dom, createClass, PropTypes } = require("devtools/client/shared/vendor/react");
+const { DOM: dom, createClass, PropTypes, createFactory } = require("devtools/client/shared/vendor/react");
 const KeyShortcuts = require("devtools/client/shared/key-shortcuts");
+const AutocompletePopup = createFactory(require("devtools/client/shared/components/autocomplete-popup"));
 
 /**
  * A generic search box component for use across devtools
  */
 module.exports = createClass({
   displayName: "SearchBox",
 
   propTypes: {
     delay: PropTypes.number,
     keyShortcut: PropTypes.string,
     onChange: PropTypes.func,
     placeholder: PropTypes.string,
-    type: PropTypes.string
+    type: PropTypes.string,
+    autocompleteList: PropTypes.array,
+  },
+
+  getDefaultProps() {
+    return {
+      autocompleteList: [],
+    };
   },
 
   getInitialState() {
     return {
-      value: ""
+      value: "",
+      focused: false,
     };
   },
 
   componentDidMount() {
     if (!this.props.keyShortcut) {
       return;
     }
 
@@ -51,17 +60,19 @@ module.exports = createClass({
     // Clean up an existing timeout.
     if (this.searchTimeout) {
       clearTimeout(this.searchTimeout);
     }
   },
 
   onChange() {
     if (this.state.value !== this.refs.input.value) {
-      this.setState({ value: this.refs.input.value });
+      this.setState({
+        value: this.refs.input.value,
+      });
     }
 
     if (!this.props.delay) {
       this.props.onChange(this.state.value);
       return;
     }
 
     // Clean up an existing timeout before creating a new one.
@@ -77,34 +88,98 @@ module.exports = createClass({
     }, this.props.delay);
   },
 
   onClearButtonClick() {
     this.refs.input.value = "";
     this.onChange();
   },
 
+  onFocus() {
+    this.setState({ focused: true });
+  },
+
+  onBlur() {
+    this.setState({ focused: false });
+  },
+
+  onKeyDown(e) {
+    let { autocompleteList } = this.props;
+    let { autocomplete } = this.refs;
+
+    if (autocompleteList.length == 0) {
+      return;
+    }
+
+    switch (e.key) {
+      case "ArrowDown":
+        autocomplete.jumpBy(1);
+        break;
+      case "ArrowUp":
+        autocomplete.jumpBy(-1);
+        break;
+      case "PageDown":
+        autocomplete.jumpBy(5);
+        break;
+      case "PageUp":
+        autocomplete.jumpBy(-5);
+        break;
+      case "Enter":
+      case "Tab":
+        e.preventDefault();
+        autocomplete.select();
+        break;
+      case "Escape":
+        e.preventDefault();
+        this.onBlur();
+        break;
+      case "Home":
+        autocomplete.jumpToTop();
+        break;
+      case "End":
+        autocomplete.jumpToBottom();
+        break;
+    }
+  },
+
   render() {
-    let { type = "search", placeholder } = this.props;
+    let {
+      type = "search",
+      placeholder,
+      autocompleteList
+    } = this.props;
     let { value } = this.state;
     let divClassList = ["devtools-searchbox", "has-clear-btn"];
     let inputClassList = [`devtools-${type}input`];
 
     if (value !== "") {
       inputClassList.push("filled");
     }
     return dom.div(
       { className: divClassList.join(" ") },
       dom.input({
         className: inputClassList.join(" "),
         onChange: this.onChange,
+        onFocus: this.onFocus,
+        onBlur: this.onBlur,
+        onKeyDown: this.onKeyDown,
         placeholder,
         ref: "input",
-        value
+        value,
       }),
       dom.button({
         className: "devtools-searchinput-clear",
         hidden: value == "",
         onClick: this.onClearButtonClick
+      }),
+      autocompleteList.length > 0 && this.state.focused &&
+      AutocompletePopup({
+        list: autocompleteList,
+        filter: value,
+        ref: "autocomplete",
+        onItemSelected: (itemValue) => {
+          this.setState({ value: itemValue });
+          this.onChange();
+        }
       })
     );
   }
 });
--- a/devtools/client/themes/common.css
+++ b/devtools/client/themes/common.css
@@ -77,100 +77,86 @@ html|button, html|select {
   padding: 2px;
 }
 
 .devtools-autocomplete-listbox .autocomplete-item {
   width: 100%;
   background-color: transparent;
   border-radius: 4px;
   padding: 1px 0;
-}
-
-.devtools-autocomplete-listbox .autocomplete-selected {
-  background-color: rgba(0,0,0,0.2);
-}
-
-.devtools-autocomplete-listbox.dark-theme .autocomplete-selected,
-.devtools-autocomplete-listbox.dark-theme .autocomplete-item:hover {
-  background-color: rgba(0,0,0,0.5);
-}
-
-.devtools-autocomplete-listbox.dark-theme .autocomplete-selected > .autocomplete-value,
-.devtools-autocomplete-listbox:focus.dark-theme .autocomplete-selected > .initial-value {
-  color: hsl(208,100%,60%);
-}
-
-.devtools-autocomplete-listbox.dark-theme .autocomplete-selected > span {
-  color: #eee;
-}
-
-.devtools-autocomplete-listbox.dark-theme .autocomplete-item > span {
-  color: #ccc;
+  cursor: default;
 }
 
 .devtools-autocomplete-listbox .autocomplete-item > .initial-value,
 .devtools-autocomplete-listbox .autocomplete-item > .autocomplete-value {
   margin: 0;
   padding: 0;
-  cursor: default;
 }
 
 .devtools-autocomplete-listbox .autocomplete-item > .autocomplete-count {
   text-align: end;
 }
 
 /* Rest of the dark and light theme */
 
 .devtools-autocomplete-popup,
+.CodeMirror-hints,
+.CodeMirror-Tern-tooltip {
+  border: 1px solid hsl(210,24%,90%);
+  background-image: linear-gradient(to bottom, hsla(209,18%,100%,0.9), hsl(210,24%,95%));
+  box-shadow: 0 1px 0 hsla(209,29%,90%,.25) inset;
+}
+
+.theme-dark .devtools-autocomplete-popup,
 .theme-dark .CodeMirror-hints,
 .theme-dark .CodeMirror-Tern-tooltip {
   border: 1px solid hsl(210,11%,10%);
   background-image: linear-gradient(to bottom, hsla(209,18%,18%,0.9), hsl(210,11%,16%));
-}
-
-.devtools-autocomplete-popup.light-theme,
-.light-theme .CodeMirror-hints,
-.light-theme .CodeMirror-Tern-tooltip {
-  border: 1px solid hsl(210,24%,90%);
-  background-image: linear-gradient(to bottom, hsla(209,18%,100%,0.9), hsl(210,24%,95%));
-}
-
-.devtools-autocomplete-popup.light-theme {
-  box-shadow: 0 1px 0 hsla(209,29%,90%,.25) inset;
+  box-shadow: none;
 }
 
 .theme-firebug .devtools-autocomplete-popup {
   border-color: var(--theme-splitter-color);
   border-radius: 5px;
   font-size: var(--theme-autompletion-font-size);
-}
-
-.devtools-autocomplete-popup.firebug-theme {
   background: var(--theme-body-background);
 }
 
-.devtools-autocomplete-listbox.firebug-theme .autocomplete-selected,
-.devtools-autocomplete-listbox.firebug-theme .autocomplete-item:hover,
-.devtools-autocomplete-listbox.light-theme .autocomplete-selected,
-.devtools-autocomplete-listbox.light-theme .autocomplete-item:hover {
+.devtools-autocomplete-listbox .autocomplete-selected,
+.devtools-autocomplete-listbox .autocomplete-item:hover {
   background-color: rgba(128,128,128,0.3);
 }
 
-.devtools-autocomplete-listbox.firebug-theme .autocomplete-selected > .autocomplete-value,
-.devtools-autocomplete-listbox:focus.firebug-theme .autocomplete-selected > .initial-value,
-.devtools-autocomplete-listbox.light-theme .autocomplete-selected > .autocomplete-value,
-.devtools-autocomplete-listbox:focus.light-theme .autocomplete-selected > .initial-value {
+.theme-dark .devtools-autocomplete-listbox .autocomplete-selected,
+.theme-dark .devtools-autocomplete-listbox .autocomplete-item:hover {
+  background-color: rgba(0,0,0,0.5);
+}
+
+.devtools-autocomplete-listbox .autocomplete-selected > .autocomplete-value,
+.devtools-autocomplete-listbox:focus .autocomplete-selected > .initial-value {
   color: #222;
 }
 
-.devtools-autocomplete-listbox.firebug-theme .autocomplete-item > span,
-.devtools-autocomplete-listbox.light-theme .autocomplete-item > span {
+.theme-dark .devtools-autocomplete-listbox .autocomplete-selected > .autocomplete-value,
+.theme-dark .devtools-autocomplete-listbox:focus .autocomplete-selected > .initial-value {
+  color: hsl(208,100%,60%);
+}
+
+.devtools-autocomplete-listbox .autocomplete-item > span {
   color: #666;
 }
 
+.theme-dark .devtools-autocomplete-listbox .autocomplete-item > span {
+  color: #ccc;
+}
+
+.theme-dark .devtools-autocomplete-listbox .autocomplete-selected > span {
+  color: #eee;
+}
+
 /* Autocomplete list clone used for accessibility. */
 
 .devtools-autocomplete-list-aria-clone {
   /* Cannot use display:none or visibility:hidden : screen readers ignore the element. */
   position: fixed;
   overflow: hidden;
   margin: 0;
   width: 0;
@@ -488,16 +474,24 @@ checkbox:-moz-focusring {
 .devtools-searchinput:focus,
 .devtools-filterinput:focus {
   border-color: var(--theme-focus-border-color-textbox);
   box-shadow: var(--theme-focus-box-shadow-textbox);
   transition: all 0.2s ease-in-out;
   outline: none;
 }
 
+.devtools-searchbox .devtools-autocomplete-popup {
+  position: absolute;
+  top: 100%;
+  width: 100%;
+  line-height: initial !important;
+  z-index: 999;
+}
+
 /* Don't add 'double spacing' for inputs that are at beginning / end
    of a toolbar (since the toolbar has it's own spacing). */
 .devtools-toolbar > .devtools-textinput:first-child,
 .devtools-toolbar > .devtools-searchinput:first-child,
 .devtools-toolbar > .devtools-filterinput:first-child {
   margin-inline-start: 0;
 }
 .devtools-toolbar > .devtools-textinput:last-child,
--- a/devtools/client/webconsole/new-console-output/test/components/console-api-call.test.js
+++ b/devtools/client/webconsole/new-console-output/test/components/console-api-call.test.js
@@ -138,26 +138,38 @@ describe("ConsoleAPICall component:", ()
 
   describe("console.time", () => {
     it("does not show anything", () => {
       const message = stubPreparedMessages.get("console.time('bar')");
       const wrapper = render(ConsoleApiCall({ message, serviceContainer }));
 
       expect(wrapper.find(".message-body").text()).toBe("");
     });
+    it("shows an error if called again", () => {
+      const message = stubPreparedMessages.get("timerAlreadyExists");
+      const wrapper = render(ConsoleApiCall({ message, serviceContainer }));
+
+      expect(wrapper.find(".message-body").text()).toBe("Timer “bar” already exists.");
+    });
   });
 
   describe("console.timeEnd", () => {
     it("renders as expected", () => {
       const message = stubPreparedMessages.get("console.timeEnd('bar')");
       const wrapper = render(ConsoleApiCall({ message, serviceContainer }));
 
       expect(wrapper.find(".message-body").text()).toBe(message.messageText);
       expect(wrapper.find(".message-body").text()).toMatch(/^bar: \d+(\.\d+)?ms$/);
     });
+    it("shows an error if the timer doesn't exist", () => {
+      const message = stubPreparedMessages.get("timerDoesntExist");
+      const wrapper = render(ConsoleApiCall({ message, serviceContainer }));
+
+      expect(wrapper.find(".message-body").text()).toBe("Timer “bar” doesn’t exist.");
+    });
   });
 
   describe("console.trace", () => {
     it("renders", () => {
       const message = stubPreparedMessages.get("console.trace()");
       const wrapper = render(ConsoleApiCall({ message, serviceContainer, open: true }));
       const filepath = "http://example.com/browser/devtools/client/webconsole/" +
                        "new-console-output/test/fixtures/stub-generators/" +
--- a/devtools/client/webconsole/new-console-output/test/fixtures/serviceContainer.js
+++ b/devtools/client/webconsole/new-console-output/test/fixtures/serviceContainer.js
@@ -8,13 +8,18 @@ module.exports = {
   emitNewMessage: () => {},
   hudProxyClient: {},
   onViewSourceInDebugger: () => {},
   onViewSourceInStyleEditor: () => {},
   onViewSourceInScratchpad: () => {},
   openNetworkPanel: () => {},
   sourceMapService: {
     subscribe: () => {},
+    originalPositionFor: () => {
+      return new Promise(resolve => {
+        resolve();
+      });
+    },
   },
   openLink: () => {},
   // eslint-disable-next-line react/display-name
   createElement: tagName => document.createElement(tagName)
 };
--- a/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/stub-snippets.js
+++ b/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/stub-snippets.js
@@ -45,19 +45,22 @@ function testStacktraceFiltering() {
 function foo() {
   testStacktraceFiltering()
 }
 
 foo()
 `});
 
 consoleApi.set("console.time('bar')", {
-  keys: ["console.time('bar')", "console.timeEnd('bar')"],
+  keys: ["console.time('bar')", "timerAlreadyExists",
+         "console.timeEnd('bar')", "timerDoesntExist"],
   code: `
 console.time("bar");
+console.time("bar");
+console.timeEnd("bar");
 console.timeEnd("bar");
 `});
 
 consoleApi.set("console.table('bar')", {
   keys: ["console.table('bar')"],
   code: `
 console.table('bar');
 `});
--- a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js
+++ b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js
@@ -649,31 +649,77 @@ stubPreparedMessages.set("console.time('
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null
 }));
 
+stubPreparedMessages.set("timerAlreadyExists", new ConsoleMessage({
+  "id": "1",
+  "allowRepeating": true,
+  "source": "console-api",
+  "timeStamp": 1494362489620,
+  "type": "time",
+  "level": "warn",
+  "messageText": "Timer “bar” already exists.",
+  "parameters": null,
+  "repeat": 1,
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"timeStamp\":null,\"type\":\"time\",\"level\":\"warn\",\"messageText\":\"Timer “bar” already exists.\",\"parameters\":null,\"repeat\":null,\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":3,\"column\":1},\"groupId\":null,\"exceptionDocURL\":null,\"userProvidedStyles\":[],\"notes\":null}",
+  "stacktrace": null,
+  "frame": {
+    "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "line": 3,
+    "column": 1
+  },
+  "groupId": null,
+  "exceptionDocURL": null,
+  "userProvidedStyles": [],
+  "notes": null
+}));
+
 stubPreparedMessages.set("console.timeEnd('bar')", new ConsoleMessage({
   "id": "1",
   "allowRepeating": true,
   "source": "console-api",
   "timeStamp": 1479159911478,
   "type": "timeEnd",
   "level": "log",
   "messageText": "bar: 1.36ms",
   "parameters": null,
   "repeat": 1,
-  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"timeStamp\":null,\"type\":\"timeEnd\",\"level\":\"log\",\"messageText\":\"bar: 1.36ms\",\"parameters\":null,\"repeat\":null,\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":3,\"column\":1},\"groupId\":null,\"exceptionDocURL\":null,\"userProvidedStyles\":[],\"notes\":null}",
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"timeStamp\":null,\"type\":\"timeEnd\",\"level\":\"log\",\"messageText\":\"bar: 1.36ms\",\"parameters\":null,\"repeat\":null,\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":4,\"column\":1},\"groupId\":null,\"exceptionDocURL\":null,\"userProvidedStyles\":[],\"notes\":null}",
   "stacktrace": null,
   "frame": {
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
-    "line": 3,
+    "line": 4,
+    "column": 1
+  },
+  "groupId": null,
+  "exceptionDocURL": null,
+  "userProvidedStyles": [],
+  "notes": null
+}));
+
+stubPreparedMessages.set("timerDoesntExist", new ConsoleMessage({
+  "id": "1",
+  "allowRepeating": true,
+  "source": "console-api",
+  "timeStamp": 1494362489622,
+  "type": "timeEnd",
+  "level": "warn",
+  "messageText": "Timer “bar” doesn’t exist.",
+  "parameters": null,
+  "repeat": 1,
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"timeStamp\":null,\"type\":\"timeEnd\",\"level\":\"warn\",\"messageText\":\"Timer “bar” doesn’t exist.\",\"parameters\":null,\"repeat\":null,\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":5,\"column\":1},\"groupId\":null,\"exceptionDocURL\":null,\"userProvidedStyles\":[],\"notes\":null}",
+  "stacktrace": null,
+  "frame": {
+    "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "line": 5,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
   "userProvidedStyles": [],
   "notes": null
 }));
 
@@ -708,17 +754,16 @@ stubPreparedMessages.set("console.table(
   "source": "console-api",
   "timeStamp": 1479159913807,
   "type": "table",
   "level": "log",
   "messageText": null,
   "parameters": [
     {
       "type": "object",
-      "actor": "server1.conn15.child1/obj31",
       "class": "Array",
       "extensible": true,
       "frozen": false,
       "sealed": false,
       "ownPropertyLength": 4,
       "preview": {
         "kind": "ArrayLike",
         "length": 3,
@@ -726,17 +771,17 @@ stubPreparedMessages.set("console.table(
           "a",
           "b",
           "c"
         ]
       }
     }
   ],
   "repeat": 1,
-  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"timeStamp\":null,\"type\":\"table\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn15.child1/obj31\",\"class\":\"Array\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":4,\"preview\":{\"kind\":\"ArrayLike\",\"length\":3,\"items\":[\"a\",\"b\",\"c\"]}}],\"repeat\":null,\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"exceptionDocURL\":null,\"userProvidedStyles\":[],\"notes\":null}",
+  "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"timeStamp\":null,\"type\":\"table\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"class\":\"Array\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":4,\"preview\":{\"kind\":\"ArrayLike\",\"length\":3,\"items\":[\"a\",\"b\",\"c\"]}}],\"repeat\":null,\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"exceptionDocURL\":null,\"userProvidedStyles\":[],\"notes\":null}",
   "stacktrace": null,
   "frame": {
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 2,
     "column": 1
   },
   "groupId": null,
   "exceptionDocURL": null,
@@ -1647,43 +1692,97 @@ stubPackets.set("console.time('bar')", {
       "name": "bar"
     },
     "workerType": "none",
     "styles": [],
     "category": "webdev"
   }
 });
 
+stubPackets.set("timerAlreadyExists", {
+  "from": "server1.conn0.child1/consoleActor2",
+  "type": "consoleAPICall",
+  "message": {
+    "addonId": "",
+    "arguments": [
+      "bar"
+    ],
+    "columnNumber": 1,
+    "counter": null,
+    "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "functionName": "triggerPacket",
+    "groupName": "",
+    "level": "time",
+    "lineNumber": 3,
+    "private": false,
+    "timeStamp": 1494362489620,
+    "timer": {
+      "error": "timerAlreadyExists",
+      "name": "bar"
+    },
+    "workerType": "none",
+    "styles": [],
+    "category": "webdev"
+  }
+});
+
 stubPackets.set("console.timeEnd('bar')", {
   "from": "server1.conn13.child1/consoleActor2",
   "type": "consoleAPICall",
   "message": {
     "addonId": "",
     "arguments": [
       "bar"
     ],
     "columnNumber": 1,
     "counter": null,
     "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "functionName": "triggerPacket",
     "groupName": "",
     "level": "timeEnd",
-    "lineNumber": 3,
+    "lineNumber": 4,
     "private": false,
     "timeStamp": 1479159911478,
     "timer": {
       "duration": 1.3550000000000182,
       "name": "bar"
     },
     "workerType": "none",
     "styles": [],
     "category": "webdev"
   }
 });
 
+stubPackets.set("timerDoesntExist", {
+  "from": "server1.conn0.child1/consoleActor2",
+  "type": "consoleAPICall",
+  "message": {
+    "addonId": "",
+    "arguments": [
+      "bar"
+    ],
+    "columnNumber": 1,
+    "counter": null,
+    "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+    "functionName": "triggerPacket",
+    "groupName": "",
+    "level": "timeEnd",
+    "lineNumber": 5,
+    "private": false,
+    "timeStamp": 1494362489622,
+    "timer": {
+      "error": "timerDoesntExist",
+      "name": "bar"
+    },
+    "workerType": "none",
+    "styles": [],
+    "category": "webdev"
+  }
+});
+
 stubPackets.set("console.table('bar')", {
   "from": "server1.conn14.child1/consoleActor2",
   "type": "consoleAPICall",
   "message": {
     "addonId": "",
     "arguments": [
       "bar"
     ],
@@ -1706,17 +1805,16 @@ stubPackets.set("console.table('bar')", 
 stubPackets.set("console.table(['a', 'b', 'c'])", {
   "from": "server1.conn15.child1/consoleActor2",
   "type": "consoleAPICall",
   "message": {
     "addonId": "",
     "arguments": [
       {
         "type": "object",
-        "actor": "server1.conn15.child1/obj31",
         "class": "Array",
         "extensible": true,
         "frozen": false,
         "sealed": false,
         "ownPropertyLength": 4,
         "preview": {
           "kind": "ArrayLike",
           "length": 3,
--- a/devtools/client/webconsole/new-console-output/utils/messages.js
+++ b/devtools/client/webconsole/new-console-output/utils/messages.js
@@ -60,23 +60,31 @@ function transformPacket(packet) {
           // Chrome RDP doesn't have a special type for count.
           type = MESSAGE_TYPE.LOG;
           let {counter} = message;
           let label = counter.label ? counter.label : l10n.getStr("noCounterLabel");
           messageText = `${label}: ${counter.count}`;
           parameters = null;
           break;
         case "time":
-          // We don't show anything for console.time calls to match Chrome's behaviour.
           parameters = null;
-          type = MESSAGE_TYPE.NULL_MESSAGE;
+          if (timer && timer.error) {
+            messageText = l10n.getFormatStr(timer.error, [timer.name]);
+            level = MESSAGE_LEVEL.WARN;
+          } else {
+            // We don't show anything for console.time calls to match Chrome's behaviour.
+            type = MESSAGE_TYPE.NULL_MESSAGE;
+          }
           break;
         case "timeEnd":
           parameters = null;
-          if (timer) {
+          if (timer && timer.error) {
+            messageText = l10n.getFormatStr(timer.error, [timer.name]);
+            level = MESSAGE_LEVEL.WARN;
+          } else if (timer) {
             // We show the duration to users when calls console.timeEnd() is called,
             // if corresponding console.time() was called before.
             let duration = Math.round(timer.duration * 100) / 100;
             messageText = l10n.getFormatStr("timeEnd", [timer.name, duration]);
           } else {
             // If the `timer` property does not exists, we don't output anything.
             type = MESSAGE_TYPE.NULL_MESSAGE;
           }
--- a/devtools/client/webconsole/webconsole.js
+++ b/devtools/client/webconsole/webconsole.js
@@ -1344,29 +1344,35 @@ WebConsoleFrame.prototype = {
         break;
 
       case "time": {
         let timer = message.timer;
         if (!timer) {
           return null;
         }
         if (timer.error) {
-          console.error(new Error(l10n.getStr(timer.error)));
+          console.error(new Error(l10n.getFormatStr(timer.error,
+                                                    [timer.name])));
           return null;
         }
         body = l10n.getFormatStr("timerStarted", [timer.name]);
         clipboardText = body;
         break;
       }
 
       case "timeEnd": {
         let timer = message.timer;
         if (!timer) {
           return null;
         }
+        if (timer.error) {
+          console.error(new Error(l10n.getFormatStr(timer.error,
+                                                    [timer.name])));
+          return null;
+        }
         let duration = Math.round(timer.duration * 100) / 100;
         body = l10n.getFormatStr("timeEnd", [timer.name, duration]);
         clipboardText = body;
         break;
       }
 
       case "count": {
         let counter = message.counter;
--- a/dom/base/CustomElementRegistry.cpp
+++ b/dom/base/CustomElementRegistry.cpp
@@ -942,33 +942,30 @@ CustomElementReactionsStack::EnqueueUpgr
 {
   Enqueue(aElement, new CustomElementUpgradeReaction(aRegistry, aDefinition));
 }
 
 void
 CustomElementReactionsStack::Enqueue(Element* aElement,
                                      CustomElementReaction* aReaction)
 {
+  RefPtr<CustomElementData> elementData = aElement->GetCustomElementData();
+  MOZ_ASSERT(elementData, "CustomElementData should exist");
+
   // Add element to the current element queue.
   if (!mReactionsStack.IsEmpty()) {
     mReactionsStack.LastElement().AppendElement(do_GetWeakReference(aElement));
-    ReactionQueue* reactionQueue =
-      mElementReactionQueueMap.LookupOrAdd(aElement);
-    reactionQueue->AppendElement(aReaction);
-
+    elementData->mReactionQueue.AppendElement(aReaction);
     return;
   }
 
   // If the custom element reactions stack is empty, then:
   // Add element to the backup element queue.
   mBackupQueue.AppendElement(do_GetWeakReference(aElement));
-
-  ReactionQueue* reactionQueue =
-    mElementReactionQueueMap.LookupOrAdd(aElement);
-  reactionQueue->AppendElement(aReaction);
+  elementData->mReactionQueue.AppendElement(aReaction);
 
   if (mIsBackupQueueProcessing) {
     return;
   }
 
   CycleCollectedJSContext* context = CycleCollectedJSContext::Get();
   RefPtr<ProcessBackupQueueRunnable> processBackupQueueRunnable =
     new ProcessBackupQueueRunnable(this);
@@ -989,26 +986,25 @@ CustomElementReactionsStack::InvokeReact
 {
   for (uint32_t i = 0; i < aElementQueue.Length(); ++i) {
     nsCOMPtr<Element> element = do_QueryReferent(aElementQueue[i]);
 
     if (!element) {
       continue;
     }
 
-    nsAutoPtr<ReactionQueue> reactions;
-    mElementReactionQueueMap.RemoveAndForget(element, reactions);
+    RefPtr<CustomElementData> elementData = element->GetCustomElementData();
+    MOZ_ASSERT(elementData, "CustomElementData should exist");
 
-    MOZ_ASSERT(reactions,
-               "Associated ReactionQueue must be found in mElementReactionQueueMap");
-
-    for (uint32_t j = 0; j < reactions->Length(); ++j) {
-      nsAutoPtr<CustomElementReaction>& reaction = reactions->ElementAt(j);
-      reaction->Invoke(element);
+    nsTArray<nsAutoPtr<CustomElementReaction>>& reactions =
+      elementData->mReactionQueue;
+    for (uint32_t j = 0; j < reactions.Length(); ++j) {
+      reactions.ElementAt(j)->Invoke(element);
     }
+    reactions.Clear();
   }
   aElementQueue.Clear();
 }
 
 //-----------------------------------------------------
 // CustomElementDefinition
 
 CustomElementDefinition::CustomElementDefinition(nsIAtom* aType,
--- a/dom/base/CustomElementRegistry.h
+++ b/dom/base/CustomElementRegistry.h
@@ -21,16 +21,17 @@ class nsDocument;
 
 namespace mozilla {
 namespace dom {
 
 struct CustomElementData;
 struct ElementDefinitionOptions;
 struct LifecycleCallbacks;
 class CallbackFunction;
+class CustomElementReaction;
 class Function;
 class Promise;
 
 struct LifecycleCallbackArgs
 {
   nsString name;
   nsString oldValue;
   nsString newValue;
@@ -98,16 +99,23 @@ struct CustomElementData
   // determines if other callbacks can be enqueued.
   bool mCreatedCallbackInvoked;
   // The microtask level associated with the callbacks in the callback queue,
   // it is used to determine if a new queue needs to be pushed onto the
   // processing stack.
   int32_t mAssociatedMicroTask;
   // Custom element state as described in the custom element spec.
   State mState;
+  // custom element reaction queue as described in the custom element spec.
+  // There is 1 reaction in reaction queue, when 1) it becomes disconnected,
+  // 2) it’s adopted into a new document, 3) its attributes are changed,
+  // appended, removed, or replaced.
+  // There are 3 reactions in reaction queue when doing upgrade operation,
+  // e.g., create an element, insert a node.
+  AutoTArray<nsAutoPtr<CustomElementReaction>, 3> mReactionQueue;
 
   // Empties the callback queue.
   void RunCallbackQueue();
 
 private:
   virtual ~CustomElementData() {}
 };
 
@@ -186,17 +194,17 @@ public:
   NS_INLINE_DECL_REFCOUNTING(CustomElementReactionsStack)
 
   CustomElementReactionsStack()
     : mIsBackupQueueProcessing(false)
   {
   }
 
   // nsWeakPtr is a weak pointer of Element
-  // The element reaction queues are stored in ElementReactionQueueMap.
+  // The element reaction queues are stored in CustomElementData.
   // We need to lookup ElementReactionQueueMap again to get relevant reaction queue.
   // The choice of 1 for the auto size here is based on gut feeling.
   typedef AutoTArray<nsWeakPtr, 1> ElementQueue;
 
   /**
    * Enqueue a custom element upgrade reaction
    * https://html.spec.whatwg.org/multipage/scripting.html#enqueue-a-custom-element-upgrade-reaction
    */
@@ -211,27 +219,16 @@ public:
   // [CEReactions] After executing the algorithm's steps
   // Pop the element queue from the custom element reactions stack,
   // and invoke custom element reactions in that queue.
   void PopAndInvokeElementQueue();
 
 private:
   ~CustomElementReactionsStack() {};
 
-  // There is 1 reaction in reaction queue, when 1) it becomes disconnected,
-  // 2) it’s adopted into a new document, 3) its attributes are changed,
-  // appended, removed, or replaced.
-  // There are 3 reactions in reaction queue when doing upgrade operation,
-  // e.g., create an element, insert a node.
-  typedef AutoTArray<nsAutoPtr<CustomElementReaction>, 3> ReactionQueue;
-  typedef nsClassHashtable<nsISupportsHashKey, ReactionQueue>
-    ElementReactionQueueMap;
-
-  ElementReactionQueueMap mElementReactionQueueMap;
-
   // The choice of 8 for the auto size here is based on gut feeling.
   AutoTArray<ElementQueue, 8> mReactionsStack;
   ElementQueue mBackupQueue;
   // https://html.spec.whatwg.org/#enqueue-an-element-on-the-appropriate-element-queue
   bool mIsBackupQueueProcessing;
 
   void InvokeBackupQueue();
 
--- a/dom/console/Console.cpp
+++ b/dom/console/Console.cpp
@@ -85,19 +85,19 @@ class ConsoleCallData final
 {
 public:
   NS_INLINE_DECL_REFCOUNTING(ConsoleCallData)
 
   ConsoleCallData()
     : mMethodName(Console::MethodLog)
     , mTimeStamp(JS_Now() / PR_USEC_PER_MSEC)
     , mStartTimerValue(0)
-    , mStartTimerStatus(false)
+    , mStartTimerStatus(Console::eTimerUnknown)
     , mStopTimerDuration(0)
-    , mStopTimerStatus(false)
+    , mStopTimerStatus(Console::eTimerUnknown)
     , mCountValue(MAX_PAGE_COUNTERS)
     , mIDType(eUnknown)
     , mOuterIDNumber(0)
     , mInnerIDNumber(0)
     , mStatus(eUnused)
   {}
 
   bool
@@ -212,27 +212,27 @@ public:
   // creation of it. If status is false, something went wrong. User
   // DOMHighResTimeStamp instead mozilla::TimeStamp because we use
   // monotonicTimer from Performance.now();
   // They will be set on the owning thread and never touched again on that
   // thread. They will be used in order to create a ConsoleTimerStart dictionary
   // when console.time() is used.
   DOMHighResTimeStamp mStartTimerValue;
   nsString mStartTimerLabel;
-  bool mStartTimerStatus;
+  Console::TimerStatus mStartTimerStatus;
 
   // These values are set in the owning thread and they contain the duration,
   // the name and the status of the StopTimer method. If status is false,
   // something went wrong. They will be set on the owning thread and never
   // touched again on that thread. They will be used in order to create a
   // ConsoleTimerEnd dictionary. This members are set when
   // console.timeEnd() is called.
   double mStopTimerDuration;
   nsString mStopTimerLabel;
-  bool mStopTimerStatus;
+  Console::TimerStatus mStopTimerStatus;
 
   // These 2 values are set by IncreaseCounter on the owning thread and they are
   // used CreateCounterValue. These members are set when console.count() is
   // called.
   nsString mCountLabel;
   uint32_t mCountValue;
 
   // The concept of outerID and innerID is misleading because when a
@@ -1995,135 +1995,172 @@ Console::UnstoreGroupName(nsAString& aNa
   }
 
   uint32_t pos = mGroupStack.Length() - 1;
   aName = mGroupStack[pos];
   mGroupStack.RemoveElementAt(pos);
   return true;
 }
 
-bool
+Console::TimerStatus
 Console::StartTimer(JSContext* aCx, const JS::Value& aName,
                     DOMHighResTimeStamp aTimestamp,
                     nsAString& aTimerLabel,
                     DOMHighResTimeStamp* aTimerValue)
 {
   AssertIsOnOwningThread();
   MOZ_ASSERT(aTimerValue);
 
   *aTimerValue = 0;
 
   if (NS_WARN_IF(mTimerRegistry.Count() >= MAX_PAGE_TIMERS)) {
-    return false;
+    return eTimerMaxReached;
   }
 
   JS::Rooted<JS::Value> name(aCx, aName);
   JS::Rooted<JSString*> jsString(aCx, JS::ToString(aCx, name));
   if (NS_WARN_IF(!jsString)) {
-    return false;
+    return eTimerJSException;
   }
 
   nsAutoJSString label;
   if (NS_WARN_IF(!label.init(aCx, jsString))) {
-    return false;
-  }
-
-  DOMHighResTimeStamp entry = 0;
-  if (!mTimerRegistry.Get(label, &entry)) {
-    mTimerRegistry.Put(label, aTimestamp);
-  } else {
-    aTimestamp = entry;
+    return eTimerJSException;
   }
 
   aTimerLabel = label;
+
+  DOMHighResTimeStamp entry = 0;
+  if (mTimerRegistry.Get(label, &entry)) {
+    return eTimerAlreadyExists;
+  }
+
+  mTimerRegistry.Put(label, aTimestamp);
+
   *aTimerValue = aTimestamp;
-  return true;
+  return eTimerDone;
 }
 
 JS::Value
 Console::CreateStartTimerValue(JSContext* aCx, const nsAString& aTimerLabel,
-                               bool aTimerStatus) const
+                               TimerStatus aTimerStatus) const
 {
-  if (!aTimerStatus) {
-    RootedDictionary<ConsoleTimerError> error(aCx);
-
-    JS::Rooted<JS::Value> value(aCx);
-    if (!ToJSValue(aCx, error, &value)) {
-      return JS::UndefinedValue();
-    }
-
-    return value;
+  MOZ_ASSERT(aTimerStatus != eTimerUnknown);
+
+  if (aTimerStatus != eTimerDone) {
+    return CreateTimerError(aCx, aTimerLabel, aTimerStatus);
   }
 
   RootedDictionary<ConsoleTimerStart> timer(aCx);
 
   timer.mName = aTimerLabel;
 
   JS::Rooted<JS::Value> value(aCx);
   if (!ToJSValue(aCx, timer, &value)) {
     return JS::UndefinedValue();
   }
 
   return value;
 }
 
-bool
+Console::TimerStatus
 Console::StopTimer(JSContext* aCx, const JS::Value& aName,
                    DOMHighResTimeStamp aTimestamp,
                    nsAString& aTimerLabel,
                    double* aTimerDuration)
 {
   AssertIsOnOwningThread();
   MOZ_ASSERT(aTimerDuration);
 
   *aTimerDuration = 0;
 
   JS::Rooted<JS::Value> name(aCx, aName);
   JS::Rooted<JSString*> jsString(aCx, JS::ToString(aCx, name));
   if (NS_WARN_IF(!jsString)) {
-    return false;
+    return eTimerJSException;
   }
 
   nsAutoJSString key;
   if (NS_WARN_IF(!key.init(aCx, jsString))) {
-    return false;
+    return eTimerJSException;
   }
 
+  aTimerLabel = key;
+
   DOMHighResTimeStamp entry = 0;
   if (NS_WARN_IF(!mTimerRegistry.Get(key, &entry))) {
-    return false;
+    return eTimerDoesntExist;
   }
 
   mTimerRegistry.Remove(key);
 
-  aTimerLabel = key;
   *aTimerDuration = aTimestamp - entry;
-  return true;
+  return eTimerDone;
 }
 
 JS::Value
 Console::CreateStopTimerValue(JSContext* aCx, const nsAString& aLabel,
-                              double aDuration, bool aStatus) const
+                              double aDuration, TimerStatus aStatus) const
 {
-  if (!aStatus) {
-    return JS::UndefinedValue();
+  if (aStatus != eTimerDone) {
+    return CreateTimerError(aCx, aLabel, aStatus);
   }
 
   RootedDictionary<ConsoleTimerEnd> timer(aCx);
   timer.mName = aLabel;
   timer.mDuration = aDuration;
 
   JS::Rooted<JS::Value> value(aCx);
   if (!ToJSValue(aCx, timer, &value)) {
     return JS::UndefinedValue();
   }
 
   return value;
 }
 
+JS::Value
+Console::CreateTimerError(JSContext* aCx, const nsAString& aLabel,
+                          TimerStatus aStatus) const
+{
+  MOZ_ASSERT(aStatus != eTimerUnknown && aStatus != eTimerDone);
+
+  RootedDictionary<ConsoleTimerError> error(aCx);
+
+  error.mName = aLabel;
+
+  switch (aStatus) {
+  case eTimerAlreadyExists:
+    error.mError.AssignLiteral("timerAlreadyExists");
+    break;
+
+  case eTimerDoesntExist:
+    error.mError.AssignLiteral("timerDoesntExist");
+    break;
+
+  case eTimerJSException:
+    error.mError.AssignLiteral("timerJSError");
+    break;
+
+  case eTimerMaxReached:
+    error.mError.AssignLiteral("maxTimersExceeded");
+    break;
+
+  default:
+    MOZ_CRASH("Unsupported status");
+    break;
+  }
+
+  JS::Rooted<JS::Value> value(aCx);
+  if (!ToJSValue(aCx, error, &value)) {
+    return JS::UndefinedValue();
+  }
+
+  return value;
+}
+
 bool
 Console::ArgumentsToValueList(const Sequence<JS::Value>& aData,
                               Sequence<JS::Value>& aSequence) const
 {
   for (uint32_t i = 0; i < aData.Length(); ++i) {
     if (NS_WARN_IF(!aSequence.AppendElement(aData[i], fallible))) {
       return false;
     }
--- a/dom/console/Console.h
+++ b/dom/console/Console.h
@@ -24,16 +24,17 @@ class nsIPrincipal;
 namespace mozilla {
 namespace dom {
 
 class AnyCallback;
 class ConsoleCallData;
 class ConsoleRunnable;
 class ConsoleCallDataRunnable;
 class ConsoleProfileRunnable;
+struct ConsoleTimerError;
 struct ConsoleStackEntry;
 
 class Console final : public nsIObserver
                     , public nsSupportsWeakReference
 {
 public:
   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
   NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(Console, nsIObserver)
@@ -254,72 +255,83 @@ private:
   ComposeAndStoreGroupName(JSContext* aCx, const Sequence<JS::Value>& aData,
                            nsAString& aName);
 
   // Remove the last group name and return that name. It returns false if
   // mGroupStack is empty.
   bool
   UnstoreGroupName(nsAString& aName);
 
+  enum TimerStatus {
+    eTimerUnknown,
+    eTimerDone,
+    eTimerAlreadyExists,
+    eTimerDoesntExist,
+    eTimerJSException,
+    eTimerMaxReached,
+  };
+
+  JS::Value
+  CreateTimerError(JSContext* aCx, const nsAString& aTimerLabel,
+                   TimerStatus aStatus) const;
+
   // StartTimer is called on the owning thread and populates aTimerLabel and
-  // aTimerValue. It returns false if a JS exception is thrown or if
-  // the max number of timers is reached.
+  // aTimerValue.
   // * aCx - the JSContext rooting aName.
   // * aName - this is (should be) the name of the timer as JS::Value.
   // * aTimestamp - the monotonicTimer for this context taken from
   //                performance.now().
   // * aTimerLabel - This label will be populated with the aName converted to a
   //                 string.
   // * aTimerValue - the StartTimer value stored into (or taken from)
   //                 mTimerRegistry.
-  bool
+  TimerStatus
   StartTimer(JSContext* aCx, const JS::Value& aName,
              DOMHighResTimeStamp aTimestamp,
              nsAString& aTimerLabel,
              DOMHighResTimeStamp* aTimerValue);
 
   // CreateStartTimerValue generates a ConsoleTimerStart dictionary exposed as
   // JS::Value. If aTimerStatus is false, it generates a ConsoleTimerError
   // instead. It's called only after the execution StartTimer on the owning
   // thread.
   // * aCx - this is the context that will root the returned value.
   // * aTimerLabel - this label must be what StartTimer received as aTimerLabel.
   // * aTimerStatus - the return value of StartTimer.
   JS::Value
   CreateStartTimerValue(JSContext* aCx, const nsAString& aTimerLabel,
-                        bool aTimerStatus) const;
+                        TimerStatus aTimerStatus) const;
 
   // StopTimer follows the same pattern as StartTimer: it runs on the
   // owning thread and populates aTimerLabel and aTimerDuration, used by
-  // CreateStopTimerValue. It returns false if a JS exception is thrown or if
-  // the aName timer doesn't exist in the mTimerRegistry.
+  // CreateStopTimerValue.
   // * aCx - the JSContext rooting aName.
   // * aName - this is (should be) the name of the timer as JS::Value.
   // * aTimestamp - the monotonicTimer for this context taken from
   //                performance.now().
   // * aTimerLabel - This label will be populated with the aName converted to a
   //                 string.
   // * aTimerDuration - the difference between aTimestamp and when the timer
   //                    started (see StartTimer).
-  bool
+  TimerStatus
   StopTimer(JSContext* aCx, const JS::Value& aName,
             DOMHighResTimeStamp aTimestamp,
             nsAString& aTimerLabel,
             double* aTimerDuration);
 
   // This method generates a ConsoleTimerEnd dictionary exposed as JS::Value, or
   // a ConsoleTimerError dictionary if aTimerStatus is false. See StopTimer.
   // * aCx - this is the context that will root the returned value.
   // * aTimerLabel - this label must be what StopTimer received as aTimerLabel.
   // * aTimerDuration - this is what StopTimer received as aTimerDuration
   // * aTimerStatus - the return value of StopTimer.
   JS::Value
   CreateStopTimerValue(JSContext* aCx, const nsAString& aTimerLabel,
                        double aTimerDuration,
-                       bool aTimerStatus) const;
+                       TimerStatus aTimerStatus) const;
 
   // The method populates a Sequence from an array of JS::Value.
   bool
   ArgumentsToValueList(const Sequence<JS::Value>& aData,
                        Sequence<JS::Value>& aSequence) const;
 
   // This method follows the same pattern as StartTimer: its runs on the owning
   // thread and populate aCountLabel, used by CreateCounterValue. Returns
--- a/dom/ipc/ContentChild.cpp
+++ b/dom/ipc/ContentChild.cpp
@@ -1187,16 +1187,30 @@ ContentChild::RecvReinitRendering(Endpoi
       tabChild->ReinitRendering();
     }
   }
 
   VideoDecoderManagerChild::InitForContent(Move(aVideoManager));
   return IPC_OK();
 }
 
+mozilla::ipc::IPCResult
+ContentChild::RecvReinitRenderingForDeviceReset()
+{
+  gfxPlatform::GetPlatform()->CompositorUpdated();
+
+  nsTArray<RefPtr<TabChild>> tabs = TabChild::GetAll();
+  for (const auto& tabChild : tabs) {
+    if (tabChild->LayersId()) {
+      tabChild->ReinitRenderingForDeviceReset();
+    }
+  }
+  return IPC_OK();
+}
+
 #if defined(XP_MACOSX) && defined(MOZ_CONTENT_SANDBOX)
 
 #include <stdlib.h>
 
 static bool
 GetAppPaths(nsCString &aAppPath, nsCString &aAppBinaryPath, nsCString &aAppDir)
 {
   nsAutoCString appPath;
--- a/dom/ipc/ContentChild.h
+++ b/dom/ipc/ContentChild.h
@@ -164,16 +164,18 @@ public:
   mozilla::ipc::IPCResult
   RecvReinitRendering(
     Endpoint<PCompositorBridgeChild>&& aCompositor,
     Endpoint<PImageBridgeChild>&& aImageBridge,
     Endpoint<PVRManagerChild>&& aVRBridge,
     Endpoint<PVideoDecoderManagerChild>&& aVideoManager,
     nsTArray<uint32_t>&& namespaces) override;
 
+  mozilla::ipc::IPCResult RecvReinitRenderingForDeviceReset() override;
+
   virtual mozilla::ipc::IPCResult RecvSetProcessSandbox(const MaybeFileDesc& aBroker) override;
 
   virtual PBrowserChild* AllocPBrowserChild(const TabId& aTabId,
                                             const TabId& aSameTabGroupAs,
                                             const IPCTabContext& aContext,
                                             const uint32_t& aChromeFlags,
                                             const ContentParentId& aCpID,
                                             const bool& aIsForBrowser) override;
--- a/dom/ipc/ContentParent.cpp
+++ b/dom/ipc/ContentParent.cpp
@@ -2475,16 +2475,22 @@ ContentParent::OnCompositorUnexpectedShu
     Move(compositor),
     Move(imageBridge),
     Move(vrBridge),
     Move(videoManager),
     Move(namespaces));
 }
 
 void
+ContentParent::OnCompositorDeviceReset()
+{
+  Unused << SendReinitRenderingForDeviceReset();
+}
+
+void
 ContentParent::OnVarChanged(const GfxVarUpdate& aVar)
 {
   if (!mIPCOpen) {
     return;
   }
   Unused << SendVarUpdate(aVar);
 }
 
--- a/dom/ipc/ContentParent.h
+++ b/dom/ipc/ContentParent.h
@@ -655,16 +655,18 @@ public:
   // This function is called when we are about to load a document from an
   // HTTP(S), FTP or wyciwyg channel for a content process.  It is a useful
   // place to start to kick off work as early as possible in response to such
   // document loads.
   nsresult AboutToLoadHttpFtpWyciwygDocumentForChild(nsIChannel* aChannel);
 
   nsresult TransmitPermissionsForPrincipal(nsIPrincipal* aPrincipal);
 
+  void OnCompositorDeviceReset() override;
+
 protected:
   void OnChannelConnected(int32_t pid) override;
 
   virtual void ActorDestroy(ActorDestroyReason why) override;
 
   bool ShouldContinueFromReplyTimeout() override;
 
   void OnVarChanged(const GfxVarUpdate& aVar) override;
--- a/dom/ipc/PContent.ipdl
+++ b/dom/ipc/PContent.ipdl
@@ -368,16 +368,19 @@ child:
     // newly launched GPU process, or the compositor thread of the UI process.
     async ReinitRendering(
       Endpoint<PCompositorBridgeChild> compositor,
       Endpoint<PImageBridgeChild> bridge,
       Endpoint<PVRManagerChild> vr,
       Endpoint<PVideoDecoderManagerChild> video,
       uint32_t[] namespaces);
 
+    // Re-create the rendering stack for a device reset.
+    async ReinitRenderingForDeviceReset();
+
     /**
      * Enable system-level sandboxing features, if available.  Can
      * usually only be performed zero or one times.  The child may
      * abnormally exit if this fails; the details are OS-specific.
      */
     async SetProcessSandbox(MaybeFileDesc aBroker);
 
     async RequestMemoryReport(uint32_t generation,
--- a/dom/ipc/TabChild.cpp
+++ b/dom/ipc/TabChild.cpp
@@ -3113,23 +3113,49 @@ TabChild::ReinitRendering()
       return;
     }
 
     RefPtr<LayerManager> lm = mPuppetWidget->RecreateLayerManager(shadowManager);
     ShadowLayerForwarder* lf = lm->AsShadowForwarder();
     lf->IdentifyTextureHost(mTextureFactoryIdentifier);
   }
 
+  ImageBridgeChild::IdentifyCompositorTextureHost(mTextureFactoryIdentifier);
+  gfx::VRManagerChild::IdentifyTextureHost(mTextureFactoryIdentifier);
+
   InitAPZState();
 
   nsCOMPtr<nsIDocument> doc(GetDocument());
   doc->NotifyLayerManagerRecreated();
 }
 
 void
+TabChild::ReinitRenderingForDeviceReset()
+{
+  InvalidateLayers();
+
+  RefPtr<LayerManager> lm = mPuppetWidget->GetLayerManager();
+  ClientLayerManager* clm = lm->AsClientLayerManager();
+  if (!clm) {
+    return;
+  }
+
+  if (ShadowLayerForwarder* fwd = clm->AsShadowForwarder()) {
+    // Force the LayerTransactionChild to synchronously shutdown. It is
+    // okay to do this early, we'll simply stop sending messages. This
+    // step is necessary since otherwise the compositor will think we
+    // are trying to attach two layer trees to the same ID.
+    fwd->SynchronouslyShutdown();
+  }
+
+  // Proceed with destroying and recreating the layer manager.
+  ReinitRendering();
+}
+
+void
 TabChild::CompositorUpdated(const TextureFactoryIdentifier& aNewIdentifier,
                             uint64_t aDeviceResetSeqNo)
 {
   MOZ_ASSERT(mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT
              || mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR);
 
   RefPtr<LayerManager> lm = mPuppetWidget->GetLayerManager();
 
--- a/dom/ipc/TabChild.h
+++ b/dom/ipc/TabChild.h
@@ -563,16 +563,17 @@ public:
                     const TimeStamp& aCompositeEnd);
 
   void DidRequestComposite(const TimeStamp& aCompositeReqStart,
                            const TimeStamp& aCompositeReqEnd);
 
   void ClearCachedResources();
   void InvalidateLayers();
   void ReinitRendering();
+  void ReinitRenderingForDeviceReset();
   void CompositorUpdated(const TextureFactoryIdentifier& aNewIdentifier,
                          uint64_t aDeviceResetSeqNo);
 
   static inline TabChild* GetFrom(nsIDOMWindow* aWindow)
   {
     nsCOMPtr<nsIWebNavigation> webNav = do_GetInterface(aWindow);
     nsCOMPtr<nsIDocShell> docShell = do_QueryInterface(webNav);
     return GetFrom(docShell);
--- a/dom/plugins/base/nsPluginHost.cpp
+++ b/dom/plugins/base/nsPluginHost.cpp
@@ -3846,30 +3846,29 @@ nsPluginHost::CanUsePluginForMIMEType(co
   }
 
   return false;
 }
 
 // Runnable that does an async destroy of a plugin.
 
 class nsPluginDestroyRunnable : public Runnable,
-                                public PRCList
+                                public mozilla::LinkedListElement<nsPluginDestroyRunnable>
 {
 public:
   explicit nsPluginDestroyRunnable(nsNPAPIPluginInstance *aInstance)
     : Runnable("nsPluginDestroyRunnable"),
       mInstance(aInstance)
   {
-    PR_INIT_CLIST(this);
-    PR_APPEND_LINK(this, &sRunnableListHead);
+    sRunnableList.insertBack(this);
   }
 
   ~nsPluginDestroyRunnable() override
   {
-    PR_REMOVE_LINK(this);
+    this->remove();
   }
 
   NS_IMETHOD Run() override
   {
     RefPtr<nsNPAPIPluginInstance> instance;
 
     // Null out mInstance to make sure this code in another runnable
     // will do the right thing even if someone was holding on to this
@@ -3877,26 +3876,22 @@ public:
     instance.swap(mInstance);
 
     if (PluginDestructionGuard::DelayDestroy(instance)) {
       // It's still not safe to destroy the plugin, it's now up to the
       // outermost guard on the stack to take care of the destruction.
       return NS_OK;
     }
 
-    nsPluginDestroyRunnable *r =
-      static_cast<nsPluginDestroyRunnable*>(PR_NEXT_LINK(&sRunnableListHead));
-
-    while (r != &sRunnableListHead) {
+    for (auto r : sRunnableList) {
       if (r != this && r->mInstance == instance) {
         // There's another runnable scheduled to tear down
         // instance. Let it do the job.
         return NS_OK;
       }
-      r = static_cast<nsPluginDestroyRunnable*>(PR_NEXT_LINK(r));
     }
 
     PLUGIN_LOG(PLUGIN_LOG_NORMAL,
                ("Doing delayed destroy of instance %p\n", instance.get()));
 
     RefPtr<nsPluginHost> host = nsPluginHost::GetInst();
     if (host)
       host->StopPluginInstance(instance);
@@ -3905,24 +3900,22 @@ public:
                ("Done with delayed destroy of instance %p\n", instance.get()));
 
     return NS_OK;
   }
 
 protected:
   RefPtr<nsNPAPIPluginInstance> mInstance;
 
-  static PRCList sRunnableListHead;
+  static mozilla::LinkedList<nsPluginDestroyRunnable> sRunnableList;
 };
 
-PRCList nsPluginDestroyRunnable::sRunnableListHead =
-  PR_INIT_STATIC_CLIST(&nsPluginDestroyRunnable::sRunnableListHead);
-
-PRCList PluginDestructionGuard::sListHead =
-  PR_INIT_STATIC_CLIST(&PluginDestructionGuard::sListHead);
+mozilla::LinkedList<nsPluginDestroyRunnable> nsPluginDestroyRunnable::sRunnableList;
+
+mozilla::LinkedList<PluginDestructionGuard> PluginDestructionGuard::sList;
 
 PluginDestructionGuard::PluginDestructionGuard(nsNPAPIPluginInstance *aInstance)
   : mInstance(aInstance)
 {
   Init();
 }
 
 PluginDestructionGuard::PluginDestructionGuard(PluginAsyncSurrogate *aSurrogate)
@@ -3936,17 +3929,17 @@ PluginDestructionGuard::PluginDestructio
 {
   Init();
 }
 
 PluginDestructionGuard::~PluginDestructionGuard()
 {
   NS_ASSERTION(NS_IsMainThread(), "Should be on the main thread");
 
-  PR_REMOVE_LINK(this);
+  this->remove();
 
   if (mDelayedDestroy) {
     // We've attempted to destroy the plugin instance we're holding on
     // to while we were guarding it. Do the actual destroy now, off of
     // a runnable.
     RefPtr<nsPluginDestroyRunnable> evt =
       new nsPluginDestroyRunnable(mInstance);
 
@@ -3959,22 +3952,18 @@ bool
 PluginDestructionGuard::DelayDestroy(nsNPAPIPluginInstance *aInstance)
 {
   NS_ASSERTION(NS_IsMainThread(), "Should be on the main thread");
   NS_ASSERTION(aInstance, "Uh, I need an instance!");
 
   // Find the first guard on the stack and make it do a delayed
   // destroy upon destruction.
 
-  PluginDestructionGuard *g =
-    static_cast<PluginDestructionGuard*>(PR_LIST_HEAD(&sListHead));
-
-  while (g != &sListHead) {
+  for (auto g : sList) {
     if (g->mInstance == aInstance) {
       g->mDelayedDestroy = true;
 
       return true;
     }
-    g = static_cast<PluginDestructionGuard*>(PR_NEXT_LINK(g));
   }
 
   return false;
 }
--- a/dom/plugins/base/nsPluginHost.h
+++ b/dom/plugins/base/nsPluginHost.h
@@ -1,21 +1,22 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* 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/. */
 
 #ifndef nsPluginHost_h_
 #define nsPluginHost_h_
 
+#include "mozilla/LinkedList.h"
+
 #include "nsIPluginHost.h"
 #include "nsIObserver.h"
 #include "nsCOMPtr.h"
 #include "prlink.h"
-#include "prclist.h"
 #include "nsIPluginTag.h"
 #include "nsPluginsDir.h"
 #include "nsPluginDirServiceProvider.h"
 #include "nsWeakPtr.h"
 #include "nsIPrompt.h"
 #include "nsWeakReference.h"
 #include "MainThreadUtils.h"
 #include "nsTArray.h"
@@ -409,17 +410,17 @@ private:
 
   static nsIFile *sPluginTempDir;
 
   // We need to hold a global ptr to ourselves because we register for
   // two different CIDs for some reason...
   static nsPluginHost* sInst;
 };
 
-class PluginDestructionGuard : protected PRCList
+class PluginDestructionGuard : public mozilla::LinkedListElement<PluginDestructionGuard>
 {
 public:
   explicit PluginDestructionGuard(nsNPAPIPluginInstance *aInstance);
   explicit PluginDestructionGuard(mozilla::plugins::PluginAsyncSurrogate *aSurrogate);
   explicit PluginDestructionGuard(NPP npp);
 
   ~PluginDestructionGuard();
 
@@ -427,31 +428,29 @@ public:
 
 protected:
   void Init()
   {
     NS_ASSERTION(NS_IsMainThread(), "Should be on the main thread");
 
     mDelayedDestroy = false;
 
-    PR_INIT_CLIST(this);
-    PR_INSERT_BEFORE(this, &sListHead);
+    sList.insertBack(this);
   }
 
   void InitAsync()
   {
     NS_ASSERTION(NS_IsMainThread(), "Should be on the main thread");
 
     mDelayedDestroy = false;
 
-    PR_INIT_CLIST(this);
-    // Instances with active surrogates must be inserted *after* sListHead so
+    // Instances with active surrogates must be inserted *in front of* sList so
     // that they appear to be at the bottom of the stack
-    PR_INSERT_AFTER(this, &sListHead);
+    sList.insertFront(this);
   }
 
   RefPtr<nsNPAPIPluginInstance> mInstance;
   bool mDelayedDestroy;
 
-  static PRCList sListHead;
+  static mozilla::LinkedList<PluginDestructionGuard> sList;
 };
 
 #endif // nsPluginHost_h_
--- a/dom/plugins/ipc/PluginModuleParent.cpp
+++ b/dom/plugins/ipc/PluginModuleParent.cpp
@@ -25,16 +25,17 @@
 #include "nsAutoPtr.h"
 #include "nsCRT.h"
 #include "nsIFile.h"
 #include "nsIObserverService.h"
 #include "nsIXULRuntime.h"
 #include "nsNPAPIPlugin.h"
 #include "nsPrintfCString.h"
 #include "prsystem.h"
+#include "prclist.h"
 #include "PluginQuirks.h"
 #include "gfxPlatform.h"
 #ifdef MOZ_GECKO_PROFILER
 #include "CrossProcessProfilerController.h"
 #endif
 #include "GeckoProfiler.h"
 #include "nsPluginTags.h"
 #include "nsUnicharUtils.h"
--- a/dom/webidl/Console.webidl
+++ b/dom/webidl/Console.webidl
@@ -94,17 +94,18 @@ dictionary ConsoleTimerStart {
 };
 
 dictionary ConsoleTimerEnd {
   DOMString name = "";
   double duration = 0;
 };
 
 dictionary ConsoleTimerError {
-  DOMString error = "maxTimersExceeded";
+  DOMString error = "";
+  DOMString name = "";
 };
 
 dictionary ConsoleCounter {
   DOMString label = "";
   unsigned long count = 0;
 };
 
 dictionary ConsoleCounterError {
--- a/gfx/gl/GLContextSymbols.h
+++ b/gfx/gl/GLContextSymbols.h
@@ -30,678 +30,425 @@ struct GLContextSymbols
     GLContextSymbols() {
         Zero();
     }
 
     void Zero() {
         memset(this, 0, sizeof(GLContextSymbols));
     }
 
-    typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture);
-    PFNGLACTIVETEXTUREPROC fActiveTexture;
-    typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
-    PFNGLATTACHSHADERPROC fAttachShader;
-    typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id);
-    PFNGLBEGINQUERYPROC fBeginQuery;
-    typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name);
-    PFNGLBINDATTRIBLOCATIONPROC fBindAttribLocation;
-    typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
-    PFNGLBINDBUFFERPROC fBindBuffer;
-    typedef void (GLAPIENTRY * PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
-    PFNGLBINDTEXTUREPROC fBindTexture;
-    typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYPROC) (GLuint array);
-    PFNGLBINDVERTEXARRAYPROC fBindVertexArray;
-    typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-    PFNGLBLENDCOLORPROC fBlendColor;
-    typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode);
-    PFNGLBLENDEQUATIONPROC fBlendEquation;
-    typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum, GLenum);
-    PFNGLBLENDEQUATIONSEPARATEPROC fBlendEquationSeparate;
-    typedef void (GLAPIENTRY * PFNGLBLENDFUNCPROC) (GLenum, GLenum);
-    PFNGLBLENDFUNCPROC fBlendFunc;
-    typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-    PFNGLBLENDFUNCSEPARATEPROC fBlendFuncSeparate;
-    typedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);
-    PFNGLBUFFERDATAPROC fBufferData;
-    typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data);
-    PFNGLBUFFERSUBDATAPROC fBufferSubData;
-    typedef void (GLAPIENTRY * PFNGLCLEARPROC) (GLbitfield);
-    PFNGLCLEARPROC fClear;
-    typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
-    PFNGLCLEARBUFFERFIPROC fClearBufferfi;
-    typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat* value);
-    PFNGLCLEARBUFFERFVPROC fClearBufferfv;
-    typedef void (GLAPIENTRY * PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint* value);
-    PFNGLCLEARBUFFERIVPROC fClearBufferiv;
-    typedef void (GLAPIENTRY * PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint* value);
-    PFNGLCLEARBUFFERUIVPROC fClearBufferuiv;
-    typedef void (GLAPIENTRY * PFNGLCLEARCOLORPROC) (GLfloat, GLfloat, GLfloat, GLfloat);
-    PFNGLCLEARCOLORPROC fClearColor;
-    typedef void (GLAPIENTRY * PFNGLCLEARSTENCILPROC) (GLint);
-    PFNGLCLEARSTENCILPROC fClearStencil;
-    typedef void (GLAPIENTRY * PFNGLCOLORMASKPROC) (realGLboolean red, realGLboolean green, realGLboolean blue, realGLboolean alpha);
-    PFNGLCOLORMASKPROC fColorMask;
-    typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* pixels);
-    PFNGLCOMPRESSEDTEXIMAGE2D fCompressedTexImage2D;
-    typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* pixels);
-    PFNGLCOMPRESSEDTEXSUBIMAGE2D fCompressedTexSubImage2D;
-    typedef void (GLAPIENTRY * PFNGLCULLFACEPROC) (GLenum mode);
-    PFNGLCULLFACEPROC fCullFace;
-    typedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
-    PFNGLDETACHSHADERPROC fDetachShader;
-    typedef void (GLAPIENTRY * PFNGLDEPTHFUNCPROC) (GLenum);
-    PFNGLDEPTHFUNCPROC fDepthFunc;
-    typedef void (GLAPIENTRY * PFNGLDEPTHMASKPROC) (realGLboolean);
-    PFNGLDEPTHMASKPROC fDepthMask;
-    typedef void (GLAPIENTRY * PFNGLDISABLEPROC) (GLenum);
-    PFNGLDISABLEPROC fDisable;
-    typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint);
-    PFNGLDISABLEVERTEXATTRIBARRAYPROC fDisableVertexAttribArray;
-    typedef void (GLAPIENTRY * PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count);
-    PFNGLDRAWARRAYSPROC fDrawArrays;
-    typedef void (GLAPIENTRY * PFNGLDRAWBUFFERPROC) (GLenum mode);
-    PFNGLDRAWBUFFERPROC fDrawBuffer;
-    typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs);
-    PFNGLDRAWBUFFERSPROC fDrawBuffers;
-    typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices);
-    PFNGLDRAWELEMENTSPROC fDrawElements;
-    typedef void (GLAPIENTRY * PFNGLENABLEPROC) (GLenum);
-    PFNGLENABLEPROC fEnable;
-    typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint);
-    PFNGLENABLEVERTEXATTRIBARRAYPROC fEnableVertexAttribArray;
-    typedef void (GLAPIENTRY * PFNGLFINISHPROC) (void);
-    PFNGLFINISHPROC fFinish;
-    typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target);
-    PFNGLENDQUERYPROC fEndQuery;
-    typedef void (GLAPIENTRY * PFNGLFLUSHPROC) (void);
-    PFNGLFLUSHPROC fFlush;
-    typedef void (GLAPIENTRY * PFNGLFRONTFACEPROC) (GLenum);
-    PFNGLFRONTFACEPROC fFrontFace;
-    typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
-    PFNGLGETACTIVEATTRIBPROC fGetActiveAttrib;
-    typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
-    PFNGLGETACTIVEUNIFORMPROC fGetActiveUniform;
-    typedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders);
-    PFNGLGETATTACHEDSHADERSPROC fGetAttachedShaders;
-    typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name);
-    PFNGLGETATTRIBLOCATIONPROC fGetAttribLocation;
-    typedef void (GLAPIENTRY * PFNGLGETINTEGERVPROC) (GLenum pname, GLint* params);
-    PFNGLGETINTEGERVPROC fGetIntegerv;
-    typedef void (GLAPIENTRY * PFNGLGETFLOATVPROC) (GLenum pname, GLfloat* params);
-    PFNGLGETFLOATVPROC fGetFloatv;
-    typedef void (GLAPIENTRY * PFNGLGETBOOLEANBPROC) (GLenum pname, realGLboolean* params);
-    PFNGLGETBOOLEANBPROC fGetBooleanv;
-    typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params);
-    PFNGLGETBUFFERPARAMETERIVPROC fGetBufferParameteriv;
-    typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPPROC) (GLenum target);
-    PFNGLGENERATEMIPMAPPROC fGenerateMipmap;
-    typedef GLenum (GLAPIENTRY * PFNGLGETERRORPROC) (void);
-    PFNGLGETERRORPROC fGetError;
-    typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param);
-    PFNGLGETPROGRAMIVPROC fGetProgramiv;
-    typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog);
-    PFNGLGETPROGRAMINFOLOGPROC fGetProgramInfoLog;
-    typedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params);
-    PFNGLGETQUERYIVPROC fGetQueryiv;
-    typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params);
-    PFNGLGETQUERYOBJECTIVPROC fGetQueryObjectiv;
-    typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params);
-    PFNGLGETQUERYOBJECTUIVPROC fGetQueryObjectuiv;
-    typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64* params);
-    PFNGLGETQUERYOBJECTI64VPROC fGetQueryObjecti64v;
-    typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64* params);
-    PFNGLGETQUERYOBJECTUI64VPROC fGetQueryObjectui64v;
-    typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target);
-    PFNGLQUERYCOUNTERPROC fQueryCounter;
-    typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
-    PFNGLTEXPARAMETERIPROC fTexParameteri;
-    typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint* param);
-    PFNGLTEXPARAMETERIVPROC fTexParameteriv;
-    typedef void (GLAPIENTRY * PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param);
-    PFNGLTEXPARAMETERFPROC fTexParameterf;
-    typedef GLubyte* (GLAPIENTRY * PFNGLGETSTRINGPROC) (GLenum);
-    PFNGLGETSTRINGPROC fGetString;
-    typedef void (GLAPIENTRY * PFNGLGETTEXIMAGEPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLvoid* image);
-    PFNGLGETTEXIMAGEPROC fGetTexImage;
-    typedef void (GLAPIENTRY * PFNGLGETTEXLEVELPARAMETERIVPROC) (GLenum target, GLint level, GLenum pname, GLint* params);
-    PFNGLGETTEXLEVELPARAMETERIVPROC fGetTexLevelParameteriv;
-    typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat* params);
-    PFNGLGETTEXPARAMETERFVPROC fGetTexParameterfv;
-    typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params);
-    PFNGLGETTEXPARAMETERIVPROC fGetTexParameteriv;
-    typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params);
-    PFNGLGETUNIFORMFVPROC fGetUniformfv;
-    typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params);
-    PFNGLGETUNIFORMIVPROC fGetUniformiv;
-    typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint* params);
-    PFNGLGETUNIFORMUIVPROC fGetUniformuiv;
-    typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLint programObj, const GLchar* name);
-    PFNGLGETUNIFORMLOCATIONPROC fGetUniformLocation;
-    typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint, GLenum, GLfloat*);
-    PFNGLGETVERTEXATTRIBFVPROC fGetVertexAttribfv;
-    typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint, GLenum, GLint*);
-    PFNGLGETVERTEXATTRIBIVPROC fGetVertexAttribiv;
-    typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint, GLenum, GLvoid**);
-    PFNGLGETVERTEXATTRIBPOINTERVPROC fGetVertexAttribPointerv;
-    typedef void (GLAPIENTRY * PFNGLHINTPROC) (GLenum target, GLenum mode);
-    PFNGLHINTPROC fHint;
-    typedef realGLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer);
-    PFNGLISBUFFERPROC fIsBuffer;
-    typedef realGLboolean (GLAPIENTRY * PFNGLISENABLEDPROC) (GLenum cap);
-    PFNGLISENABLEDPROC fIsEnabled;
-    typedef realGLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program);
-    PFNGLISPROGRAMPROC fIsProgram;
-    typedef realGLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id);
-    PFNGLISQUERYPROC fIsQuery;
-    typedef realGLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader);
-    PFNGLISSHADERPROC fIsShader;
-    typedef realGLboolean (GLAPIENTRY * PFNGLISTEXTUREPROC) (GLuint texture);
-    PFNGLISTEXTUREPROC fIsTexture;
-    typedef void (GLAPIENTRY * PFNGLLINEWIDTHPROC) (GLfloat width);
-    PFNGLLINEWIDTHPROC fLineWidth;
-    typedef void (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program);
-    PFNGLLINKPROGRAMPROC fLinkProgram;
-    typedef void (GLAPIENTRY * PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param);
-    PFNGLPIXELSTOREIPROC fPixelStorei;
-    typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param);
-    PFNGLPOINTPARAMETERFPROC fPointParameterf;
-    typedef void (GLAPIENTRY * PFNGLPOLYGONMODEPROC) (GLenum face, GLenum mode);
-    PFNGLPOLYGONMODEPROC fPolygonMode;
-    typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat bias);
-    PFNGLPOLYGONOFFSETPROC fPolygonOffset;
-    typedef void (GLAPIENTRY * PFNGLREADBUFFERPROC) (GLenum);
-    PFNGLREADBUFFERPROC fReadBuffer;
-    typedef void (GLAPIENTRY * PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels);
-    PFNGLREADPIXELSPROC fReadPixels;
-    typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, realGLboolean invert);
-    PFNGLSAMPLECOVERAGEPROC fSampleCoverage;
-    typedef void (GLAPIENTRY * PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask);
-    PFNGLSTENCILFUNCPROC fStencilFunc;
-    typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
-    PFNGLSTENCILFUNCSEPARATEPROC fStencilFuncSeparate;
-    typedef void (GLAPIENTRY * PFNGLSTENCILMASKPROC) (GLuint mask);
-    PFNGLSTENCILMASKPROC fStencilMask;
-    typedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum, GLuint);
-    PFNGLSTENCILMASKSEPARATEPROC fStencilMaskSeparate;
-    typedef void (GLAPIENTRY * PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass);
-    PFNGLSTENCILOPPROC fStencilOp;
-    typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
-    PFNGLSTENCILOPSEPARATEPROC fStencilOpSeparate;
-    typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels);
-    PFNGLTEXIMAGE2DPROC fTexImage2D;
-    typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
-    PFNGLTEXSUBIMAGE2DPROC fTexSubImage2D;
-    typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, GLvoid* pointer);
-    PFNGLTEXTURERANGEAPPLEPROC fTextureRangeAPPLE;
-    typedef void (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0);
-    PFNGLUNIFORM1FPROC fUniform1f;
-    typedef void (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value);
-    PFNGLUNIFORM1FVPROC fUniform1fv;
-    typedef void (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
-    PFNGLUNIFORM1IPROC fUniform1i;
-    typedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value);
-    PFNGLUNIFORM1IVPROC fUniform1iv;
-    typedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);
-    PFNGLUNIFORM2FPROC fUniform2f;
-    typedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value);
-    PFNGLUNIFORM2FVPROC fUniform2fv;
-    typedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);
-    PFNGLUNIFORM2IPROC fUniform2i;
-    typedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value);
-    PFNGLUNIFORM2IVPROC fUniform2iv;
-    typedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-    PFNGLUNIFORM3FPROC fUniform3f;
-    typedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value);
-    PFNGLUNIFORM3FVPROC fUniform3fv;
-    typedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);
-    PFNGLUNIFORM3IPROC fUniform3i;
-    typedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value);
-    PFNGLUNIFORM3IVPROC fUniform3iv;
-    typedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-    PFNGLUNIFORM4FPROC fUniform4f;
-    typedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value);
-    PFNGLUNIFORM4FVPROC fUniform4fv;
-    typedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-    PFNGLUNIFORM4IPROC fUniform4i;
-    typedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value);
-    PFNGLUNIFORM4IVPROC fUniform4iv;
-    typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, realGLboolean transpose, const GLfloat* value);
-    PFNGLUNIFORMMATRIX2FVPROC fUniformMatrix2fv;
-    typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, realGLboolean transpose, const GLfloat* value);
-    PFNGLUNIFORMMATRIX2X3FVPROC fUniformMatrix2x3fv;
-    typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, realGLboolean transpose, const GLfloat* value);
-    PFNGLUNIFORMMATRIX2X4FVPROC fUniformMatrix2x4fv;
-    typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, realGLboolean transpose, const GLfloat* value);
-    PFNGLUNIFORMMATRIX3FVPROC fUniformMatrix3fv;
-    typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, realGLboolean transpose, const GLfloat* value);
-    PFNGLUNIFORMMATRIX3X2FVPROC fUniformMatrix3x2fv;
-    typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, realGLboolean transpose, const GLfloat* value);
-    PFNGLUNIFORMMATRIX3X4FVPROC fUniformMatrix3x4fv;
-    typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, realGLboolean transpose, const GLfloat* value);
-    PFNGLUNIFORMMATRIX4FVPROC fUniformMatrix4fv;
-    typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, realGLboolean transpose, const GLfloat* value);
-    PFNGLUNIFORMMATRIX4X2FVPROC fUniformMatrix4x2fv;
-    typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, realGLboolean transpose, const GLfloat* value);
-    PFNGLUNIFORMMATRIX4X3FVPROC fUniformMatrix4x3fv;
+    void (GLAPIENTRY * fActiveTexture)(GLenum);
+    void (GLAPIENTRY * fAttachShader)(GLuint, GLuint);
+    void (GLAPIENTRY * fBeginQuery)(GLenum, GLuint);
+    void (GLAPIENTRY * fBindAttribLocation)(GLuint, GLuint, const GLchar*);
+    void (GLAPIENTRY * fBindBuffer)(GLenum, GLuint);
+    void (GLAPIENTRY * fBindTexture)(GLenum, GLuint);
+    void (GLAPIENTRY * fBindVertexArray)(GLuint);
+    void (GLAPIENTRY * fBlendColor)(GLfloat, GLfloat, GLfloat, GLfloat);
+    void (GLAPIENTRY * fBlendEquation)(GLenum);
+    void (GLAPIENTRY * fBlendEquationSeparate)(GLenum, GLenum);
+    void (GLAPIENTRY * fBlendFunc)(GLenum, GLenum);
+    void (GLAPIENTRY * fBlendFuncSeparate)(GLenum, GLenum, GLenum, GLenum);
+    void (GLAPIENTRY * fBufferData)(GLenum, GLsizeiptr, const GLvoid*, GLenum);
+    void (GLAPIENTRY * fBufferSubData)(GLenum, GLintptr, GLsizeiptr, const GLvoid*);
 
-    typedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program);
-    PFNGLUSEPROGRAMPROC fUseProgram;
-    typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program);
-    PFNGLVALIDATEPROGRAMPROC fValidateProgram;
-    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, realGLboolean normalized, GLsizei stride, const GLvoid* pointer);
-    PFNGLVERTEXATTRIBPOINTERPROC fVertexAttribPointer;
-    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);
-    PFNGLVERTEXATTRIB1FPROC fVertexAttrib1f;
-    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);
-    PFNGLVERTEXATTRIB2FPROC fVertexAttrib2f;
-    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
-    PFNGLVERTEXATTRIB3FPROC fVertexAttrib3f;
-    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-    PFNGLVERTEXATTRIB4FPROC fVertexAttrib4f;
-    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v);
-    PFNGLVERTEXATTRIB1FVPROC fVertexAttrib1fv;
-    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v);
-    PFNGLVERTEXATTRIB2FVPROC fVertexAttrib2fv;
-    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v);
-    PFNGLVERTEXATTRIB3FVPROC fVertexAttrib3fv;
-    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v);
-    PFNGLVERTEXATTRIB4FVPROC fVertexAttrib4fv;
-    typedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader);
-    PFNGLCOMPILESHADERPROC fCompileShader;
-    typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
-    PFNGLCOPYTEXIMAGE2DPROC fCopyTexImage2D;
-    typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-    PFNGLCOPYTEXSUBIMAGE2DPROC fCopyTexSubImage2D;
-    typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param);
-    PFNGLGETSHADERIVPROC fGetShaderiv;
-    typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog);
-    PFNGLGETSHADERINFOLOGPROC fGetShaderInfoLog;
-    typedef void (GLAPIENTRY * PFNGETSHADERPRECISIONFORMAT) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
-    PFNGETSHADERPRECISIONFORMAT fGetShaderPrecisionFormat;
-    typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLint obj, GLsizei maxLength, GLsizei* length, GLchar* source);
-    PFNGLGETSHADERSOURCEPROC fGetShaderSource;
-    typedef void (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* const* strings, const GLint* lengths);
-    PFNGLSHADERSOURCEPROC fShaderSource;
+    void (GLAPIENTRY * fClear)(GLbitfield);
+    void (GLAPIENTRY * fClearBufferfi)(GLenum, GLint, GLfloat, GLint);
+    void (GLAPIENTRY * fClearBufferfv)(GLenum, GLint, const GLfloat*);
+    void (GLAPIENTRY * fClearBufferiv)(GLenum, GLint, const GLint*);
+    void (GLAPIENTRY * fClearBufferuiv)(GLenum, GLint, const GLuint*);
+    void (GLAPIENTRY * fClearColor)(GLfloat, GLfloat, GLfloat, GLfloat);
+    void (GLAPIENTRY * fClearStencil)(GLint);
+    void (GLAPIENTRY * fColorMask)(realGLboolean, realGLboolean, realGLboolean,
+                                    realGLboolean);
+    void (GLAPIENTRY * fCompressedTexImage2D)(GLenum, GLint, GLenum, GLsizei, GLsizei,
+                                                GLint, GLsizei, const GLvoid*);
+    void (GLAPIENTRY * fCompressedTexSubImage2D)(GLenum, GLint, GLint, GLint, GLsizei,
+                                                    GLsizei, GLenum, GLsizei,
+                                                    const GLvoid*);
+    void (GLAPIENTRY * fCullFace)(GLenum);
+    void (GLAPIENTRY * fDetachShader)(GLuint, GLuint);
+    void (GLAPIENTRY * fDepthFunc)(GLenum);
+    void (GLAPIENTRY * fDepthMask)(realGLboolean);
+    void (GLAPIENTRY * fDisable)(GLenum);
+    void (GLAPIENTRY * fDisableVertexAttribArray)(GLuint);
+    void (GLAPIENTRY * fDrawArrays)(GLenum, GLint, GLsizei);
+    void (GLAPIENTRY * fDrawBuffer)(GLenum);
+    void (GLAPIENTRY * fDrawBuffers)(GLsizei, const GLenum*);
+    void (GLAPIENTRY * fDrawElements)(GLenum, GLsizei, GLenum, const GLvoid*);
+    void (GLAPIENTRY * fEnable)(GLenum);
+    void (GLAPIENTRY * fEnableVertexAttribArray)(GLuint);
+    void (GLAPIENTRY * fFinish)(void);
+    void (GLAPIENTRY * fEndQuery)(GLenum);
+    void (GLAPIENTRY * fFlush)(void);
+    void (GLAPIENTRY * fFrontFace)(GLenum);
+    void (GLAPIENTRY * fGetActiveAttrib)(GLuint, GLuint, GLsizei, GLsizei*, GLint*,
+                                            GLenum*, GLchar*);
+    void (GLAPIENTRY * fGetActiveUniform)(GLuint, GLuint, GLsizei, GLsizei*,
+                                            GLint*, GLenum*, GLchar*);
+    void (GLAPIENTRY * fGetAttachedShaders)(GLuint, GLsizei, GLsizei*, GLuint*);
+    GLint (GLAPIENTRY * fGetAttribLocation)(GLuint, const GLchar*);
+    void (GLAPIENTRY * fGetIntegerv)(GLenum, GLint*);
+    void (GLAPIENTRY * fGetFloatv)(GLenum, GLfloat*);
+    void (GLAPIENTRY * fGetBooleanv)(GLenum, realGLboolean*);
+    void (GLAPIENTRY * fGetBufferParameteriv)(GLenum, GLenum, GLint*);
+    void (GLAPIENTRY * fGenerateMipmap)(GLenum);
+    GLenum (GLAPIENTRY * fGetError)(void);
+    void (GLAPIENTRY * fGetProgramiv)(GLuint, GLenum, GLint*);
+    void (GLAPIENTRY * fGetProgramInfoLog)(GLuint, GLsizei, GLsizei*, GLchar*);
+    void (GLAPIENTRY * fGetQueryiv)(GLenum, GLenum, GLint*);
+    void (GLAPIENTRY * fGetQueryObjectiv)(GLuint, GLenum, GLint*);
+    void (GLAPIENTRY * fGetQueryObjectuiv)(GLuint, GLenum, GLuint*);
+    void (GLAPIENTRY * fGetQueryObjecti64v)(GLuint, GLenum, GLint64*);
+    void (GLAPIENTRY * fGetQueryObjectui64v)(GLuint, GLenum, GLuint64*);
+    void (GLAPIENTRY * fQueryCounter)(GLuint, GLenum);
+    void (GLAPIENTRY * fTexParameteri)(GLenum, GLenum, GLint);
+    void (GLAPIENTRY * fTexParameteriv)(GLenum, GLenum, const GLint*);
+    void (GLAPIENTRY * fTexParameterf)(GLenum, GLenum, GLfloat);
+    GLubyte* (GLAPIENTRY * fGetString)(GLenum);
+    void (GLAPIENTRY * fGetTexImage)(GLenum, GLint, GLenum, GLenum, GLvoid*);
+    void (GLAPIENTRY * fGetTexLevelParameteriv)(GLenum, GLint, GLenum, GLint*);
+    void (GLAPIENTRY * fGetTexParameterfv)(GLenum, GLenum, GLfloat*);
+    void (GLAPIENTRY * fGetTexParameteriv)(GLenum, GLenum, GLint*);
+    void (GLAPIENTRY * fGetUniformfv)(GLuint, GLint, GLfloat*);
+    void (GLAPIENTRY * fGetUniformiv)(GLuint, GLint, GLint*);
+    void (GLAPIENTRY * fGetUniformuiv)(GLuint, GLint, GLuint*);
+    GLint (GLAPIENTRY * fGetUniformLocation)(GLint, const GLchar*);
+    void (GLAPIENTRY * fGetVertexAttribfv)(GLuint, GLenum, GLfloat*);
+    void (GLAPIENTRY * fGetVertexAttribiv)(GLuint, GLenum, GLint*);
+    void (GLAPIENTRY * fGetVertexAttribPointerv)(GLuint, GLenum, GLvoid**);
+    void (GLAPIENTRY * fHint)(GLenum, GLenum);
+    realGLboolean (GLAPIENTRY * fIsBuffer)(GLuint);
+    realGLboolean (GLAPIENTRY * fIsEnabled)(GLenum);
+    realGLboolean (GLAPIENTRY * fIsProgram)(GLuint);
+    realGLboolean (GLAPIENTRY * fIsQuery)(GLuint);
+    realGLboolean (GLAPIENTRY * fIsShader)(GLuint);
+    realGLboolean (GLAPIENTRY * fIsTexture)(GLuint);
+    void (GLAPIENTRY * fLineWidth)(GLfloat);
+    void (GLAPIENTRY * fLinkProgram)(GLuint);
+    void (GLAPIENTRY * fPixelStorei)(GLenum, GLint);
+    void (GLAPIENTRY * fPointParameterf)(GLenum, GLfloat);
+    void (GLAPIENTRY * fPolygonMode)(GLenum, GLenum);
+    void (GLAPIENTRY * fPolygonOffset)(GLfloat, GLfloat);
+    void (GLAPIENTRY * fReadBuffer)(GLenum);
+    void (GLAPIENTRY * fReadPixels)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum,
+                                    GLvoid*);
+    void (GLAPIENTRY * fSampleCoverage)(GLclampf, realGLboolean);
+    void (GLAPIENTRY * fStencilFunc)(GLenum, GLint, GLuint);
+    void (GLAPIENTRY * fStencilFuncSeparate)(GLenum, GLenum, GLint, GLuint);
+    void (GLAPIENTRY * fStencilMask)(GLuint);
+    void (GLAPIENTRY * fStencilMaskSeparate)(GLenum, GLuint);
+    void (GLAPIENTRY * fStencilOp)(GLenum, GLenum, GLenum);
+    void (GLAPIENTRY * fStencilOpSeparate)(GLenum, GLenum, GLenum, GLenum);
+    void (GLAPIENTRY * fTexImage2D)(GLenum, GLint, GLint, GLsizei, GLsizei, GLint,
+                                    GLenum, GLenum, const GLvoid*);
+    void (GLAPIENTRY * fTexSubImage2D)(GLenum, GLint, GLint, GLint, GLsizei,
+                                        GLsizei, GLenum, GLenum, const void*);
+    void (GLAPIENTRY * fTextureRangeAPPLE)(GLenum, GLsizei, GLvoid*);
+    void (GLAPIENTRY * fUniform1f)(GLint, GLfloat);
+    void (GLAPIENTRY * fUniform1fv)(GLint, GLsizei, const GLfloat*);
+    void (GLAPIENTRY * fUniform1i)(GLint, GLint);
+    void (GLAPIENTRY * fUniform1iv)(GLint, GLsizei, const GLint*);
+    void (GLAPIENTRY * fUniform2f)(GLint, GLfloat, GLfloat);
+    void (GLAPIENTRY * fUniform2fv)(GLint, GLsizei, const GLfloat*);
+    void (GLAPIENTRY * fUniform2i)(GLint, GLint, GLint);
+    void (GLAPIENTRY * fUniform2iv)(GLint, GLsizei, const GLint*);
+    void (GLAPIENTRY * fUniform3f)(GLint, GLfloat, GLfloat, GLfloat);
+    void (GLAPIENTRY * fUniform3fv)(GLint, GLsizei, const GLfloat*);
+    void (GLAPIENTRY * fUniform3i)(GLint, GLint, GLint, GLint);
+    void (GLAPIENTRY * fUniform3iv)(GLint, GLsizei, const GLint*);
+    void (GLAPIENTRY * fUniform4f)(GLint, GLfloat, GLfloat, GLfloat, GLfloat);
+    void (GLAPIENTRY * fUniform4fv)(GLint, GLsizei, const GLfloat*);
+    void (GLAPIENTRY * fUniform4i)(GLint, GLint, GLint, GLint, GLint);
+    void (GLAPIENTRY * fUniform4iv)(GLint, GLsizei, const GLint*);
+    void (GLAPIENTRY * fUniformMatrix2fv)(GLint, GLsizei, realGLboolean,
+                                            const GLfloat*);
+    void (GLAPIENTRY * fUniformMatrix2x3fv)(GLint, GLsizei, realGLboolean,
+                                            const GLfloat*);
+    void (GLAPIENTRY * fUniformMatrix2x4fv)(GLint, GLsizei, realGLboolean,
+                                            const GLfloat*);
+    void (GLAPIENTRY * fUniformMatrix3fv)(GLint, GLsizei, realGLboolean,
+                                            const GLfloat*);
+    void (GLAPIENTRY * fUniformMatrix3x2fv)(GLint, GLsizei, realGLboolean,
+                                            const GLfloat*);
+    void (GLAPIENTRY * fUniformMatrix3x4fv)(GLint, GLsizei, realGLboolean,
+                                            const GLfloat*);
+    void (GLAPIENTRY * fUniformMatrix4fv)(GLint, GLsizei, realGLboolean,
+                                            const GLfloat*);
+    void (GLAPIENTRY * fUniformMatrix4x2fv)(GLint, GLsizei, realGLboolean,
+                                            const GLfloat*);
+    void (GLAPIENTRY * fUniformMatrix4x3fv)(GLint, GLsizei, realGLboolean,
+                                            const GLfloat*);
 
-    typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFER) (GLenum target, GLuint framebuffer);
-    PFNGLBINDFRAMEBUFFER fBindFramebuffer;
-    typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFER) (GLenum target, GLuint renderbuffer);
-    PFNGLBINDRENDERBUFFER fBindRenderbuffer;
-    typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUS) (GLenum target);
-    PFNGLCHECKFRAMEBUFFERSTATUS fCheckFramebufferStatus;
-    typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFER) (GLenum target, GLenum attachmentPoint, GLenum renderbufferTarget, GLuint renderbuffer);
-    PFNGLFRAMEBUFFERRENDERBUFFER fFramebufferRenderbuffer;
-    typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2D) (GLenum target, GLenum attachmentPoint, GLenum textureTarget, GLuint texture, GLint level);
-    PFNGLFRAMEBUFFERTEXTURE2D fFramebufferTexture2D;
-    typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
-    PFNGLFRAMEBUFFERTEXTURELAYERPROC fFramebufferTextureLayer;
-    typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIV) (GLenum target, GLenum attachment, GLenum pname, GLint* value);
-    PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIV fGetFramebufferAttachmentParameteriv;
-    typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIV) (GLenum target, GLenum pname, GLint* value);
-    PFNGLGETRENDERBUFFERPARAMETERIV fGetRenderbufferParameteriv;
-    typedef realGLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFER) (GLuint framebuffer);
-    PFNGLISFRAMEBUFFER fIsFramebuffer;
-    typedef realGLboolean (GLAPIENTRY * PFNGLISRENDERBUFFER) (GLuint renderbuffer);
-    PFNGLISRENDERBUFFER fIsRenderbuffer;
-    typedef realGLboolean (GLAPIENTRY * PFNGLISVERTEXARRAY) (GLuint array);
-    PFNGLISVERTEXARRAY fIsVertexArray;
-    typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGE) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height);
-    PFNGLRENDERBUFFERSTORAGE fRenderbufferStorage;
-
-    typedef void (GLAPIENTRY * PFNINVALIDATEFRAMEBUFFER) (GLenum target, GLsizei numAttachments, const GLenum* attachments);
-    PFNINVALIDATEFRAMEBUFFER fInvalidateFramebuffer;
-    typedef void (GLAPIENTRY * PFNINVALIDATESUBFRAMEBUFFER) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height);
-    PFNINVALIDATESUBFRAMEBUFFER fInvalidateSubFramebuffer;
+    void (GLAPIENTRY * fUseProgram)(GLuint);
+    void (GLAPIENTRY * fValidateProgram)(GLuint);
+    void (GLAPIENTRY * fVertexAttribPointer)(GLuint, GLint, GLenum,
+                                                realGLboolean, GLsizei, const GLvoid*);
+    void (GLAPIENTRY * fVertexAttrib1f)(GLuint, GLfloat);
+    void (GLAPIENTRY * fVertexAttrib2f)(GLuint, GLfloat, GLfloat);
+    void (GLAPIENTRY * fVertexAttrib3f)(GLuint, GLfloat, GLfloat, GLfloat);
+    void (GLAPIENTRY * fVertexAttrib4f)(GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
+    void (GLAPIENTRY * fVertexAttrib1fv)(GLuint, const GLfloat*);
+    void (GLAPIENTRY * fVertexAttrib2fv)(GLuint, const GLfloat*);
+    void (GLAPIENTRY * fVertexAttrib3fv)(GLuint, const GLfloat*);
+    void (GLAPIENTRY * fVertexAttrib4fv)(GLuint, const GLfloat*);
+    void (GLAPIENTRY * fCompileShader)(GLuint);
+    void (GLAPIENTRY * fCopyTexImage2D)(GLenum, GLint, GLenum, GLint, GLint,
+                                        GLsizei, GLsizei, GLint);
+    void (GLAPIENTRY * fCopyTexSubImage2D)(GLenum, GLint, GLint, GLint, GLint,
+                                            GLint, GLsizei, GLsizei);
+    void (GLAPIENTRY * fGetShaderiv)(GLuint, GLenum, GLint*);
+    void (GLAPIENTRY * fGetShaderInfoLog)(GLuint, GLsizei, GLsizei*, GLchar*);
+    void (GLAPIENTRY * fGetShaderPrecisionFormat)(GLenum, GLenum, GLint*, GLint*);
+    void (GLAPIENTRY * fGetShaderSource)(GLint, GLsizei, GLsizei*, GLchar*);
+    void (GLAPIENTRY * fShaderSource)(GLuint, GLsizei, const GLchar* const*,
+                                        const GLint*);
 
-        // These functions are only used by Skia/GL in desktop mode.
-        // Other parts of Gecko should avoid using these
-        typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTURE) (GLenum texture);
-        PFNGLCLIENTACTIVETEXTURE fClientActiveTexture;
-        typedef void (GLAPIENTRY * PFNDISABLECLIENTSTATE) (GLenum capability);
-        PFNDISABLECLIENTSTATE fDisableClientState;
-        typedef void (GLAPIENTRY * PFNENABLECLIENTSTATE) (GLenum capability);
-        PFNENABLECLIENTSTATE fEnableClientState;
-        typedef void (GLAPIENTRY * PFNLOADIDENTITY) (void);
-        PFNLOADIDENTITY fLoadIdentity;
-        typedef void (GLAPIENTRY * PFNLOADMATRIXD) (const GLdouble* matrix);
-        PFNLOADMATRIXD fLoadMatrixd;
-        typedef void (GLAPIENTRY * PFNLOADMATRIXF) (const GLfloat* matrix);
-        PFNLOADMATRIXF fLoadMatrixf;
-        typedef void (GLAPIENTRY * PFNMATRIXMODE) (GLenum mode);
-        PFNMATRIXMODE fMatrixMode;
-        typedef void (GLAPIENTRY * PFNTEXGENI) (GLenum coord, GLenum pname, GLint param);
-        PFNTEXGENI fTexGeni;
-        typedef void (GLAPIENTRY * PFNTEXGENF) (GLenum coord, GLenum pname, GLfloat param);
-        PFNTEXGENF fTexGenf;
-        typedef void (GLAPIENTRY * PFNTEXGENFV) (GLenum coord, GLenum pname, const GLfloat* param);
-        PFNTEXGENFV fTexGenfv;
-        typedef void (GLAPIENTRY * PFNVERTEXPOINTER) (GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
-        PFNVERTEXPOINTER fVertexPointer;
+    void (GLAPIENTRY * fBindFramebuffer)(GLenum, GLuint);
+    void (GLAPIENTRY * fBindRenderbuffer)(GLenum, GLuint);
+    GLenum (GLAPIENTRY * fCheckFramebufferStatus)(GLenum);
+    void (GLAPIENTRY * fFramebufferRenderbuffer)(GLenum, GLenum, GLenum, GLuint);
+    void (GLAPIENTRY * fFramebufferTexture2D)(GLenum, GLenum, GLenum, GLuint, GLint);
+    void (GLAPIENTRY * fFramebufferTextureLayer)(GLenum, GLenum, GLuint, GLint, GLint);
+    void (GLAPIENTRY * fGetFramebufferAttachmentParameteriv)(GLenum, GLenum, GLenum,
+                                                                GLint*);
+    void (GLAPIENTRY * fGetRenderbufferParameteriv)(GLenum, GLenum, GLint*);
+    realGLboolean (GLAPIENTRY * fIsFramebuffer)(GLuint);
+    realGLboolean (GLAPIENTRY * fIsRenderbuffer)(GLuint);
+    realGLboolean (GLAPIENTRY * fIsVertexArray)(GLuint);
+    void (GLAPIENTRY * fRenderbufferStorage)(GLenum, GLenum, GLsizei, GLsizei);
+
+    void (GLAPIENTRY * fInvalidateFramebuffer)(GLenum, GLsizei, const GLenum*);
+    void (GLAPIENTRY * fInvalidateSubFramebuffer)(GLenum, GLsizei, const GLenum*, GLint,
+                                                    GLint, GLsizei, GLsizei);
 
-    typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFER) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
-    PFNGLBLITFRAMEBUFFER fBlitFramebuffer;
-    typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLE) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height);
-    PFNGLRENDERBUFFERSTORAGEMULTISAMPLE fRenderbufferStorageMultisample;
+    // These functions are only used by Skia/GL in desktop mode.
+    // Other parts of Gecko should avoid using these
+    void (GLAPIENTRY * fClientActiveTexture)(GLenum);
+    void (GLAPIENTRY * fDisableClientState)(GLenum);
+    void (GLAPIENTRY * fEnableClientState)(GLenum);
+    void (GLAPIENTRY * fLoadIdentity)(void);
+    void (GLAPIENTRY * fLoadMatrixd)(const GLdouble*);
+    void (GLAPIENTRY * fLoadMatrixf)(const GLfloat*);
+    void (GLAPIENTRY * fMatrixMode)(GLenum);
+    void (GLAPIENTRY * fTexGeni)(GLenum, GLenum, GLint);
+    void (GLAPIENTRY * fTexGenf)(GLenum, GLenum, GLfloat);
+    void (GLAPIENTRY * fTexGenfv)(GLenum, GLenum, const GLfloat*);
+    void (GLAPIENTRY * fVertexPointer)(GLint, GLenum, GLsizei, const GLvoid*);
+
+    void (GLAPIENTRY * fBlitFramebuffer)(GLint, GLint, GLint, GLint, GLint, GLint, GLint,
+                                            GLint, GLbitfield, GLenum);
+    void (GLAPIENTRY * fRenderbufferStorageMultisample)(GLenum, GLsizei, GLenum,
+                                                        GLsizei, GLsizei);
 
 
-    /* These are different between GLES2 and desktop GL; we hide those differences, use the GL
-     * names, but the most limited data type.
-     */
-    typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFPROC) (GLclampf, GLclampf);
-    PFNGLDEPTHRANGEFPROC fDepthRangef;
-    typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFPROC) (GLclampf);
-    PFNGLCLEARDEPTHFPROC fClearDepthf;
+    /* These are different between GLES2 and desktop GL; we hide those differences,
+        * use the GL names, but the most limited data type.
+        */
+    void (GLAPIENTRY * fDepthRangef)(GLclampf, GLclampf);
+    void (GLAPIENTRY * fClearDepthf)(GLclampf);
 
-    typedef void (GLAPIENTRY * PFNGLDEPTHRANGEPROC) (GLclampd, GLclampd);
-    PFNGLDEPTHRANGEPROC fDepthRange;
-    typedef void (GLAPIENTRY * PFNGLCLEARDEPTHPROC) (GLclampd);
-    PFNGLCLEARDEPTHPROC fClearDepth;
+    void (GLAPIENTRY * fDepthRange)(GLclampd, GLclampd);
+    void (GLAPIENTRY * fClearDepth)(GLclampd);
 
     /* These are special because we end up tracking these so that we don't
-     * have to query the values from GL.
-     */
+        * have to query the values from GL.
+        */
 
-    typedef void (GLAPIENTRY * PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
-    PFNGLVIEWPORTPROC fViewport;
-    typedef void (GLAPIENTRY * PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
-    PFNGLSCISSORPROC fScissor;
+    void (GLAPIENTRY * fViewport)(GLint, GLint, GLsizei, GLsizei);
+    void (GLAPIENTRY * fScissor)(GLint, GLint, GLsizei, GLsizei);
 
 
     /* These are special -- they create or delete GL resources that can live
-     * in a shared namespace.  In DEBUG, we wrap these calls so that we can
-     * check when we have something that failed to do cleanup at the time the
-     * final context is destroyed.
-     */
-
-    typedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void);
-    PFNGLCREATEPROGRAMPROC fCreateProgram;
-    typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type);
-    PFNGLCREATESHADERPROC fCreateShader;
-    typedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers);
-    PFNGLGENBUFFERSPROC fGenBuffers;
-    typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* queries);
-    PFNGLGENQUERIESPROC fGenQueries;
-    typedef void (GLAPIENTRY * PFNGLGENTEXTURESPROC) (GLsizei n, GLuint* textures);
-    PFNGLGENTEXTURESPROC fGenTextures;
-    typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERS) (GLsizei n, GLuint* ids);
-    PFNGLGENFRAMEBUFFERS fGenFramebuffers;
-    typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERS) (GLsizei n, GLuint* ids);
-    PFNGLGENRENDERBUFFERS fGenRenderbuffers;
-    typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYS) (GLsizei n, GLuint* arrays);
-    PFNGLGENVERTEXARRAYS fGenVertexArrays;
+        * in a shared namespace.  In DEBUG, we wrap these calls so that we can
+        * check when we have something that failed to do cleanup at the time the
+        * final context is destroyed.
+        */
 
-    typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program);
-    PFNGLDELETEPROGRAMPROC fDeleteProgram;
-    typedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader);
-    PFNGLDELETESHADERPROC fDeleteShader;
-    typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers);
-    PFNGLDELETEBUFFERSPROC fDeleteBuffers;
-    typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* queries);
-    PFNGLDELETEQUERIESPROC fDeleteQueries;
-    typedef void (GLAPIENTRY * PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint* textures);
-    PFNGLDELETETEXTURESPROC fDeleteTextures;
-    typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERS) (GLsizei n, const GLuint* ids);
-    PFNGLDELETEFRAMEBUFFERS fDeleteFramebuffers;
-    typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERS) (GLsizei n, const GLuint* ids);
-    PFNGLDELETERENDERBUFFERS fDeleteRenderbuffers;
-    typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYS) (GLsizei n, const GLuint* arrays);
-    PFNGLDELETEVERTEXARRAYS fDeleteVertexArrays;
+    GLuint (GLAPIENTRY * fCreateProgram)();
+    GLuint (GLAPIENTRY * fCreateShader)(GLenum);
+    void (GLAPIENTRY * fGenBuffers)(GLsizei, GLuint*);
+    void (GLAPIENTRY * fGen