Merge mozilla-central to beta. a=merge, l10n=me on a CLOSED TREE
authorRyan VanderMeulen <ryanvm@gmail.com>
Sat, 04 Nov 2017 13:44:15 -0400
changeset 443444 78568f0b106895cb7573fb1fa355d511ec9c87a3
parent 443148 e65a20ee3a063aa94ea61059b80dce6bc065fa91 (current diff)
parent 443443 e437203962cc7d97b1646d09ed3061272a1df443 (diff)
child 443557 4ff8cd6da5d3bd029e84b8551ad9ab77ee7b102b
push id1618
push userCallek@gmail.com
push dateThu, 11 Jan 2018 17:45:48 +0000
treeherdermozilla-release@882ca853e05a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone58.0
Merge mozilla-central to beta. a=merge, l10n=me on a CLOSED TREE
CLOBBER
browser/components/customizableui/test/browser_932928_show_notice_when_palette_empty.js
browser/config/tooltool-manifests/win32/vs2017.manifest
browser/config/tooltool-manifests/win64/vs2017.manifest
browser/extensions/activity-stream/data/content/activity-stream.css
browser/extensions/activity-stream/data/locales.json
browser/extensions/activity-stream/lib/LocalizationFeed.jsm
browser/extensions/activity-stream/prerendered/ach/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ach/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ach/activity-stream.html
browser/extensions/activity-stream/prerendered/ar/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ar/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ar/activity-stream.html
browser/extensions/activity-stream/prerendered/ast/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ast/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ast/activity-stream.html
browser/extensions/activity-stream/prerendered/az/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/az/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/az/activity-stream.html
browser/extensions/activity-stream/prerendered/be/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/be/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/be/activity-stream.html
browser/extensions/activity-stream/prerendered/bg/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/bg/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/bg/activity-stream.html
browser/extensions/activity-stream/prerendered/bn-BD/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/bn-BD/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/bn-BD/activity-stream.html
browser/extensions/activity-stream/prerendered/bn-IN/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/bn-IN/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/bn-IN/activity-stream.html
browser/extensions/activity-stream/prerendered/br/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/br/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/br/activity-stream.html
browser/extensions/activity-stream/prerendered/bs/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/bs/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/bs/activity-stream.html
browser/extensions/activity-stream/prerendered/ca/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ca/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ca/activity-stream.html
browser/extensions/activity-stream/prerendered/cak/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/cak/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/cak/activity-stream.html
browser/extensions/activity-stream/prerendered/cs/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/cs/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/cs/activity-stream.html
browser/extensions/activity-stream/prerendered/cy/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/cy/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/cy/activity-stream.html
browser/extensions/activity-stream/prerendered/da/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/da/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/da/activity-stream.html
browser/extensions/activity-stream/prerendered/de/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/de/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/de/activity-stream.html
browser/extensions/activity-stream/prerendered/dsb/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/dsb/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/dsb/activity-stream.html
browser/extensions/activity-stream/prerendered/el/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/el/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/el/activity-stream.html
browser/extensions/activity-stream/prerendered/en-GB/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/en-GB/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/en-GB/activity-stream.html
browser/extensions/activity-stream/prerendered/en-US/activity-stream-debug.html
browser/extensions/activity-stream/prerendered/en-US/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/en-US/activity-stream-prerendered-debug.html
browser/extensions/activity-stream/prerendered/en-US/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/en-US/activity-stream.html
browser/extensions/activity-stream/prerendered/eo/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/eo/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/eo/activity-stream.html
browser/extensions/activity-stream/prerendered/es-AR/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/es-AR/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/es-AR/activity-stream.html
browser/extensions/activity-stream/prerendered/es-CL/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/es-CL/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/es-CL/activity-stream.html
browser/extensions/activity-stream/prerendered/es-ES/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/es-ES/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/es-ES/activity-stream.html
browser/extensions/activity-stream/prerendered/es-MX/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/es-MX/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/es-MX/activity-stream.html
browser/extensions/activity-stream/prerendered/et/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/et/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/et/activity-stream.html
browser/extensions/activity-stream/prerendered/eu/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/eu/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/eu/activity-stream.html
browser/extensions/activity-stream/prerendered/fa/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/fa/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/fa/activity-stream.html
browser/extensions/activity-stream/prerendered/fi/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/fi/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/fi/activity-stream.html
browser/extensions/activity-stream/prerendered/fr/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/fr/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/fr/activity-stream.html
browser/extensions/activity-stream/prerendered/fy-NL/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/fy-NL/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/fy-NL/activity-stream.html
browser/extensions/activity-stream/prerendered/ga-IE/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ga-IE/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ga-IE/activity-stream.html
browser/extensions/activity-stream/prerendered/gd/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/gd/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/gd/activity-stream.html
browser/extensions/activity-stream/prerendered/gu-IN/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/gu-IN/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/gu-IN/activity-stream.html
browser/extensions/activity-stream/prerendered/he/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/he/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/he/activity-stream.html
browser/extensions/activity-stream/prerendered/hi-IN/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/hi-IN/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/hi-IN/activity-stream.html
browser/extensions/activity-stream/prerendered/hr/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/hr/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/hr/activity-stream.html
browser/extensions/activity-stream/prerendered/hsb/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/hsb/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/hsb/activity-stream.html
browser/extensions/activity-stream/prerendered/hu/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/hu/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/hu/activity-stream.html
browser/extensions/activity-stream/prerendered/hy-AM/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/hy-AM/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/hy-AM/activity-stream.html
browser/extensions/activity-stream/prerendered/ia/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ia/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ia/activity-stream.html
browser/extensions/activity-stream/prerendered/it/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/it/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/it/activity-stream.html
browser/extensions/activity-stream/prerendered/ja-JP-mac/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ja-JP-mac/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ja-JP-mac/activity-stream.html
browser/extensions/activity-stream/prerendered/ja/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ja/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ja/activity-stream.html
browser/extensions/activity-stream/prerendered/ka/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ka/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ka/activity-stream.html
browser/extensions/activity-stream/prerendered/kab/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/kab/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/kab/activity-stream.html
browser/extensions/activity-stream/prerendered/kk/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/kk/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/kk/activity-stream.html
browser/extensions/activity-stream/prerendered/km/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/km/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/km/activity-stream.html
browser/extensions/activity-stream/prerendered/kn/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/kn/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/kn/activity-stream.html
browser/extensions/activity-stream/prerendered/ko/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ko/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ko/activity-stream.html
browser/extensions/activity-stream/prerendered/lij/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/lij/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/lij/activity-stream.html
browser/extensions/activity-stream/prerendered/lo/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/lo/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/lo/activity-stream.html
browser/extensions/activity-stream/prerendered/lt/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/lt/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/lt/activity-stream.html
browser/extensions/activity-stream/prerendered/lv/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/lv/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/lv/activity-stream.html
browser/extensions/activity-stream/prerendered/mk/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/mk/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/mk/activity-stream.html
browser/extensions/activity-stream/prerendered/ml/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ml/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ml/activity-stream.html
browser/extensions/activity-stream/prerendered/mr/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/mr/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/mr/activity-stream.html
browser/extensions/activity-stream/prerendered/ms/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ms/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ms/activity-stream.html
browser/extensions/activity-stream/prerendered/my/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/my/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/my/activity-stream.html
browser/extensions/activity-stream/prerendered/nb-NO/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/nb-NO/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/nb-NO/activity-stream.html
browser/extensions/activity-stream/prerendered/ne-NP/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ne-NP/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ne-NP/activity-stream.html
browser/extensions/activity-stream/prerendered/nl/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/nl/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/nl/activity-stream.html
browser/extensions/activity-stream/prerendered/nn-NO/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/nn-NO/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/nn-NO/activity-stream.html
browser/extensions/activity-stream/prerendered/pa-IN/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/pa-IN/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/pa-IN/activity-stream.html
browser/extensions/activity-stream/prerendered/pl/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/pl/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/pl/activity-stream.html
browser/extensions/activity-stream/prerendered/pt-BR/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/pt-BR/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/pt-BR/activity-stream.html
browser/extensions/activity-stream/prerendered/pt-PT/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/pt-PT/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/pt-PT/activity-stream.html
browser/extensions/activity-stream/prerendered/rm/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/rm/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/rm/activity-stream.html
browser/extensions/activity-stream/prerendered/ro/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ro/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ro/activity-stream.html
browser/extensions/activity-stream/prerendered/ru/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ru/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ru/activity-stream.html
browser/extensions/activity-stream/prerendered/sk/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/sk/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/sk/activity-stream.html
browser/extensions/activity-stream/prerendered/sl/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/sl/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/sl/activity-stream.html
browser/extensions/activity-stream/prerendered/sq/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/sq/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/sq/activity-stream.html
browser/extensions/activity-stream/prerendered/sr/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/sr/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/sr/activity-stream.html
browser/extensions/activity-stream/prerendered/sv-SE/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/sv-SE/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/sv-SE/activity-stream.html
browser/extensions/activity-stream/prerendered/ta-LK/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ta-LK/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ta-LK/activity-stream.html
browser/extensions/activity-stream/prerendered/ta/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ta/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ta/activity-stream.html
browser/extensions/activity-stream/prerendered/te/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/te/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/te/activity-stream.html
browser/extensions/activity-stream/prerendered/th/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/th/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/th/activity-stream.html
browser/extensions/activity-stream/prerendered/tl/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/tl/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/tl/activity-stream.html
browser/extensions/activity-stream/prerendered/tr/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/tr/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/tr/activity-stream.html
browser/extensions/activity-stream/prerendered/uk/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/uk/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/uk/activity-stream.html
browser/extensions/activity-stream/prerendered/ur/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ur/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ur/activity-stream.html
browser/extensions/activity-stream/prerendered/uz/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/uz/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/uz/activity-stream.html
browser/extensions/activity-stream/prerendered/vi/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/vi/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/vi/activity-stream.html
browser/extensions/activity-stream/prerendered/zh-CN/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/zh-CN/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/zh-CN/activity-stream.html
browser/extensions/activity-stream/prerendered/zh-TW/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/zh-TW/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/zh-TW/activity-stream.html
browser/extensions/activity-stream/test/unit/lib/LocalizationFeed.test.js
browser/locales/searchplugins/wikipediaro.xml
browser/themes/linux/menuPanel-customize.png
browser/themes/linux/menuPanel-customize@2x.png
browser/themes/linux/menuPanel-exit.png
browser/themes/linux/menuPanel-exit@2x.png
browser/themes/linux/menuPanel-help.png
browser/themes/linux/menuPanel-help@2x.png
browser/themes/osx/menu-forward.png
browser/themes/osx/menuPanel-customize-yosemite.png
browser/themes/osx/menuPanel-customize-yosemite@2x.png
browser/themes/osx/menuPanel-customize.png
browser/themes/osx/menuPanel-customize@2x.png
browser/themes/osx/menuPanel-exit-yosemite.png
browser/themes/osx/menuPanel-exit-yosemite@2x.png
browser/themes/osx/menuPanel-exit.png
browser/themes/osx/menuPanel-exit@2x.png
browser/themes/osx/menuPanel-help-yosemite.png
browser/themes/osx/menuPanel-help-yosemite@2x.png
browser/themes/osx/menuPanel-help.png
browser/themes/osx/menuPanel-help@2x.png
browser/themes/shared/customizableui/menuPanel-customizeFinish.png
browser/themes/shared/customizableui/menuPanel-customizeFinish@2x.png
browser/themes/shared/customizableui/subView-arrow-back-inverted-rtl.png
browser/themes/shared/customizableui/subView-arrow-back-inverted-rtl@2x.png
browser/themes/shared/customizableui/subView-arrow-back-inverted.png
browser/themes/shared/customizableui/subView-arrow-back-inverted@2x.png
browser/themes/shared/customizableui/whimsy@2x.png
browser/themes/windows/menu-forward.png
browser/themes/windows/menuPanel-customize.png
browser/themes/windows/menuPanel-customize@2x.png
browser/themes/windows/menuPanel-exit.png
browser/themes/windows/menuPanel-exit@2x.png
browser/themes/windows/menuPanel-help.png
browser/themes/windows/menuPanel-help@2x.png
devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_and_selfxss.js
devtools/server/actors/utils/shapes-geometry-utils.js
dom/interfaces/xul/nsIDOMXULImageElement.idl
dom/plugins/base/PluginPRLibrary.cpp
dom/plugins/base/PluginPRLibrary.h
js/src/tests/js1_8_5/extensions/is-generator.js
layout/reftests/dom/xbl-children-1.xhtml
media/ffvpx/config_darwin32.h
media/ffvpx/libavcodec/flac_parser.c
media/libaom/config/win/mingw32/aom_config.asm
media/libaom/config/win/mingw32/aom_config.h
mobile/android/Makefile.in
mobile/android/config/mozconfigs/android-aarch64/l10n-nightly
mobile/android/config/mozconfigs/android-api-16/l10n-nightly
mobile/android/config/mozconfigs/android-x86/l10n-nightly
mobile/android/config/tooltool-manifests/android-frontend/releng.manifest
mobile/android/config/tooltool-manifests/android-gradle-dependencies/releng.manifest
mobile/android/locales/en-US/chrome/checkbox.dtd
modules/libpref/test/unit/test_extprefs.js
security/certverifier/StartComAndWoSignData.inc
services/sync/modules/rest.js
services/sync/tests/unit/test_resource_async.js
services/sync/tests/unit/test_service_getStorageInfo.js
services/sync/tests/unit/test_syncstoragerequest.js
servo/ports/servo/.cargo/config
third_party/aom/aom_dsp/arm/idct16x16_1_add_neon.asm
third_party/aom/aom_dsp/arm/idct16x16_add_neon.asm
third_party/aom/aom_dsp/arm/idct32x32_1_add_neon.asm
third_party/aom/aom_dsp/arm/idct32x32_add_neon.asm
third_party/aom/aom_dsp/arm/idct4x4_1_add_neon.asm
third_party/aom/aom_dsp/arm/idct4x4_add_neon.asm
third_party/aom/aom_dsp/arm/idct8x8_1_add_neon.asm
third_party/aom/aom_dsp/arm/idct8x8_add_neon.asm
third_party/aom/aom_dsp/arm/loopfilter_16_neon.asm
third_party/aom/aom_dsp/arm/loopfilter_4_neon.asm
third_party/aom/aom_dsp/arm/loopfilter_8_neon.asm
third_party/aom/aom_dsp/x86/highbd_intrapred_sse2.asm
third_party/aom/aom_dsp/x86/intrapred_sse2.asm
third_party/aom/aom_dsp/x86/intrapred_ssse3.asm
third_party/aom/av1/common/cdef_simd.h
third_party/aom/av1/common/mips/dspr2/av1_itrans16_dspr2.c
third_party/aom/av1/common/mips/dspr2/av1_itrans4_dspr2.c
third_party/aom/av1/common/mips/dspr2/av1_itrans8_dspr2.c
third_party/aom/av1/common/od_dering.c
third_party/aom/av1/common/od_dering.h
third_party/aom/av1/common/od_dering_neon.c
third_party/aom/av1/common/od_dering_simd.h
third_party/aom/av1/common/od_dering_sse2.c
third_party/aom/av1/common/od_dering_sse4.c
third_party/aom/av1/common/od_dering_ssse3.c
third_party/aom/av1/encoder/arm/neon/dct_neon.c
third_party/aom/av1/encoder/x86/dct_ssse3.c
third_party/aom/build/cmake/aom_version.pl
third_party/rust/aho-corasick-0.6.2/.cargo-checksum.json
third_party/rust/aho-corasick-0.6.2/.travis.yml
third_party/rust/aho-corasick-0.6.2/COPYING
third_party/rust/aho-corasick-0.6.2/Cargo.toml
third_party/rust/aho-corasick-0.6.2/LICENSE-MIT
third_party/rust/aho-corasick-0.6.2/Makefile
third_party/rust/aho-corasick-0.6.2/README.md
third_party/rust/aho-corasick-0.6.2/UNLICENSE
third_party/rust/aho-corasick-0.6.2/benches/bench.rs
third_party/rust/aho-corasick-0.6.2/benches/random.txt
third_party/rust/aho-corasick-0.6.2/ctags.rust
third_party/rust/aho-corasick-0.6.2/examples/dict-search.rs
third_party/rust/aho-corasick-0.6.2/session.vim
third_party/rust/aho-corasick-0.6.2/src/autiter.rs
third_party/rust/aho-corasick-0.6.2/src/full.rs
third_party/rust/aho-corasick-0.6.2/src/lib.rs
third_party/rust/aho-corasick-0.6.2/src/main.rs
third_party/rust/aster/.cargo-checksum.json
third_party/rust/aster/Cargo.toml
third_party/rust/aster/src/arm.rs
third_party/rust/aster/src/attr.rs
third_party/rust/aster/src/block.rs
third_party/rust/aster/src/constant.rs
third_party/rust/aster/src/ctx.rs
third_party/rust/aster/src/expr.rs
third_party/rust/aster/src/fn_decl.rs
third_party/rust/aster/src/generics.rs
third_party/rust/aster/src/ident.rs
third_party/rust/aster/src/invoke.rs
third_party/rust/aster/src/item.rs
third_party/rust/aster/src/lib.rs
third_party/rust/aster/src/lifetime.rs
third_party/rust/aster/src/lit.rs
third_party/rust/aster/src/mac.rs
third_party/rust/aster/src/method.rs
third_party/rust/aster/src/pat.rs
third_party/rust/aster/src/path.rs
third_party/rust/aster/src/qpath.rs
third_party/rust/aster/src/self_.rs
third_party/rust/aster/src/stmt.rs
third_party/rust/aster/src/struct_field.rs
third_party/rust/aster/src/symbol.rs
third_party/rust/aster/src/ty.rs
third_party/rust/aster/src/ty_param.rs
third_party/rust/aster/src/variant.rs
third_party/rust/aster/src/variant_data.rs
third_party/rust/aster/src/where_predicate.rs
third_party/rust/base64-0.5.2/.cargo-checksum.json
third_party/rust/base64-0.5.2/Cargo.toml
third_party/rust/base64-0.5.2/LICENSE-APACHE
third_party/rust/base64-0.5.2/LICENSE-MIT
third_party/rust/base64-0.5.2/README.md
third_party/rust/base64-0.5.2/benches/benchmarks.rs
third_party/rust/base64-0.5.2/examples/make_tables.rs
third_party/rust/base64-0.5.2/src/lib.rs
third_party/rust/base64-0.5.2/src/tables.rs
third_party/rust/base64-0.5.2/tests/tests.rs
third_party/rust/bindgen-0.30.0/.cargo-checksum.json
third_party/rust/bindgen-0.30.0/Cargo.toml
third_party/rust/bindgen-0.30.0/build.rs
third_party/rust/bindgen-0.30.0/src/callbacks.rs
third_party/rust/bindgen-0.30.0/src/clang.rs
third_party/rust/bindgen-0.30.0/src/codegen/derive_debug.rs
third_party/rust/bindgen-0.30.0/src/codegen/error.rs
third_party/rust/bindgen-0.30.0/src/codegen/helpers.rs
third_party/rust/bindgen-0.30.0/src/codegen/mod.rs
third_party/rust/bindgen-0.30.0/src/codegen/struct_layout.rs
third_party/rust/bindgen-0.30.0/src/extra_assertions.rs
third_party/rust/bindgen-0.30.0/src/features.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/derive_copy.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/derive_debug.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/derive_default.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/derive_hash.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/derive_partial_eq.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/has_destructor.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/has_float.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/has_type_param_in_array.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/has_vtable.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/mod.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/template_params.rs
third_party/rust/bindgen-0.30.0/src/ir/annotations.rs
third_party/rust/bindgen-0.30.0/src/ir/comment.rs
third_party/rust/bindgen-0.30.0/src/ir/comp.rs
third_party/rust/bindgen-0.30.0/src/ir/context.rs
third_party/rust/bindgen-0.30.0/src/ir/derive.rs
third_party/rust/bindgen-0.30.0/src/ir/dot.rs
third_party/rust/bindgen-0.30.0/src/ir/enum_ty.rs
third_party/rust/bindgen-0.30.0/src/ir/function.rs
third_party/rust/bindgen-0.30.0/src/ir/int.rs
third_party/rust/bindgen-0.30.0/src/ir/item.rs
third_party/rust/bindgen-0.30.0/src/ir/item_kind.rs
third_party/rust/bindgen-0.30.0/src/ir/layout.rs
third_party/rust/bindgen-0.30.0/src/ir/mod.rs
third_party/rust/bindgen-0.30.0/src/ir/module.rs
third_party/rust/bindgen-0.30.0/src/ir/objc.rs
third_party/rust/bindgen-0.30.0/src/ir/template.rs
third_party/rust/bindgen-0.30.0/src/ir/traversal.rs
third_party/rust/bindgen-0.30.0/src/ir/ty.rs
third_party/rust/bindgen-0.30.0/src/ir/var.rs
third_party/rust/bindgen-0.30.0/src/lib.rs
third_party/rust/bindgen-0.30.0/src/log_stubs.rs
third_party/rust/bindgen-0.30.0/src/main.rs
third_party/rust/bindgen-0.30.0/src/options.rs
third_party/rust/bindgen-0.30.0/src/parse.rs
third_party/rust/bindgen-0.30.0/src/regex_set.rs
third_party/rust/bitflags-0.8.2/.cargo-checksum.json
third_party/rust/bitflags-0.8.2/.travis.yml
third_party/rust/bitflags-0.8.2/Cargo.toml
third_party/rust/bitflags-0.8.2/LICENSE-APACHE
third_party/rust/bitflags-0.8.2/LICENSE-MIT
third_party/rust/bitflags-0.8.2/README.md
third_party/rust/bitflags-0.8.2/src/lib.rs
third_party/rust/bitflags-0.8.2/tests/external.rs
third_party/rust/bitflags-0.8.2/tests/external_no_std.rs
third_party/rust/bitflags-0.8.2/tests/i128_bitflags.rs
third_party/rust/clang-sys-0.19.0/.cargo-checksum.json
third_party/rust/clang-sys-0.19.0/.travis.yml
third_party/rust/clang-sys-0.19.0/CHANGELOG.md
third_party/rust/clang-sys-0.19.0/CONTRIBUTING.md
third_party/rust/clang-sys-0.19.0/Cargo.toml
third_party/rust/clang-sys-0.19.0/LICENSE.txt
third_party/rust/clang-sys-0.19.0/README.md
third_party/rust/clang-sys-0.19.0/appveyor.yml
third_party/rust/clang-sys-0.19.0/build.rs
third_party/rust/clang-sys-0.19.0/ci/before_install.sh
third_party/rust/clang-sys-0.19.0/ci/install.bat
third_party/rust/clang-sys-0.19.0/ci/script.sh
third_party/rust/clang-sys-0.19.0/ci/test_script.bat
third_party/rust/clang-sys-0.19.0/clippy.toml
third_party/rust/clang-sys-0.19.0/src/lib.rs
third_party/rust/clang-sys-0.19.0/src/link.rs
third_party/rust/clang-sys-0.19.0/src/support.rs
third_party/rust/clang-sys-0.19.0/tests/header.h
third_party/rust/clang-sys-0.19.0/tests/lib.rs
third_party/rust/clap-2.24.2/.cargo-checksum.json
third_party/rust/clap-2.24.2/.clog.toml
third_party/rust/clap-2.24.2/.github/CONTRIBUTING.md
third_party/rust/clap-2.24.2/.github/ISSUE_TEMPLATE.md
third_party/rust/clap-2.24.2/.travis.yml
third_party/rust/clap-2.24.2/CHANGELOG.md
third_party/rust/clap-2.24.2/CONTRIBUTORS.md
third_party/rust/clap-2.24.2/Cargo.toml
third_party/rust/clap-2.24.2/LICENSE-MIT
third_party/rust/clap-2.24.2/README.md
third_party/rust/clap-2.24.2/appveyor.yml
third_party/rust/clap-2.24.2/clap-test.rs
third_party/rust/clap-2.24.2/index.html
third_party/rust/clap-2.24.2/justfile
third_party/rust/clap-2.24.2/rustfmt.toml
third_party/rust/clap-2.24.2/src/app/help.rs
third_party/rust/clap-2.24.2/src/app/macros.rs
third_party/rust/clap-2.24.2/src/app/meta.rs
third_party/rust/clap-2.24.2/src/app/mod.rs
third_party/rust/clap-2.24.2/src/app/parser.rs
third_party/rust/clap-2.24.2/src/app/settings.rs
third_party/rust/clap-2.24.2/src/app/usage.rs
third_party/rust/clap-2.24.2/src/app/validator.rs
third_party/rust/clap-2.24.2/src/args/any_arg.rs
third_party/rust/clap-2.24.2/src/args/arg.rs
third_party/rust/clap-2.24.2/src/args/arg_builder/base.rs
third_party/rust/clap-2.24.2/src/args/arg_builder/flag.rs
third_party/rust/clap-2.24.2/src/args/arg_builder/mod.rs
third_party/rust/clap-2.24.2/src/args/arg_builder/option.rs
third_party/rust/clap-2.24.2/src/args/arg_builder/positional.rs
third_party/rust/clap-2.24.2/src/args/arg_builder/switched.rs
third_party/rust/clap-2.24.2/src/args/arg_builder/valued.rs
third_party/rust/clap-2.24.2/src/args/arg_matcher.rs
third_party/rust/clap-2.24.2/src/args/arg_matches.rs
third_party/rust/clap-2.24.2/src/args/group.rs
third_party/rust/clap-2.24.2/src/args/macros.rs
third_party/rust/clap-2.24.2/src/args/matched_arg.rs
third_party/rust/clap-2.24.2/src/args/mod.rs
third_party/rust/clap-2.24.2/src/args/settings.rs
third_party/rust/clap-2.24.2/src/args/subcommand.rs
third_party/rust/clap-2.24.2/src/completions/bash.rs
third_party/rust/clap-2.24.2/src/completions/fish.rs
third_party/rust/clap-2.24.2/src/completions/macros.rs
third_party/rust/clap-2.24.2/src/completions/mod.rs
third_party/rust/clap-2.24.2/src/completions/powershell.rs
third_party/rust/clap-2.24.2/src/completions/shell.rs
third_party/rust/clap-2.24.2/src/completions/zsh.rs
third_party/rust/clap-2.24.2/src/errors.rs
third_party/rust/clap-2.24.2/src/fmt.rs
third_party/rust/clap-2.24.2/src/lib.rs
third_party/rust/clap-2.24.2/src/macros.rs
third_party/rust/clap-2.24.2/src/osstringext.rs
third_party/rust/clap-2.24.2/src/strext.rs
third_party/rust/clap-2.24.2/src/suggestions.rs
third_party/rust/clap-2.24.2/src/usage_parser.rs
third_party/rust/cookie-0.9.1/.cargo-checksum.json
third_party/rust/cookie-0.9.1/.travis.yml
third_party/rust/cookie-0.9.1/Cargo.toml
third_party/rust/cookie-0.9.1/LICENSE-APACHE
third_party/rust/cookie-0.9.1/LICENSE-MIT
third_party/rust/cookie-0.9.1/README.md
third_party/rust/cookie-0.9.1/src/builder.rs
third_party/rust/cookie-0.9.1/src/delta.rs
third_party/rust/cookie-0.9.1/src/draft.rs
third_party/rust/cookie-0.9.1/src/jar.rs
third_party/rust/cookie-0.9.1/src/lib.rs
third_party/rust/cookie-0.9.1/src/parse.rs
third_party/rust/cookie-0.9.1/src/secure/key.rs
third_party/rust/cookie-0.9.1/src/secure/macros.rs
third_party/rust/cookie-0.9.1/src/secure/mod.rs
third_party/rust/cookie-0.9.1/src/secure/private.rs
third_party/rust/cookie-0.9.1/src/secure/signed.rs
third_party/rust/flate2/src/deflate.rs
third_party/rust/flate2/src/gz.rs
third_party/rust/flate2/src/zlib.rs
third_party/rust/httparse-1.2.2/.cargo-checksum.json
third_party/rust/httparse-1.2.2/.travis.yml
third_party/rust/httparse-1.2.2/.travis_after.sh
third_party/rust/httparse-1.2.2/Cargo.toml
third_party/rust/httparse-1.2.2/LICENSE-APACHE
third_party/rust/httparse-1.2.2/LICENSE-MIT
third_party/rust/httparse-1.2.2/README.md
third_party/rust/httparse-1.2.2/benches/parse.rs
third_party/rust/httparse-1.2.2/src/iter.rs
third_party/rust/httparse-1.2.2/src/lib.rs
third_party/rust/hyper-0.10.10/.cargo-checksum.json
third_party/rust/hyper-0.10.10/Cargo.toml
third_party/rust/hyper-0.10.10/LICENSE
third_party/rust/hyper-0.10.10/build.rs
third_party/rust/hyper-0.10.10/src/buffer.rs
third_party/rust/hyper-0.10.10/src/client/mod.rs
third_party/rust/hyper-0.10.10/src/client/pool.rs
third_party/rust/hyper-0.10.10/src/client/proxy.rs
third_party/rust/hyper-0.10.10/src/client/request.rs
third_party/rust/hyper-0.10.10/src/client/response.rs
third_party/rust/hyper-0.10.10/src/error.rs
third_party/rust/hyper-0.10.10/src/header/common/accept.rs
third_party/rust/hyper-0.10.10/src/header/common/accept_charset.rs
third_party/rust/hyper-0.10.10/src/header/common/accept_encoding.rs
third_party/rust/hyper-0.10.10/src/header/common/accept_language.rs
third_party/rust/hyper-0.10.10/src/header/common/accept_ranges.rs
third_party/rust/hyper-0.10.10/src/header/common/access_control_allow_credentials.rs
third_party/rust/hyper-0.10.10/src/header/common/access_control_allow_headers.rs
third_party/rust/hyper-0.10.10/src/header/common/access_control_allow_methods.rs
third_party/rust/hyper-0.10.10/src/header/common/access_control_allow_origin.rs
third_party/rust/hyper-0.10.10/src/header/common/access_control_expose_headers.rs
third_party/rust/hyper-0.10.10/src/header/common/access_control_max_age.rs
third_party/rust/hyper-0.10.10/src/header/common/access_control_request_headers.rs
third_party/rust/hyper-0.10.10/src/header/common/access_control_request_method.rs
third_party/rust/hyper-0.10.10/src/header/common/allow.rs
third_party/rust/hyper-0.10.10/src/header/common/authorization.rs
third_party/rust/hyper-0.10.10/src/header/common/cache_control.rs
third_party/rust/hyper-0.10.10/src/header/common/connection.rs
third_party/rust/hyper-0.10.10/src/header/common/content_disposition.rs
third_party/rust/hyper-0.10.10/src/header/common/content_encoding.rs
third_party/rust/hyper-0.10.10/src/header/common/content_language.rs
third_party/rust/hyper-0.10.10/src/header/common/content_length.rs
third_party/rust/hyper-0.10.10/src/header/common/content_range.rs
third_party/rust/hyper-0.10.10/src/header/common/content_type.rs
third_party/rust/hyper-0.10.10/src/header/common/cookie.rs
third_party/rust/hyper-0.10.10/src/header/common/date.rs
third_party/rust/hyper-0.10.10/src/header/common/etag.rs
third_party/rust/hyper-0.10.10/src/header/common/expect.rs
third_party/rust/hyper-0.10.10/src/header/common/expires.rs
third_party/rust/hyper-0.10.10/src/header/common/from.rs
third_party/rust/hyper-0.10.10/src/header/common/host.rs
third_party/rust/hyper-0.10.10/src/header/common/if_match.rs
third_party/rust/hyper-0.10.10/src/header/common/if_modified_since.rs
third_party/rust/hyper-0.10.10/src/header/common/if_none_match.rs
third_party/rust/hyper-0.10.10/src/header/common/if_range.rs
third_party/rust/hyper-0.10.10/src/header/common/if_unmodified_since.rs
third_party/rust/hyper-0.10.10/src/header/common/last-event-id.rs
third_party/rust/hyper-0.10.10/src/header/common/last_modified.rs
third_party/rust/hyper-0.10.10/src/header/common/location.rs
third_party/rust/hyper-0.10.10/src/header/common/mod.rs
third_party/rust/hyper-0.10.10/src/header/common/origin.rs
third_party/rust/hyper-0.10.10/src/header/common/pragma.rs
third_party/rust/hyper-0.10.10/src/header/common/prefer.rs
third_party/rust/hyper-0.10.10/src/header/common/preference_applied.rs
third_party/rust/hyper-0.10.10/src/header/common/range.rs
third_party/rust/hyper-0.10.10/src/header/common/referer.rs
third_party/rust/hyper-0.10.10/src/header/common/referrer_policy.rs
third_party/rust/hyper-0.10.10/src/header/common/server.rs
third_party/rust/hyper-0.10.10/src/header/common/set_cookie.rs
third_party/rust/hyper-0.10.10/src/header/common/strict_transport_security.rs
third_party/rust/hyper-0.10.10/src/header/common/transfer_encoding.rs
third_party/rust/hyper-0.10.10/src/header/common/upgrade.rs
third_party/rust/hyper-0.10.10/src/header/common/user_agent.rs
third_party/rust/hyper-0.10.10/src/header/common/vary.rs
third_party/rust/hyper-0.10.10/src/header/internals/cell.rs
third_party/rust/hyper-0.10.10/src/header/internals/item.rs
third_party/rust/hyper-0.10.10/src/header/internals/mod.rs
third_party/rust/hyper-0.10.10/src/header/internals/vec_map.rs
third_party/rust/hyper-0.10.10/src/header/mod.rs
third_party/rust/hyper-0.10.10/src/header/parsing.rs
third_party/rust/hyper-0.10.10/src/header/shared/charset.rs
third_party/rust/hyper-0.10.10/src/header/shared/encoding.rs
third_party/rust/hyper-0.10.10/src/header/shared/entity.rs
third_party/rust/hyper-0.10.10/src/header/shared/httpdate.rs
third_party/rust/hyper-0.10.10/src/header/shared/mod.rs
third_party/rust/hyper-0.10.10/src/header/shared/quality_item.rs
third_party/rust/hyper-0.10.10/src/http/h1.rs
third_party/rust/hyper-0.10.10/src/http/message.rs
third_party/rust/hyper-0.10.10/src/http/mod.rs
third_party/rust/hyper-0.10.10/src/lib.rs
third_party/rust/hyper-0.10.10/src/method.rs
third_party/rust/hyper-0.10.10/src/mock.rs
third_party/rust/hyper-0.10.10/src/net.rs
third_party/rust/hyper-0.10.10/src/server/listener.rs
third_party/rust/hyper-0.10.10/src/server/mod.rs
third_party/rust/hyper-0.10.10/src/server/request.rs
third_party/rust/hyper-0.10.10/src/server/response.rs
third_party/rust/hyper-0.10.10/src/status.rs
third_party/rust/hyper-0.10.10/src/uri.rs
third_party/rust/hyper-0.10.10/src/version.rs
third_party/rust/lazy_static-0.2.2/.cargo-checksum.json
third_party/rust/lazy_static-0.2.2/.travis.yml
third_party/rust/lazy_static-0.2.2/Cargo.toml
third_party/rust/lazy_static-0.2.2/LICENSE
third_party/rust/lazy_static-0.2.2/README.md
third_party/rust/lazy_static-0.2.2/src/core_lazy.rs
third_party/rust/lazy_static-0.2.2/src/lazy.rs
third_party/rust/lazy_static-0.2.2/src/lib.rs
third_party/rust/lazy_static-0.2.2/src/nightly_lazy.rs
third_party/rust/lazy_static-0.2.2/tests/no_std.rs
third_party/rust/lazy_static-0.2.2/tests/test.rs
third_party/rust/log-0.3.6/.cargo-checksum.json
third_party/rust/log-0.3.6/.travis.yml
third_party/rust/log-0.3.6/Cargo.toml
third_party/rust/log-0.3.6/LICENSE-APACHE
third_party/rust/log-0.3.6/LICENSE-MIT
third_party/rust/log-0.3.6/README.md
third_party/rust/log-0.3.6/appveyor.yml
third_party/rust/log-0.3.6/src/lib.rs
third_party/rust/log-0.3.6/src/macros.rs
third_party/rust/log-0.3.6/tests/filters.rs
third_party/rust/mime-0.2.4/.cargo-checksum.json
third_party/rust/mime-0.2.4/.travis.yml
third_party/rust/mime-0.2.4/Cargo.toml
third_party/rust/mime-0.2.4/LICENSE
third_party/rust/mime-0.2.4/README.md
third_party/rust/mime-0.2.4/src/lib.rs
third_party/rust/num-traits-0.1.37/.cargo-checksum.json
third_party/rust/num-traits-0.1.37/Cargo.toml
third_party/rust/num-traits-0.1.37/LICENSE-APACHE
third_party/rust/num-traits-0.1.37/LICENSE-MIT
third_party/rust/num-traits-0.1.37/src/bounds.rs
third_party/rust/num-traits-0.1.37/src/cast.rs
third_party/rust/num-traits-0.1.37/src/float.rs
third_party/rust/num-traits-0.1.37/src/identities.rs
third_party/rust/num-traits-0.1.37/src/int.rs
third_party/rust/num-traits-0.1.37/src/lib.rs
third_party/rust/num-traits-0.1.37/src/ops/checked.rs
third_party/rust/num-traits-0.1.37/src/ops/mod.rs
third_party/rust/num-traits-0.1.37/src/ops/saturating.rs
third_party/rust/num-traits-0.1.37/src/ops/wrapping.rs
third_party/rust/num-traits-0.1.37/src/pow.rs
third_party/rust/num-traits-0.1.37/src/sign.rs
third_party/rust/num_cpus-1.2.1/.cargo-checksum.json
third_party/rust/num_cpus-1.2.1/.travis.yml
third_party/rust/num_cpus-1.2.1/Cargo.toml
third_party/rust/num_cpus-1.2.1/LICENSE-APACHE
third_party/rust/num_cpus-1.2.1/LICENSE-MIT
third_party/rust/num_cpus-1.2.1/README.md
third_party/rust/num_cpus-1.2.1/src/lib.rs
third_party/rust/quasi/.cargo-checksum.json
third_party/rust/quasi/Cargo.toml
third_party/rust/quasi/src/lib.rs
third_party/rust/quasi_codegen/.cargo-checksum.json
third_party/rust/quasi_codegen/Cargo.toml
third_party/rust/quasi_codegen/src/lib.rs
third_party/rust/regex-0.2.1/.cargo-checksum.json
third_party/rust/regex-0.2.1/.travis.yml
third_party/rust/regex-0.2.1/CHANGELOG.md
third_party/rust/regex-0.2.1/Cargo.toml
third_party/rust/regex-0.2.1/HACKING.md
third_party/rust/regex-0.2.1/LICENSE-APACHE
third_party/rust/regex-0.2.1/LICENSE-MIT
third_party/rust/regex-0.2.1/PERFORMANCE.md
third_party/rust/regex-0.2.1/README.md
third_party/rust/regex-0.2.1/appveyor.yml
third_party/rust/regex-0.2.1/ci/after_success.sh
third_party/rust/regex-0.2.1/ci/run-kcov
third_party/rust/regex-0.2.1/ci/run-shootout-test
third_party/rust/regex-0.2.1/ci/script.sh
third_party/rust/regex-0.2.1/examples/regexdna-input.txt
third_party/rust/regex-0.2.1/examples/regexdna-output.txt
third_party/rust/regex-0.2.1/examples/shootout-regex-dna-bytes.rs
third_party/rust/regex-0.2.1/examples/shootout-regex-dna-cheat.rs
third_party/rust/regex-0.2.1/examples/shootout-regex-dna-replace.rs
third_party/rust/regex-0.2.1/examples/shootout-regex-dna-single-cheat.rs
third_party/rust/regex-0.2.1/examples/shootout-regex-dna-single.rs
third_party/rust/regex-0.2.1/examples/shootout-regex-dna.rs
third_party/rust/regex-0.2.1/scripts/frequencies.py
third_party/rust/regex-0.2.1/scripts/regex-match-tests.py
third_party/rust/regex-0.2.1/scripts/unicode.py
third_party/rust/regex-0.2.1/src/backtrack.rs
third_party/rust/regex-0.2.1/src/compile.rs
third_party/rust/regex-0.2.1/src/dfa.rs
third_party/rust/regex-0.2.1/src/error.rs
third_party/rust/regex-0.2.1/src/exec.rs
third_party/rust/regex-0.2.1/src/expand.rs
third_party/rust/regex-0.2.1/src/freqs.rs
third_party/rust/regex-0.2.1/src/input.rs
third_party/rust/regex-0.2.1/src/lib.rs
third_party/rust/regex-0.2.1/src/literals.rs
third_party/rust/regex-0.2.1/src/pattern.rs
third_party/rust/regex-0.2.1/src/pikevm.rs
third_party/rust/regex-0.2.1/src/prog.rs
third_party/rust/regex-0.2.1/src/re_builder.rs
third_party/rust/regex-0.2.1/src/re_bytes.rs
third_party/rust/regex-0.2.1/src/re_plugin.rs
third_party/rust/regex-0.2.1/src/re_set.rs
third_party/rust/regex-0.2.1/src/re_trait.rs
third_party/rust/regex-0.2.1/src/re_unicode.rs
third_party/rust/regex-0.2.1/src/simd_accel/mod.rs
third_party/rust/regex-0.2.1/src/simd_accel/teddy128.rs
third_party/rust/regex-0.2.1/src/simd_fallback/mod.rs
third_party/rust/regex-0.2.1/src/simd_fallback/teddy128.rs
third_party/rust/regex-0.2.1/src/sparse.rs
third_party/rust/regex-0.2.1/src/testdata/LICENSE
third_party/rust/regex-0.2.1/src/testdata/README
third_party/rust/regex-0.2.1/src/testdata/basic.dat
third_party/rust/regex-0.2.1/src/testdata/nullsubexpr.dat
third_party/rust/regex-0.2.1/src/testdata/repetition.dat
third_party/rust/regex-0.2.1/src/utf8.rs
third_party/rust/regex-0.2.1/tests/api.rs
third_party/rust/regex-0.2.1/tests/api_str.rs
third_party/rust/regex-0.2.1/tests/bytes.rs
third_party/rust/regex-0.2.1/tests/crazy.rs
third_party/rust/regex-0.2.1/tests/flags.rs
third_party/rust/regex-0.2.1/tests/fowler.rs
third_party/rust/regex-0.2.1/tests/macros.rs
third_party/rust/regex-0.2.1/tests/macros_bytes.rs
third_party/rust/regex-0.2.1/tests/macros_str.rs
third_party/rust/regex-0.2.1/tests/misc.rs
third_party/rust/regex-0.2.1/tests/multiline.rs
third_party/rust/regex-0.2.1/tests/noparse.rs
third_party/rust/regex-0.2.1/tests/plugin.rs
third_party/rust/regex-0.2.1/tests/regression.rs
third_party/rust/regex-0.2.1/tests/replace.rs
third_party/rust/regex-0.2.1/tests/searcher.rs
third_party/rust/regex-0.2.1/tests/set.rs
third_party/rust/regex-0.2.1/tests/shortest_match.rs
third_party/rust/regex-0.2.1/tests/suffix_reverse.rs
third_party/rust/regex-0.2.1/tests/test_backtrack.rs
third_party/rust/regex-0.2.1/tests/test_backtrack_bytes.rs
third_party/rust/regex-0.2.1/tests/test_backtrack_utf8bytes.rs
third_party/rust/regex-0.2.1/tests/test_default.rs
third_party/rust/regex-0.2.1/tests/test_default_bytes.rs
third_party/rust/regex-0.2.1/tests/test_nfa.rs
third_party/rust/regex-0.2.1/tests/test_nfa_bytes.rs
third_party/rust/regex-0.2.1/tests/test_nfa_utf8bytes.rs
third_party/rust/regex-0.2.1/tests/test_plugin.rs
third_party/rust/regex-0.2.1/tests/unicode.rs
third_party/rust/regex-0.2.1/tests/word_boundary.rs
third_party/rust/regex-0.2.1/tests/word_boundary_ascii.rs
third_party/rust/regex-0.2.1/tests/word_boundary_unicode.rs
third_party/rust/regex-syntax-0.4.0/.cargo-checksum.json
third_party/rust/regex-syntax-0.4.0/Cargo.toml
third_party/rust/regex-syntax-0.4.0/src/lib.rs
third_party/rust/regex-syntax-0.4.0/src/literals.rs
third_party/rust/regex-syntax-0.4.0/src/parser.rs
third_party/rust/regex-syntax-0.4.0/src/properties.rs
third_party/rust/regex-syntax-0.4.0/src/unicode.rs
third_party/rust/rustc-serialize-0.3.22/.cargo-checksum.json
third_party/rust/rustc-serialize-0.3.22/.travis.yml
third_party/rust/rustc-serialize-0.3.22/Cargo.toml
third_party/rust/rustc-serialize-0.3.22/LICENSE-APACHE
third_party/rust/rustc-serialize-0.3.22/LICENSE-MIT
third_party/rust/rustc-serialize-0.3.22/README.md
third_party/rust/rustc-serialize-0.3.22/appveyor.yml
third_party/rust/rustc-serialize-0.3.22/benches/base64.rs
third_party/rust/rustc-serialize-0.3.22/benches/hex.rs
third_party/rust/rustc-serialize-0.3.22/benches/json.rs
third_party/rust/rustc-serialize-0.3.22/src/base64.rs
third_party/rust/rustc-serialize-0.3.22/src/collection_impls.rs
third_party/rust/rustc-serialize-0.3.22/src/hex.rs
third_party/rust/rustc-serialize-0.3.22/src/json.rs
third_party/rust/rustc-serialize-0.3.22/src/lib.rs
third_party/rust/rustc-serialize-0.3.22/src/serialize.rs
third_party/rust/rustc_version/.cargo-checksum.json
third_party/rust/rustc_version/.travis.yml
third_party/rust/rustc_version/Cargo.toml
third_party/rust/rustc_version/LICENSE-APACHE
third_party/rust/rustc_version/LICENSE-MIT
third_party/rust/rustc_version/README.md
third_party/rust/rustc_version/src/lib.rs
third_party/rust/semver-0.1.20/.cargo-checksum.json
third_party/rust/semver-0.1.20/.travis.yml
third_party/rust/semver-0.1.20/Cargo.toml
third_party/rust/semver-0.1.20/LICENSE-APACHE
third_party/rust/semver-0.1.20/LICENSE-MIT
third_party/rust/semver-0.1.20/README.md
third_party/rust/semver-0.1.20/src/lib.rs
third_party/rust/semver-0.1.20/src/version.rs
third_party/rust/semver-0.1.20/src/version_req.rs
third_party/rust/syntex/.cargo-checksum.json
third_party/rust/syntex/Cargo.toml
third_party/rust/syntex/LICENSE-APACHE
third_party/rust/syntex/LICENSE-MIT
third_party/rust/syntex/README.md
third_party/rust/syntex/src/error.rs
third_party/rust/syntex/src/lib.rs
third_party/rust/syntex/src/registry.rs
third_party/rust/syntex/src/resolver.rs
third_party/rust/syntex/src/stack.rs
third_party/rust/syntex_errors/.cargo-checksum.json
third_party/rust/syntex_errors/Cargo.toml
third_party/rust/syntex_errors/LICENSE-APACHE
third_party/rust/syntex_errors/LICENSE-MIT
third_party/rust/syntex_errors/README.md
third_party/rust/syntex_errors/src/diagnostic.rs
third_party/rust/syntex_errors/src/diagnostic_builder.rs
third_party/rust/syntex_errors/src/emitter.rs
third_party/rust/syntex_errors/src/lib.rs
third_party/rust/syntex_errors/src/lock.rs
third_party/rust/syntex_errors/src/registry.rs
third_party/rust/syntex_errors/src/snippet.rs
third_party/rust/syntex_errors/src/styled_buffer.rs
third_party/rust/syntex_pos/.cargo-checksum.json
third_party/rust/syntex_pos/Cargo.toml
third_party/rust/syntex_pos/LICENSE-APACHE
third_party/rust/syntex_pos/LICENSE-MIT
third_party/rust/syntex_pos/README.md
third_party/rust/syntex_pos/src/lib.rs
third_party/rust/syntex_syntax/.cargo-checksum.json
third_party/rust/syntex_syntax/Cargo.toml
third_party/rust/syntex_syntax/LICENSE-APACHE
third_party/rust/syntex_syntax/LICENSE-MIT
third_party/rust/syntex_syntax/README.md
third_party/rust/syntex_syntax/src/abi.rs
third_party/rust/syntex_syntax/src/ast.rs
third_party/rust/syntex_syntax/src/attr.rs
third_party/rust/syntex_syntax/src/codemap.rs
third_party/rust/syntex_syntax/src/config.rs
third_party/rust/syntex_syntax/src/diagnostic_list.rs
third_party/rust/syntex_syntax/src/diagnostics/macros.rs
third_party/rust/syntex_syntax/src/diagnostics/metadata.rs
third_party/rust/syntex_syntax/src/diagnostics/plugin.rs
third_party/rust/syntex_syntax/src/entry.rs
third_party/rust/syntex_syntax/src/ext/base.rs
third_party/rust/syntex_syntax/src/ext/build.rs
third_party/rust/syntex_syntax/src/ext/decorator.rs
third_party/rust/syntex_syntax/src/ext/env.rs
third_party/rust/syntex_syntax/src/ext/expand.rs
third_party/rust/syntex_syntax/src/ext/hygiene.rs
third_party/rust/syntex_syntax/src/ext/placeholders.rs
third_party/rust/syntex_syntax/src/ext/quote.rs
third_party/rust/syntex_syntax/src/ext/source_util.rs
third_party/rust/syntex_syntax/src/ext/tt/macro_parser.rs
third_party/rust/syntex_syntax/src/ext/tt/macro_rules.rs
third_party/rust/syntex_syntax/src/ext/tt/transcribe.rs
third_party/rust/syntex_syntax/src/feature_gate.rs
third_party/rust/syntex_syntax/src/fold.rs
third_party/rust/syntex_syntax/src/json.rs
third_party/rust/syntex_syntax/src/lib.rs
third_party/rust/syntex_syntax/src/parse/attr.rs
third_party/rust/syntex_syntax/src/parse/classify.rs
third_party/rust/syntex_syntax/src/parse/common.rs
third_party/rust/syntex_syntax/src/parse/lexer/comments.rs
third_party/rust/syntex_syntax/src/parse/lexer/mod.rs
third_party/rust/syntex_syntax/src/parse/lexer/tokentrees.rs
third_party/rust/syntex_syntax/src/parse/lexer/unicode_chars.rs
third_party/rust/syntex_syntax/src/parse/mod.rs
third_party/rust/syntex_syntax/src/parse/obsolete.rs
third_party/rust/syntex_syntax/src/parse/parser.rs
third_party/rust/syntex_syntax/src/parse/token.rs
third_party/rust/syntex_syntax/src/print/pp.rs
third_party/rust/syntex_syntax/src/print/pprust.rs
third_party/rust/syntex_syntax/src/ptr.rs
third_party/rust/syntex_syntax/src/show_span.rs
third_party/rust/syntex_syntax/src/std_inject.rs
third_party/rust/syntex_syntax/src/str.rs
third_party/rust/syntex_syntax/src/symbol.rs
third_party/rust/syntex_syntax/src/test.rs
third_party/rust/syntex_syntax/src/test_snippet.rs
third_party/rust/syntex_syntax/src/tokenstream.rs
third_party/rust/syntex_syntax/src/util/lev_distance.rs
third_party/rust/syntex_syntax/src/util/move_map.rs
third_party/rust/syntex_syntax/src/util/node_count.rs
third_party/rust/syntex_syntax/src/util/parser.rs
third_party/rust/syntex_syntax/src/util/parser_testing.rs
third_party/rust/syntex_syntax/src/util/rc_slice.rs
third_party/rust/syntex_syntax/src/util/small_vector.rs
third_party/rust/syntex_syntax/src/util/thin_vec.rs
third_party/rust/syntex_syntax/src/visit.rs
third_party/rust/term/.cargo-checksum.json
third_party/rust/term/.travis.yml
third_party/rust/term/Cargo.toml
third_party/rust/term/LICENSE-APACHE
third_party/rust/term/LICENSE-MIT
third_party/rust/term/README.md
third_party/rust/term/appveyor.yml
third_party/rust/term/rustfmt.toml
third_party/rust/term/scripts/id_rsa.enc
third_party/rust/term/scripts/travis-doc-upload.cfg
third_party/rust/term/src/lib.rs
third_party/rust/term/src/terminfo/mod.rs
third_party/rust/term/src/terminfo/parm.rs
third_party/rust/term/src/terminfo/parser/compiled.rs
third_party/rust/term/src/terminfo/parser/names.rs
third_party/rust/term/src/terminfo/searcher.rs
third_party/rust/term/src/win.rs
third_party/rust/term/tests/data/dumb
third_party/rust/term/tests/data/linux
third_party/rust/term/tests/data/linux-16color
third_party/rust/term/tests/data/linux-basic
third_party/rust/term/tests/data/linux-c
third_party/rust/term/tests/data/linux-c-nc
third_party/rust/term/tests/data/linux-koi8
third_party/rust/term/tests/data/linux-koi8r
third_party/rust/term/tests/data/linux-lat
third_party/rust/term/tests/data/linux-m
third_party/rust/term/tests/data/linux-nic
third_party/rust/term/tests/data/linux-vt
third_party/rust/term/tests/data/linux2.2
third_party/rust/term/tests/data/linux2.6
third_party/rust/term/tests/data/linux2.6.26
third_party/rust/term/tests/data/linux3.0
third_party/rust/term/tests/data/rxvt
third_party/rust/term/tests/data/rxvt-16color
third_party/rust/term/tests/data/rxvt-256color
third_party/rust/term/tests/data/rxvt-88color
third_party/rust/term/tests/data/rxvt-basic
third_party/rust/term/tests/data/rxvt-color
third_party/rust/term/tests/data/rxvt-cygwin
third_party/rust/term/tests/data/rxvt-cygwin-native
third_party/rust/term/tests/data/rxvt-xpm
third_party/rust/term/tests/data/screen
third_party/rust/term/tests/data/screen-256color
third_party/rust/term/tests/data/xterm
third_party/rust/term/tests/data/xterm-256color
third_party/rust/term/tests/terminfo.rs
third_party/rust/thread-id-3.0.0/.appveyor.yml
third_party/rust/thread-id-3.0.0/.cargo-checksum.json
third_party/rust/thread-id-3.0.0/.travis.yml
third_party/rust/thread-id-3.0.0/Cargo.toml
third_party/rust/thread-id-3.0.0/license
third_party/rust/thread-id-3.0.0/readme.md
third_party/rust/thread-id-3.0.0/src/lib.rs
third_party/rust/unicase-1.4.0/.cargo-checksum.json
third_party/rust/unicase-1.4.0/.travis.yml
third_party/rust/unicase-1.4.0/Cargo.toml
third_party/rust/unicase-1.4.0/LICENSE
third_party/rust/unicase-1.4.0/README.md
third_party/rust/unicase-1.4.0/build.rs
third_party/rust/unicase-1.4.0/src/lib.rs
toolkit/components/thumbnails/BrowserPageThumbs.manifest
toolkit/components/thumbnails/PageThumbsProtocol.js
toolkit/mozapps/extensions/test/addons/test_langpack/chrome.manifest
toolkit/mozapps/extensions/test/addons/test_langpack/install.rdf
toolkit/mozapps/extensions/test/xpcshell/test_langpack.js
toolkit/themes/windows/global/globalBindings.xml
toolkit/themes/windows/global/radio/radio-check-dis.gif
toolkit/themes/windows/global/radio/radio-check.gif
tools/fuzzing/libfuzzer/Makefile.in
--- a/.gitignore
+++ b/.gitignore
@@ -2,16 +2,17 @@
 
 # Filenames that should be ignored wherever they appear
 *~
 *.pyc
 *.pyo
 TAGS
 tags
 ID
+!/browser/extensions/activity-stream/prerendered/id/
 !/browser/extensions/screenshots/webextension/_locales/id/
 .DS_Store*
 *.pdb
 *.egg-info
 
 # Vim swap files.
 .*.sw[a-z]
 
--- a/CLOBBER
+++ b/CLOBBER
@@ -17,9 +17,9 @@
 #
 # Modifying this file will now automatically clobber the buildbot machines \o/
 #
 
 # Are you updating CLOBBER because you think it's needed for your WebIDL
 # changes to stick? As of bug 928195, this shouldn't be necessary! Please
 # don't change CLOBBER for WebIDL changes any more.
 
-Merge day clobber
\ No newline at end of file
+Bug 1413550 - Activity Stream removed a bunch of files that would break ./mach package
new file mode 100644
--- /dev/null
+++ b/accessible/base/XULMap.h
@@ -0,0 +1,5 @@
+/* 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/. */
+
+XULMAP(image, New_MaybeImageOrToolbarButtonAccessible)
--- a/accessible/base/nsAccessibilityService.cpp
+++ b/accessible/base/nsAccessibilityService.cpp
@@ -245,16 +245,34 @@ static Accessible*
 New_HTMLTableHeaderCellIfScope(nsIContent* aContent, Accessible* aContext)
 {
   if (aContext->IsTableRow() && aContext->GetContent() == aContent->GetParent() &&
       aContent->HasAttr(kNameSpaceID_None, nsGkAtoms::scope))
     return new HTMLTableHeaderCellAccessibleWrap(aContent, aContext->Document());
   return nullptr;
 }
 
+#ifdef MOZ_XUL
+static Accessible*
+New_MaybeImageOrToolbarButtonAccessible(nsIContent* aContent,
+                                        Accessible* aContext)
+{
+  if (aContent->HasAttr(kNameSpaceID_None, nsGkAtoms::onclick)) {
+    return new XULToolbarButtonAccessible(aContent, aContext->Document());
+  }
+
+  // Don't include nameless images in accessible tree.
+  if (!aContent->HasAttr(kNameSpaceID_None, nsGkAtoms::tooltiptext)) {
+    return nullptr;
+  }
+
+  return new ImageAccessibleWrap(aContent, aContext->Document());
+}
+#endif
+
 ////////////////////////////////////////////////////////////////////////////////
 // Markup maps array.
 
 #define Attr(name, value) \
   { &nsGkAtoms::name, &nsGkAtoms::value }
 
 #define AttrFromDOM(name, DOMAttrName) \
   { &nsGkAtoms::name, nullptr, &nsGkAtoms::DOMAttrName }
@@ -264,32 +282,47 @@ New_HTMLTableHeaderCellIfScope(nsIConten
 
 #define MARKUPMAP(atom, new_func, r, ... ) \
   { &nsGkAtoms::atom, new_func, static_cast<a11y::role>(r), { __VA_ARGS__ } },
 
 static const MarkupMapInfo sMarkupMapList[] = {
   #include "MarkupMap.h"
 };
 
+#ifdef MOZ_XUL
+#define XULMAP(atom, new_func) \
+  { &nsGkAtoms::atom, new_func },
+
+static const XULMarkupMapInfo sXULMapList[] = {
+  #include "XULMap.h"
+};
+#endif
+
 #undef Attr
 #undef AttrFromDOM
 #undef AttrFromDOMIf
 #undef MARKUPMAP
+#ifdef MOZ_XUL
+#undef XULMAP
+#endif
 
 ////////////////////////////////////////////////////////////////////////////////
 // nsAccessibilityService
 ////////////////////////////////////////////////////////////////////////////////
 
 nsAccessibilityService *nsAccessibilityService::gAccessibilityService = nullptr;
 ApplicationAccessible* nsAccessibilityService::gApplicationAccessible = nullptr;
 xpcAccessibleApplication* nsAccessibilityService::gXPCApplicationAccessible = nullptr;
 uint32_t nsAccessibilityService::gConsumers = 0;
 
 nsAccessibilityService::nsAccessibilityService() :
   DocManager(), FocusManager(), mMarkupMaps(ArrayLength(sMarkupMapList))
+#ifdef MOZ_XUL
+  , mXULMarkupMaps(ArrayLength(sXULMapList))
+#endif
 {
 }
 
 nsAccessibilityService::~nsAccessibilityService()
 {
   NS_ASSERTION(IsShutdown(), "Accessibility wasn't shutdown!");
   gAccessibilityService = nullptr;
 }
@@ -1157,19 +1190,30 @@ nsAccessibilityService::CreateAccessible
       if (deckFrame && deckFrame->GetSelectedBox() != frame) {
         if (aIsSubtreeHidden)
           *aIsSubtreeHidden = true;
 
         return nullptr;
       }
     }
 
+#ifdef MOZ_XUL
+    // Prefer to use XUL to decide if and what kind of accessible to create.
+    const XULMarkupMapInfo* xulMap =
+      mXULMarkupMaps.Get(content->NodeInfo()->NameAtom());
+    if (xulMap && xulMap->new_func) {
+      newAcc = xulMap->new_func(content, aContext);
+    }
+#endif
+
     // XBL bindings may use @role attribute to point the accessible type
     // they belong to.
-    newAcc = CreateAccessibleByType(content, document);
+    if (!newAcc) {
+      newAcc = CreateAccessibleByType(content, document);
+    }
 
     // Any XUL box can be used as tabpanel, make sure we create a proper
     // accessible for it.
     if (!newAcc && aContext->IsXULTabpanels() &&
         content->GetParent() == aContext->GetContent()) {
       LayoutFrameType frameType = frame->Type();
       if (frameType == LayoutFrameType::Box ||
           frameType == LayoutFrameType::Scroll) {
@@ -1271,16 +1315,21 @@ nsAccessibilityService::Init()
   if (!eventListenerService)
     return false;
 
   eventListenerService->AddListenerChangeListener(this);
 
   for (uint32_t i = 0; i < ArrayLength(sMarkupMapList); i++)
     mMarkupMaps.Put(*sMarkupMapList[i].tag, &sMarkupMapList[i]);
 
+#ifdef MOZ_XUL
+  for (uint32_t i = 0; i < ArrayLength(sXULMapList); i++)
+    mXULMarkupMaps.Put(*sXULMapList[i].tag, &sXULMapList[i]);
+#endif
+
 #ifdef A11Y_LOG
   logging::CheckEnv();
 #endif
 
   gAccessibilityService = this;
   NS_ADDREF(gAccessibilityService); // will release in Shutdown()
 
   if (XRE_IsParentProcess()) {
@@ -1416,29 +1465,16 @@ nsAccessibilityService::CreateAccessible
       accessible = new XULTabpanelsAccessible(aContent, aDoc);
 
   } else if (role.EqualsLiteral("xul:dropmarker")) {
       accessible = new XULDropmarkerAccessible(aContent, aDoc);
 
   } else if (role.EqualsLiteral("xul:groupbox")) {
       accessible = new XULGroupboxAccessible(aContent, aDoc);
 
-  } else if (role.EqualsLiteral("xul:image")) {
-    if (aContent->HasAttr(kNameSpaceID_None, nsGkAtoms::onclick)) {
-      accessible = new XULToolbarButtonAccessible(aContent, aDoc);
-
-    } else {
-      // Don't include nameless images in accessible tree.
-      if (!aContent->HasAttr(kNameSpaceID_None,
-                             nsGkAtoms::tooltiptext))
-        return nullptr;
-
-      accessible = new ImageAccessibleWrap(aContent, aDoc);
-    }
-
   } else if (role.EqualsLiteral("xul:link")) {
     accessible = new XULLinkAccessible(aContent, aDoc);
 
   } else if (role.EqualsLiteral("xul:listbox")) {
       accessible = new XULListboxAccessibleWrap(aContent, aDoc);
 
   } else if (role.EqualsLiteral("xul:listcell")) {
     // Only create cells if there's more than one per row.
--- a/accessible/base/nsAccessibilityService.h
+++ b/accessible/base/nsAccessibilityService.h
@@ -62,16 +62,23 @@ struct MarkupAttrInfo {
 
 struct MarkupMapInfo {
   nsStaticAtom** tag;
   New_Accessible* new_func;
   a11y::role role;
   MarkupAttrInfo attrs[4];
 };
 
+#ifdef MOZ_XUL
+struct XULMarkupMapInfo {
+  nsStaticAtom** tag;
+  New_Accessible* new_func;
+};
+#endif
+
 } // namespace a11y
 } // namespace mozilla
 
 class nsAccessibilityService final : public mozilla::a11y::DocManager,
                                      public mozilla::a11y::FocusManager,
                                      public mozilla::a11y::SelectionManager,
                                      public nsIListenerChangeListener,
                                      public nsIObserver
@@ -306,16 +313,19 @@ private:
   static mozilla::a11y::xpcAccessibleApplication* gXPCApplicationAccessible;
 
   /**
    * Contains a set of accessibility service consumers.
    */
   static uint32_t gConsumers;
 
   nsDataHashtable<nsPtrHashKey<const nsAtom>, const mozilla::a11y::MarkupMapInfo*> mMarkupMaps;
+#ifdef MOZ_XUL
+  nsDataHashtable<nsPtrHashKey<const nsAtom>, const mozilla::a11y::XULMarkupMapInfo*> mXULMarkupMaps;
+#endif
 
   friend nsAccessibilityService* GetAccService();
   friend nsAccessibilityService* GetOrCreateAccService(uint32_t);
   friend void MaybeShutdownAccService(uint32_t);
   friend mozilla::a11y::FocusManager* mozilla::a11y::FocusMgr();
   friend mozilla::a11y::SelectionManager* mozilla::a11y::SelectionMgr();
   friend mozilla::a11y::ApplicationAccessible* mozilla::a11y::ApplicationAcc();
   friend mozilla::a11y::xpcAccessibleApplication* mozilla::a11y::XPCApplicationAcc();
--- a/accessible/ipc/win/HandlerProvider.cpp
+++ b/accessible/ipc/win/HandlerProvider.cpp
@@ -4,18 +4,20 @@
  * 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/. */
 
 #define INITGUID
 
 #include "mozilla/a11y/HandlerProvider.h"
 
 #include "Accessible2_3.h"
+#include "AccessibleDocument.h"
 #include "AccessibleTable.h"
 #include "AccessibleTable2.h"
+#include "AccessibleTableCell.h"
 #include "HandlerData.h"
 #include "HandlerData_i.c"
 #include "mozilla/Assertions.h"
 #include "mozilla/a11y/AccessibleWrap.h"
 #include "mozilla/dom/ContentChild.h"
 #include "mozilla/Move.h"
 #include "mozilla/mscom/AgileReference.h"
 #include "mozilla/mscom/FastMarshaler.h"
@@ -335,18 +337,30 @@ HandlerProvider::MarshalAs(REFIID aIid)
   // Otherwise we juse return the identity.
   return aIid;
 }
 
 REFIID
 HandlerProvider::GetEffectiveOutParamIid(REFIID aCallIid,
                                          ULONG aCallMethod)
 {
-  if (aCallIid == IID_IAccessibleTable || aCallIid == IID_IAccessibleTable2) {
-    return IID_IAccessible2_3;
+  if (aCallIid == IID_IAccessibleTable ||
+      aCallIid == IID_IAccessibleTable2 ||
+      aCallIid == IID_IAccessibleDocument ||
+      aCallIid == IID_IAccessibleTableCell ||
+      aCallIid == IID_IAccessibleRelation) {
+    return NEWEST_IA2_IID;
+  }
+
+  // IAccessible2_2::accessibleWithCaret
+  static_assert(&NEWEST_IA2_IID == &IID_IAccessible2_3,
+                "You have modified NEWEST_IA2_IID. This code needs updating.");
+  if ((aCallIid == IID_IAccessible2_2 || aCallIid == IID_IAccessible2_3) &&
+      aCallMethod == 47) {
+    return NEWEST_IA2_IID;
   }
 
   MOZ_ASSERT(false);
   return IID_IUnknown;
 }
 
 HRESULT
 HandlerProvider::NewInstance(REFIID aIid,
--- a/accessible/ipc/win/PlatformChild.cpp
+++ b/accessible/ipc/win/PlatformChild.cpp
@@ -11,16 +11,17 @@
 #include "mozilla/mscom/InterceptorLog.h"
 
 #include "Accessible2.h"
 #include "Accessible2_2.h"
 #include "AccessibleHypertext2.h"
 #include "AccessibleTable2.h"
 #include "AccessibleTableCell.h"
 
+#include "AccessibleDocument_i.c"
 #include "AccessibleHypertext2_i.c"
 
 namespace mozilla {
 namespace a11y {
 
 /**
  * Unfortunately the COM interceptor does not intrinsically handle array
  * outparams. Instead we manually define the relevant metadata here, and
--- a/accessible/tests/mochitest/role/test_general.xul
+++ b/accessible/tests/mochitest/role/test_general.xul
@@ -13,16 +13,21 @@
           src="../common.js"></script>
   <script type="application/javascript"
           src="../role.js"></script>
 
   <script type="application/javascript">
   <![CDATA[
     function doTest()
     {
+      ok(!isAccessible("image"),
+                      "image without tooltiptext shouldn't be accessible.");
+      testRole("image-tooltiptext", ROLE_GRAPHIC);
+      testRole("image-onclick", ROLE_PUSHBUTTON);
+
       ok(!isAccessible("statusbarpanel"),
                       "statusbarpanel shouldn't be accessible.");
       testRole("statusbarpanel-iconic", ROLE_PUSHBUTTON);
       testRole("statusbarpanel-iconic-text", ROLE_PUSHBUTTON);
       testRole("statusbar", ROLE_STATUSBAR);
 
       SimpleTest.finish();
     }
@@ -42,16 +47,20 @@
     </a>
   <p id="display"></p>
     <div id="content" style="display: none">
     </div>
     <pre id="test">
     </pre>
   </body>
 
+  <image id="image" src="../moz.png"/>
+  <image id="image-tooltiptext" src="../moz.png" tooltiptext="hello"/>
+  <image id="image-onclick" src="../moz.png" onclick=""/>
+
   <statusbarpanel id="statusbarpanel"></statusbarpanel>
   <statusbarpanel id="statusbarpanel-iconic" class="statusbarpanel-iconic"></statusbarpanel>
   <statusbarpanel id="statusbarpanel-iconic-text" class="statusbarpanel-iconic-text"></statusbarpanel>
   <statusbar id="statusbar"></statusbar>
 
   </hbox>
 </window>
 
--- a/accessible/tests/mochitest/tree/a11y.ini
+++ b/accessible/tests/mochitest/tree/a11y.ini
@@ -29,16 +29,17 @@ skip-if = true # Bug 561508
 [test_dockids.html]
 [test_filectrl.html]
 [test_formctrl.html]
 skip-if = buildapp == "mulet"
 [test_formctrl.xul]
 [test_gencontent.html]
 [test_groupbox.xul]
 [test_iframe.html]
+[test_image.xul]
 [test_img.html]
 [test_invalid_img.xhtml]
 [test_invalidationlist.html]
 [test_list.html]
 [test_map.html]
 [test_media.html]
 skip-if = buildapp == "mulet"
 [test_select.html]
new file mode 100644
--- /dev/null
+++ b/accessible/tests/mochitest/tree/test_image.xul
@@ -0,0 +1,59 @@
+<?xml version="1.0"?>
+<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
+<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
+                 type="text/css"?>
+
+<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+        title="Accessible XUL textbox and textarea hierarchy tests">
+
+  <script type="application/javascript"
+          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
+
+  <script type="application/javascript"
+          src="../common.js" />
+  <script type="application/javascript"
+          src="../role.js" />
+  <script type="application/javascript"
+          src="../events.js" />
+
+  <script type="application/javascript">
+  <![CDATA[
+    ////////////////////////////////////////////////////////////////////////////
+    // Test
+
+    function doTest()
+    {
+      var accTree = {
+        role: ROLE_GRAPHIC,
+        children: []
+      };
+      testAccessibleTree("image", accTree);
+
+      SimpleTest.finish()
+    }
+
+    SimpleTest.waitForExplicitFinish();
+    addA11yLoadEvent(doTest);
+  ]]>
+  </script>
+
+  <hbox flex="1" style="overflow: auto;">
+    <body xmlns="http://www.w3.org/1999/xhtml">
+      <a target="_blank"
+         href="https://bugzilla.mozilla.org/show_bug.cgi?id=1403231"
+         title="Remove the image XBL binding">
+        Mozilla Bug 1403231
+      </a><br/>
+      <p id="display"></p>
+      <div id="content" style="display: none">
+      </div>
+      <pre id="test">
+      </pre>
+    </body>
+
+    <vbox flex="1">
+      <image id="image" src="../moz.png" tooltiptext="hello"/>
+    </vbox>
+  </hbox>
+
+</window>
--- a/accessible/windows/msaa/Compatibility.cpp
+++ b/accessible/windows/msaa/Compatibility.cpp
@@ -163,17 +163,17 @@ uint32_t Compatibility::sConsumers = Com
 
 void
 Compatibility::Init()
 {
   // Note we collect some AT statistics/telemetry here for convenience.
 
   HMODULE jawsHandle = ::GetModuleHandleW(L"jhook");
   if (jawsHandle)
-    sConsumers |= (IsModuleVersionLessThan(jawsHandle, 20, 0)) ?
+    sConsumers |= (IsModuleVersionLessThan(jawsHandle, 19, 0)) ?
                    OLDJAWS : JAWS;
 
   if (::GetModuleHandleW(L"gwm32inc"))
     sConsumers |= WE;
 
   if (::GetModuleHandleW(L"dolwinhk"))
     sConsumers |= DOLPHIN;
 
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1522,21 +1522,17 @@ pref("experiments.supported", true);
 pref("browser.ping-centre.telemetry", true);
 pref("browser.ping-centre.log", false);
 pref("browser.ping-centre.staging.endpoint", "https://onyx_tiles.stage.mozaws.net/v3/links/ping-centre");
 pref("browser.ping-centre.production.endpoint", "https://tiles.services.mozilla.com/v3/links/ping-centre");
 
 // Enable GMP support in the addon manager.
 pref("media.gmp-provider.enabled", true);
 
-#ifdef NIGHTLY_BUILD
 pref("privacy.trackingprotection.ui.enabled", true);
-#else
-pref("privacy.trackingprotection.ui.enabled", false);
-#endif
 pref("privacy.trackingprotection.introCount", 0);
 pref("privacy.trackingprotection.introURL", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/tracking-protection/start/");
 
 // Enable Contextual Identity Containers
 #ifdef NIGHTLY_BUILD
 pref("privacy.userContext.enabled", true);
 pref("privacy.userContext.ui.enabled", true);
 pref("privacy.usercontext.about_newtab_segregation.enabled", true);
--- a/browser/base/content/browser-tabsintitlebar.js
+++ b/browser/base/content/browser-tabsintitlebar.js
@@ -9,16 +9,21 @@
 var TabsInTitlebar = {
   init() {
     if (this._initialized) {
       return;
     }
     this._readPref();
     Services.prefs.addObserver(this._prefName, this);
 
+    // Always disable on unsupported GTK versions.
+    if (AppConstants.MOZ_WIDGET_TOOLKIT == "gtk3") {
+      this.allowedBy("gtk", window.matchMedia("(-moz-gtk-csd-available)"));
+    }
+
     // We need to update the appearance of the titlebar when the menu changes
     // from the active to the inactive state. We can't, however, rely on
     // DOMMenuBarInactive, because the menu fires this event and then removes
     // the inactive attribute after an event-loop spin.
     //
     // Because updating the appearance involves sampling the heights and margins
     // of various elements, it's important that the layout be more or less
     // settled before updating the titlebar. So instead of listening to
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -335,30 +335,17 @@ toolbarpaletteitem {
 #main-window[inFullscreen] #high-priority-global-notificationbox {
   visibility: collapse;
 }
 
 #navigator-toolbox[fullscreenShouldAnimate] {
   transition: 1.5s margin-top ease-out;
 }
 
-/* Rules to help integrate SDK widgets */
-toolbaritem[sdkstylewidget="true"] > toolbarbutton,
-toolbarpaletteitem > toolbaritem[sdkstylewidget="true"] > iframe,
-toolbarpaletteitem > toolbaritem[sdkstylewidget="true"] > .toolbarbutton-text {
-  display: none;
-}
-
-toolbarpaletteitem:-moz-any([place="palette"], [place="panel"]) > toolbaritem[sdkstylewidget="true"] > toolbarbutton {
-  display: -moz-box;
-}
-
-toolbarpaletteitem > toolbaritem[sdkstylewidget="true"][cui-areatype="toolbar"] > .toolbarbutton-text {
-  display: -moz-box;
-}
+/* Rules to help integrate WebExtension buttons */
 
 .webextension-browser-action > .toolbarbutton-badge-stack > .toolbarbutton-icon {
   height: 16px;
   width: 16px;
 }
 
 @media not all and (min-resolution: 1.1dppx) {
   .webextension-browser-action {
@@ -1167,16 +1154,17 @@ toolbarpaletteitem[place="palette"] > #d
 #BMB_bookmarksPopup[animate="cancel"] {
   -moz-window-transform: none;
 }
 
 %elifndef MOZ_WIDGET_GTK
 
 #BMB_bookmarksPopup:not([animate="false"]) {
   opacity: 0;
+  will-change: transform; /* workaround for bug 1414033 */
   transform: translateY(-70px);
   transition-property: transform, opacity;
   transition-duration: 0.18s, 0.18s;
   transition-timing-function:
     var(--animation-easing-function), ease-out;
 }
 
 #BMB_bookmarksPopup[side="bottom"]:not([animate="false"]) {
@@ -1191,21 +1179,16 @@ toolbarpaletteitem[place="palette"] > #d
     var(--animation-easing-function), ease-in-out;
 }
 
 #BMB_bookmarksPopup[animate="cancel"] {
   transform: none;
 }
 %endif
 
-/* Customize mode */
-#PanelUI-contents > .panel-customization-placeholder > .panel-customization-placeholder-child {
-  list-style-image: none;
-}
-
 /* Apply crisp rendering for favicons at exactly 2dppx resolution */
 @media (resolution: 2dppx) {
   #PanelUI-remotetabs-tabslist > toolbarbutton > .toolbarbutton-icon,
   #PanelUI-recentlyClosedWindows > toolbarbutton > .toolbarbutton-icon,
   #PanelUI-recentlyClosedTabs > toolbarbutton > .toolbarbutton-icon,
   #PanelUI-historyItems > toolbarbutton > .toolbarbutton-icon {
     image-rendering: -moz-crisp-edges;
   }
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -7194,16 +7194,20 @@ var gIdentityHandler = {
   get _isMixedPassiveContentLoaded() {
     return this._state & Ci.nsIWebProgressListener.STATE_LOADED_MIXED_DISPLAY_CONTENT;
   },
 
   get _isCertUserOverridden() {
     return this._state & Ci.nsIWebProgressListener.STATE_CERT_USER_OVERRIDDEN;
   },
 
+  get _isCertDistrustImminent() {
+    return this._state & Ci.nsIWebProgressListener.STATE_CERT_DISTRUST_IMMINENT;
+  },
+
   get _hasInsecureLoginForms() {
     // checks if the page has been flagged for an insecure login. Also checks
     // if the pref to degrade the UI is set to true
     return LoginManagerParent.hasInsecureLoginForms(gBrowser.selectedBrowser) &&
            Services.prefs.getBoolPref("security.insecure_password.ui.enabled");
   },
 
   // smart getters
@@ -7445,16 +7449,29 @@ var gIdentityHandler = {
     if (shouldHidePopup) {
       this._identityPopup.hidePopup();
     }
 
     // NOTE: We do NOT update the identity popup (the control center) when
     // we receive a new security state on the existing page (i.e. from a
     // subframe). If the user opened the popup and looks at the provided
     // information we don't want to suddenly change the panel contents.
+
+    // Finally, if there are warnings to issue, issue them
+    if (this._isCertDistrustImminent) {
+      let consoleMsg = Cc["@mozilla.org/scripterror;1"].createInstance(Ci.nsIScriptError);
+      let windowId = gBrowser.selectedBrowser.innerWindowID;
+      let message = gBrowserBundle.GetStringFromName("certImminentDistrust.message");
+      // Use uri.prePath instead of initWithSourceURI() so that these can be
+      // de-duplicated on the scheme+host+port combination.
+      consoleMsg.initWithWindowID(message, uri.prePath, null, 0, 0,
+                                  Ci.nsIScriptError.warningFlag, "SSL",
+                                  windowId);
+      Services.console.logMessage(consoleMsg);
+    }
   },
 
   /**
    * This is called asynchronously when requested by the Logins module, after
    * the insecure login forms state for the page has been updated.
    */
   refreshForInsecureLoginForms() {
     // Check this._uri because we don't want to refresh the user interface if
--- a/browser/base/content/newtab/grid.js
+++ b/browser/base/content/newtab/grid.js
@@ -178,18 +178,18 @@ var gGrid = {
     let site = document.createElementNS(HTML_NAMESPACE, "div");
     site.classList.add("newtab-site");
     site.setAttribute("draggable", "true");
 
     // Create the site's inner HTML code.
     site.innerHTML =
       '<a class="newtab-link">' +
       '  <span class="newtab-thumbnail placeholder"/>' +
-      '  <span class="newtab-thumbnail thumbnail"/>' +
-      '  <span class="newtab-thumbnail enhanced-content"/>' +
+      '  <img src="" alt="" class="newtab-thumbnail thumbnail"/>' +
+      '  <img src="" alt="" class="newtab-thumbnail enhanced-content"/>' +
       '  <span class="newtab-title"/>' +
       '</a>' +
       '<input type="button" title="' + newTabString("pin") + '"' +
       '       class="newtab-control newtab-control-pin"/>' +
       '<input type="button" title="' + newTabString("block") + '"' +
       '       class="newtab-control newtab-control-block"/>';
 
     this._siteFragment = document.createDocumentFragment();
--- a/browser/base/content/newtab/sites.js
+++ b/browser/base/content/newtab/sites.js
@@ -181,17 +181,17 @@ Site.prototype = {
     let link = gAllPages.enhanced && DirectoryLinksProvider.getEnhancedLink(this.link) ||
                this.link;
 
     let thumbnail = this._querySelector(".newtab-thumbnail.thumbnail");
     if (link.bgColor) {
       thumbnail.style.backgroundColor = link.bgColor;
     }
     let uri = link.imageURI || PageThumbs.getThumbnailURL(this.url);
-    thumbnail.style.backgroundImage = 'url("' + uri + '")';
+    thumbnail.src = uri;
 
     if (THUMBNAIL_PLACEHOLDER_ENABLED &&
         link.type == "history" &&
         link.baseDomain) {
       let placeholder = this._querySelector(".newtab-thumbnail.placeholder");
       let charCodeSum = 0;
       for (let c of link.baseDomain) {
         charCodeSum += c.charCodeAt(0);
@@ -199,17 +199,17 @@ Site.prototype = {
       const COLORS = 16;
       let hue = Math.round((charCodeSum % COLORS) / COLORS * 360);
       placeholder.style.backgroundColor = "hsl(" + hue + ",80%,40%)";
       placeholder.textContent = link.baseDomain.substr(0,1).toUpperCase();
     }
 
     if (link.enhancedImageURI) {
       let enhanced = this._querySelector(".enhanced-content");
-      enhanced.style.backgroundImage = 'url("' + link.enhancedImageURI + '")';
+      enhanced.src = link.enhancedImageURI;
     }
   },
 
   /**
    * Adds event handlers for the site and its buttons.
    */
   _addEventHandlers: function Site_addEventHandlers() {
     // Register drag-and-drop event handlers.
--- a/browser/base/content/test/newtab/browser_newtab_background_captures.js
+++ b/browser/base/content/test/newtab/browser_newtab_background_captures.js
@@ -3,26 +3,27 @@
 
 /**
  * Verifies that hidden, pre-loaded newtabs don't allow background captures, and
  * when unhidden, do allow background captures.
  */
 
 const CAPTURE_PREF = "browser.pagethumbnails.capturing_disabled";
 
+XPCOMUtils.defineLazyServiceGetter(this, "PageThumbsStorageService",
+  "@mozilla.org/thumbnails/pagethumbs-service;1",
+  "nsIPageThumbsStorageService");
+
 add_task(async function() {
-  let imports = {};
-  Cu.import("resource://gre/modules/PageThumbs.jsm", imports);
-
   // Disable captures.
   await pushPrefs([CAPTURE_PREF, false]);
 
   // Make sure the thumbnail doesn't exist yet.
   let url = "http://example.com/";
-  let path = imports.PageThumbsStorage.getFilePathForURL(url);
+  let path = PageThumbsStorageService.getFilePathForURL(url);
   let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
   file.initWithPath(path);
   try {
     file.remove(false);
   } catch (err) {}
 
   // Add a top site.
   await setLinks("-1");
--- a/browser/base/content/test/static/browser_all_files_referenced.js
+++ b/browser/base/content/test/static/browser_all_files_referenced.js
@@ -20,16 +20,18 @@ var gExceptionPaths = [
   "resource://gre/defaults/pref/",
   "resource://shield-recipe-client/node_modules/jexl/lib/",
 
   // https://github.com/mozilla/normandy/issues/577
   "resource://shield-recipe-client/test/",
 
   // https://github.com/mozilla/activity-stream/issues/3053
   "resource://activity-stream/data/content/tippytop/images/",
+  // https://github.com/mozilla/activity-stream/issues/3758
+  "resource://activity-stream/prerendered/",
 
   // browser/extensions/pdfjs/content/build/pdf.js#1999
   "resource://pdf.js/web/images/",
 ];
 
 // These are not part of the omni.ja file, so we find them only when running
 // the test on a non-packaged build.
 if (AppConstants.platform == "macosx")
--- a/browser/base/content/test/static/browser_parsable_css.js
+++ b/browser/base/content/test/static/browser_parsable_css.js
@@ -85,21 +85,21 @@ let allowedImageReferences = [
   {file: "chrome://devtools/skin/images/dock-bottom-minimize@2x.png",
    from: "chrome://devtools/skin/toolbox.css",
    isFromDevTools: true},
   {file: "chrome://devtools/skin/images/dock-bottom-maximize@2x.png",
    from: "chrome://devtools/skin/toolbox.css",
    isFromDevTools: true},
   // Bug 1405539
   {file: "chrome://global/skin/arrow/panelarrow-vertical@2x.png",
-   from: "resource://activity-stream/data/content/activity-stream.css",
+   from: "resource://activity-stream/css/activity-stream.css",
    isFromDevTools: false,
    platforms: ["linux", "win"]},
   {file: "chrome://global/skin/arrow/panelarrow-vertical-themed.svg",
-   from: "resource://activity-stream/data/content/activity-stream.css",
+   from: "resource://activity-stream/css/activity-stream.css",
    isFromDevTools: false,
    platforms: ["macosx"]},
 ];
 
 // Add suffix to stylesheets' URI so that we always load them here and
 // have them parsed. Add a random number so that even if we run this
 // test multiple times, it would be unlikely to affect each other.
 const kPathSuffix = "?always-parse-css-" + Math.random();
--- a/browser/components/customizableui/CustomizeMode.jsm
+++ b/browser/components/customizableui/CustomizeMode.jsm
@@ -102,17 +102,16 @@ function CustomizeMode(aWindow) {
   this.browser = aWindow.gBrowser;
   this.areas = new Set();
 
   // There are two palettes - there's the palette that can be overlayed with
   // toolbar items in browser.xul. This is invisible, and never seen by the
   // user. Then there's the visible palette, which gets populated and displayed
   // to the user when in customizing mode.
   this.visiblePalette = this.document.getElementById(kPaletteId);
-  this.paletteEmptyNotice = this.document.getElementById("customization-empty");
   this.pongArena = this.document.getElementById("customization-pong-arena");
   if (Services.prefs.getCharPref("general.skins.selectedSkin") != "classic/1.0") {
     let lwthemeButton = this.document.getElementById("customization-lwtheme-button");
     lwthemeButton.setAttribute("hidden", "true");
   }
   if (AppConstants.CAN_DRAW_IN_TITLEBAR) {
     this._updateTitlebarCheckbox();
     this._updateDragSpaceCheckbox();
@@ -405,17 +404,16 @@ CustomizeMode.prototype = {
     CustomizableUI.removeListener(this);
 
     this.document.removeEventListener("keypress", this);
 
     let window = this.window;
     let document = this.document;
 
     this.togglePong(false);
-    this.paletteEmptyNotice.hidden = true;
 
     // Disable the reset and undo reset buttons while transitioning:
     let resetButton = this.document.getElementById("customization-reset-button");
     let undoResetButton = this.document.getElementById("customization-undo-reset-button");
     undoResetButton.hidden = resetButton.disabled = true;
 
     this._transitioning = true;
 
@@ -1531,17 +1529,16 @@ CustomizeMode.prototype = {
       this._updateUndoResetButton();
       this._updateEmptyPaletteNotice();
     }
     CustomizableUI.dispatchToolboxEvent("customizationchange");
   },
 
   _updateEmptyPaletteNotice() {
     let paletteItems = this.visiblePalette.getElementsByTagName("toolbarpaletteitem");
-    this.paletteEmptyNotice.hidden = !!paletteItems.length;
     let whimsyButton = this.document.getElementById("whimsy-button");
 
     if (paletteItems.length == 1 &&
         paletteItems[0].id.includes("wrapper-customizableui-special-spring")) {
       whimsyButton.hidden = false;
     } else {
       this.togglePong(false);
       whimsyButton.hidden = true;
@@ -2726,17 +2723,17 @@ CustomizeMode.prototype = {
     let window = this.window;
     rAFHandle = window.requestAnimationFrame(function animate() {
       update();
       draw();
       if (quit) {
         elements.score.textContent = score;
         elements.lives && elements.lives.setAttribute("lives", lives);
         elements.arena.setAttribute("score", score);
-        elements.arena.setAttribute("lives", "0");
+        elements.arena.setAttribute("lives", lives);
       } else {
         rAFHandle = window.requestAnimationFrame(animate);
       }
     });
 
     return uninit;
   },
 };
--- a/browser/components/customizableui/content/customizeMode.inc.xul
+++ b/browser/components/customizableui/content/customizeMode.inc.xul
@@ -3,25 +3,16 @@
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 
 <box id="customization-container" flex="1" hidden="true">
   <box id="customization-content-container">
     <box flex="1" id="customization-palette-container">
       <label id="customization-header">
         &customizeMode.menuAndToolbars.header3;
       </label>
-      <hbox id="customization-empty" hidden="true">
-        <label>&customizeMode.menuAndToolbars.empty;</label>
-        <label onclick="BrowserOpenAddonsMgr('addons://discover/');"
-               onkeypress="BrowserOpenAddonsMgr('addons://discover/');"
-               id="customization-more-tools"
-               class="text-link">
-          &customizeMode.menuAndToolbars.emptyLink;
-        </label>
-      </hbox>
       <vbox id="customization-palette" class="customization-palette" hidden="true"/>
       <vbox id="customization-pong-arena" hidden="true"/>
       <spacer id="customization-spacer"/>
     </box>
     <vbox id="customization-panel-container">
       <vbox id="customization-panelWrapper">
         <box class="panel-arrowbox">
           <image class="panel-arrow" side="top"/>
--- a/browser/components/customizableui/content/panelUI.inc.xul
+++ b/browser/components/customizableui/content/panelUI.inc.xul
@@ -1,335 +1,12 @@
 <!-- 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/. -->
 
-<panel id="PanelUI-popup"
-       role="group"
-       type="arrow"
-       hidden="true"
-       flip="slide"
-       position="bottomcenter topright"
-       noautofocus="true">
-  <panelmultiview id="PanelUI-multiView" mainViewId="PanelUI-mainView"
-                  viewCacheId="appMenu-viewCache">
-    <panelview id="PanelUI-mainView" context="customizationPanelContextMenu"
-               descriptionheightworkaround="true" blockinboxworkaround="true">
-      <vbox id="PanelUI-contents-scroller">
-        <vbox id="PanelUI-contents" class="panelUI-grid"/>
-      </vbox>
-
-      <footer id="PanelUI-footer">
-        <vbox id="PanelUI-footer-addons"></vbox>
-        <toolbarbutton class="panel-banner-item"
-                       label-update-available="&updateAvailable.panelUI.label;"
-                       label-update-manual="&updateManual.panelUI.label;"
-                       label-update-restart="&updateRestart.panelUI.label2;"
-                       oncommand="PanelUI._onBannerItemSelected(event)"
-                       wrap="true"
-                       hidden="true"/>
-        <hbox id="PanelUI-fxa-container">
-          <hbox id="PanelUI-fxa-status"
-                label="&fxaSignedIn.tooltip;"
-                defaultlabel="&fxaSignIn.label;"
-                signedinTooltiptext="&fxaSignedIn.tooltip;"
-                tooltiptext="&fxaSignedIn.tooltip;"
-                errorlabel="&fxaSignInError.label;"
-                unverifiedlabel="&fxaUnverified.label;"
-                onclick="if (event.which == 1) gSync.onMenuPanelCommand();">
-            <image id="PanelUI-fxa-avatar"/>
-            <toolbarbutton id="PanelUI-fxa-label"
-                           label="&fxaSignIn.label;"
-                           fxabrandname="&syncBrand.fxAccount.label;"/>
-          </hbox>
-          <toolbarseparator/>
-          <toolbarbutton id="PanelUI-fxa-icon"
-                         oncommand="gSync.doSync();"
-                         closemenu="none">
-            <observes element="sync-status" attribute="syncstatus"/>
-            <observes element="sync-status" attribute="tooltiptext"/>
-          </toolbarbutton>
-        </hbox>
-
-        <hbox id="PanelUI-footer-inner">
-          <toolbarbutton id="PanelUI-customize" label="&appMenuCustomize.label;"
-                         exitLabel="&appMenuCustomizeExit.label;"
-                         tooltiptext="&appMenuCustomize.tooltip;"
-                         exitTooltiptext="&appMenuCustomizeExit.tooltip;"
-                         closemenu="none"
-                         oncommand="gCustomizeMode.toggle();"/>
-          <toolbarseparator/>
-          <toolbarbutton id="PanelUI-help" label="&helpMenu.label;"
-                         closemenu="none"
-                         tooltiptext="&appMenuHelp.tooltip;"
-                         oncommand="PanelUI.showHelpView(this);"/>
-          <toolbarseparator/>
-          <toolbarbutton id="PanelUI-quit"
-#ifdef XP_WIN
-                         label="&quitApplicationCmdWin2.label;"
-                         tooltiptext="&quitApplicationCmdWin2.tooltip;"
-#else
-#ifdef XP_MACOSX
-                         label="&quitApplicationCmdMac2.label;"
-#else
-                         label="&quitApplicationCmd.label;"
-#endif
-#endif
-                         command="cmd_quitApplication"/>
-        </hbox>
-      </footer>
-    </panelview>
-
-    <panelview id="PanelUI-history" flex="1">
-      <vbox class="panel-subview-body">
-        <toolbarbutton id="appMenuViewHistorySidebar"
-                       label="&appMenuHistory.viewSidebar.label;"
-                       type="checkbox"
-                       class="subviewbutton subviewbutton-iconic"
-                       key="key_gotoHistory"
-                       oncommand="SidebarUI.toggle('viewHistorySidebar'); PanelUI.hide();">
-          <observes element="viewHistorySidebar" attribute="checked"/>
-        </toolbarbutton>
-        <toolbarbutton id="appMenuClearRecentHistory"
-                       label="&appMenuHistory.clearRecent.label;"
-                       class="subviewbutton subviewbutton-iconic"
-                       command="Tools:Sanitize"/>
-        <toolbarseparator/>
-        <toolbarbutton id="appMenuRecentlyClosedTabs"
-                       label="&historyUndoMenu.label;"
-                       class="subviewbutton subviewbutton-iconic subviewbutton-nav"
-                       closemenu="none"
-                       oncommand="PanelUI.showSubView('appMenu-library-recentlyClosedTabs', this)"/>
-        <toolbarbutton id="appMenuRecentlyClosedWindows"
-                       label="&historyUndoWindowMenu.label;"
-                       class="subviewbutton subviewbutton-iconic subviewbutton-nav"
-                       closemenu="none"
-                       oncommand="PanelUI.showSubView('appMenu-library-recentlyClosedWindows', this)"/>
-        <toolbarseparator/>
-        <label value="&appMenuHistory.recentHistory.label;"
-               class="subview-subheader"/>
-        <toolbaritem id="appMenu_historyMenu"
-                     orient="vertical"
-                     smoothscroll="false"
-                     flatList="true"
-                     tooltip="bhTooltip">
-          <!-- history menu items will go here -->
-        </toolbaritem>
-      </vbox>
-      <toolbarbutton id="PanelUI-historyMore"
-                     class="panel-subview-footer subviewbutton"
-                     label="&appMenuHistory.showAll.label;"
-                     oncommand="PlacesCommandHook.showPlacesOrganizer('History'); CustomizableUI.hidePanelForNode(this);"/>
-    </panelview>
-
-    <panelview id="appMenu-library-recentlyClosedTabs"/>
-    <panelview id="appMenu-library-recentlyClosedWindows"/>
-
-    <panelview id="PanelUI-remotetabs" flex="1" class="PanelUI-subView"
-               descriptionheightworkaround="true">
-      <vbox class="panel-subview-body">
-        <!-- this widget has 3 boxes in the body, but only 1 is ever visible -->
-        <!-- When Sync is ready to sync -->
-        <vbox id="PanelUI-remotetabs-main" observes="sync-syncnow-state">
-          <vbox id="PanelUI-remotetabs-buttons">
-            <toolbarbutton id="PanelUI-remotetabs-view-sidebar"
-                           class="subviewbutton subviewbutton-iconic"
-                           observes="viewTabsSidebar"
-                           label="&appMenuRemoteTabs.sidebar.label;"/>
-            <toolbarbutton id="PanelUI-remotetabs-view-managedevices"
-                           class="subviewbutton subviewbutton-iconic"
-                           label="&appMenuRemoteTabs.managedevices.label;"
-                           oncommand="gSync.openDevicesManagementPage('syncedtabs-menupanel');"/>
-            <toolbarbutton id="PanelUI-remotetabs-syncnow"
-                           observes="sync-status"
-                           class="subviewbutton subviewbutton-iconic"
-                           oncommand="gSync.doSync();"
-                           closemenu="none"/>
-            <menuseparator id="PanelUI-remotetabs-separator"/>
-          </vbox>
-          <deck id="PanelUI-remotetabs-deck">
-            <!-- Sync is ready to Sync and the "tabs" engine is enabled -->
-            <vbox id="PanelUI-remotetabs-tabspane">
-              <vbox id="PanelUI-remotetabs-tabslist"
-                    showAllLabel="&appMenuRemoteTabs.showAll.label;"
-                    showAllTooltipText="&appMenuRemoteTabs.showAll.tooltip;"
-                    showMoreLabel="&appMenuRemoteTabs.showMore.label;"
-                    showMoreTooltipText="&appMenuRemoteTabs.showMore.tooltip;"
-                    notabsforclientlabel="&appMenuRemoteTabs.notabs.label;"
-                    />
-            </vbox>
-            <!-- Sync is ready to Sync but the "tabs" engine isn't enabled-->
-            <hbox id="PanelUI-remotetabs-tabsdisabledpane" pack="center" flex="1">
-              <vbox class="PanelUI-remotetabs-instruction-box" align="center">
-                <hbox pack="center">
-                  <image class="fxaSyncIllustration"/>
-                </hbox>
-                <label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.tabsnotsyncing.label;</label>
-                <hbox pack="center">
-                  <toolbarbutton class="PanelUI-remotetabs-prefs-button"
-                                 label="&appMenuRemoteTabs.openprefs.label;"
-                                 oncommand="gSync.openPrefs('synced-tabs');"/>
-                </hbox>
-              </vbox>
-            </hbox>
-            <!-- Sync is ready to Sync but we are still fetching the tabs to show -->
-            <vbox id="PanelUI-remotetabs-fetching">
-              <!-- Show intentionally blank panel, see bug 1239845 -->
-            </vbox>
-            <!-- Sync has only 1 (ie, this) device connected -->
-            <hbox id="PanelUI-remotetabs-nodevicespane" pack="center" flex="1">
-              <vbox class="PanelUI-remotetabs-instruction-box">
-                <hbox pack="center">
-                  <image class="fxaSyncIllustration"/>
-                </hbox>
-                <label class="PanelUI-remotetabs-instruction-title">&appMenuRemoteTabs.noclients.title;</label>
-                <label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.noclients.subtitle;</label>
-                <!-- The inner HTML for PanelUI-remotetabs-mobile-promo is built at runtime -->
-                <label id="PanelUI-remotetabs-mobile-promo" fxAccountsBrand="&syncBrand.fxAccount.label;"/>
-              </vbox>
-            </hbox>
-          </deck>
-        </vbox>
-        <!-- a box to ensure contained boxes are centered horizonally -->
-        <hbox pack="center" flex="1">
-          <!-- When Sync is not configured -->
-          <vbox id="PanelUI-remotetabs-setupsync"
-                flex="1"
-                align="center"
-                class="PanelUI-remotetabs-instruction-box"
-                observes="sync-setup-state">
-            <image class="fxaSyncIllustration"/>
-            <label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.notsignedin.label;</label>
-            <toolbarbutton class="PanelUI-remotetabs-prefs-button"
-                           label="&appMenuRemoteTabs.signin.label;"
-                           oncommand="gSync.openPrefs('synced-tabs');"/>
-          </vbox>
-          <!-- When Sync needs re-authentication. This uses the exact same messaging
-               as "Sync is not configured" but remains a separate box so we get
-               the goodness of observing broadcasters to manage the hidden states -->
-          <vbox id="PanelUI-remotetabs-reauthsync"
-                flex="1"
-                align="center"
-                class="PanelUI-remotetabs-instruction-box"
-                observes="sync-reauth-state">
-            <image class="fxaSyncIllustration"/>
-            <label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.notsignedin.label;</label>
-            <toolbarbutton class="PanelUI-remotetabs-prefs-button"
-                           label="&appMenuRemoteTabs.signin.label;"
-                           oncommand="gSync.openPrefs('synced-tabs');"/>
-          </vbox>
-        </hbox>
-      </vbox>
-    </panelview>
-
-    <panelview id="PanelUI-bookmarks" flex="1" class="PanelUI-subView">
-      <vbox class="panel-subview-body">
-        <toolbarbutton id="panelMenuBookmarkThisPage"
-                       class="subviewbutton subviewbutton-iconic"
-                       observes="bookmarkThisPageBroadcaster"
-                       command="Browser:AddBookmarkAs"
-                       onclick="PanelUI.hide();"/>
-        <toolbarbutton id="panelMenu_bookmarkingTools"
-                       label="&bookmarkingTools.label;"
-                       class="subviewbutton subviewbutton-iconic subviewbutton-nav"
-                       closemenu="none"
-                       oncommand="BookmarkingUI.showBookmarkingTools(this);"/>
-        <toolbarbutton id="panelMenu_searchBookmarks"
-                       label="&searchBookmarks.label;"
-                       class="subviewbutton subviewbutton-iconic"
-                       oncommand="PlacesCommandHook.searchBookmarks(); PanelUI.hide();"/>
-        <toolbarseparator/>
-        <label id="panelMenu_recentBookmarks"
-               value="&recentBookmarks.label;"
-               class="subview-subheader"/>
-        <toolbaritem id="panelMenu_bookmarksMenu"
-                     orient="vertical"
-                     smoothscroll="false"
-                     flatList="true"
-                     tooltip="bhTooltip">
-          <!-- bookmarks menu items will go here -->
-        </toolbaritem>
-      </vbox>
-      <toolbarbutton id="panelMenu_showAllBookmarks"
-                     label="&showAllBookmarks2.label;"
-                     class="subviewbutton panel-subview-footer"
-                     command="Browser:ShowAllBookmarks"
-                     onclick="PanelUI.hide();"/>
-    </panelview>
-
-    <panelview id="PanelUI-feeds" flex="1" oncommand="FeedHandler.subscribeToFeed(null, event);">
-    </panelview>
-
-    <panelview id="PanelUI-containers" flex="1">
-      <vbox id="PanelUI-containersItems"/>
-    </panelview>
-
-    <panelview id="PanelUI-helpView" flex="1" class="PanelUI-subView">
-      <vbox id="PanelUI-helpItems" class="panel-subview-body"/>
-    </panelview>
-
-    <panelview id="PanelUI-developer" flex="1">
-      <vbox id="PanelUI-developerItems" class="panel-subview-body"/>
-    </panelview>
-
-    <panelview id="PanelUI-characterEncodingView" flex="1">
-      <vbox class="panel-subview-body">
-        <vbox id="PanelUI-characterEncodingView-pinned"
-              class="PanelUI-characterEncodingView-list"/>
-        <toolbarseparator/>
-        <vbox id="PanelUI-characterEncodingView-charsets"
-              class="PanelUI-characterEncodingView-list"/>
-        <toolbarseparator/>
-        <vbox>
-          <label id="PanelUI-characterEncodingView-autodetect-label"/>
-          <vbox id="PanelUI-characterEncodingView-autodetect"
-                class="PanelUI-characterEncodingView-list"/>
-        </vbox>
-      </vbox>
-    </panelview>
-
-    <panelview id="PanelUI-panicView" flex="1"
-               descriptionheightworkaround="true">
-      <vbox class="panel-subview-body">
-        <hbox id="PanelUI-panic-timeframe">
-          <image id="PanelUI-panic-timeframe-icon" alt=""/>
-          <vbox flex="1">
-            <hbox id="PanelUI-panic-header">
-              <image id="PanelUI-panic-timeframe-icon-small" alt=""/>
-              <description id="PanelUI-panic-mainDesc" flex="1">&panicButton.view.mainTimeframeDesc;</description>
-            </hbox>
-            <radiogroup id="PanelUI-panic-timeSpan" aria-labelledby="PanelUI-panic-mainDesc" closemenu="none">
-              <radio id="PanelUI-panic-5min" label="&panicButton.view.5min;" selected="true"
-                     value="5" class="subviewradio"/>
-              <radio id="PanelUI-panic-2hr" label="&panicButton.view.2hr;"
-                     value="2" class="subviewradio"/>
-              <radio id="PanelUI-panic-day" label="&panicButton.view.day;"
-                     value="6" class="subviewradio"/>
-            </radiogroup>
-          </vbox>
-        </hbox>
-        <vbox id="PanelUI-panic-explanations">
-          <label id="PanelUI-panic-actionlist-main-label">&panicButton.view.mainActionDesc;</label>
-
-          <label id="PanelUI-panic-actionlist-windows" class="PanelUI-panic-actionlist">&panicButton.view.deleteTabsAndWindows;</label>
-          <label id="PanelUI-panic-actionlist-cookies" class="PanelUI-panic-actionlist">&panicButton.view.deleteCookies;</label>
-          <label id="PanelUI-panic-actionlist-history" class="PanelUI-panic-actionlist">&panicButton.view.deleteHistory;</label>
-          <label id="PanelUI-panic-actionlist-newwindow" class="PanelUI-panic-actionlist">&panicButton.view.openNewWindow;</label>
-
-          <label id="PanelUI-panic-warning">&panicButton.view.undoWarning;</label>
-        </vbox>
-        <button id="PanelUI-panic-view-button"
-                label="&panicButton.view.forgetButton;"/>
-      </vbox>
-    </panelview>
-
-  </panelmultiview>
-
-</panel>
-
 <panel id="widget-overflow"
        role="group"
        type="arrow"
        noautofocus="true"
        position="bottomcenter topright"
        photon="true"
        hidden="true">
   <photonpanelmultiview mainViewId="widget-overflow-mainView" disablekeynav="true">
@@ -670,16 +347,259 @@
 #else
                        label="&quitApplicationCmd.label;"
 #endif
                        key="key_quitApplication"
                        command="cmd_quitApplication"/>
 #endif
       </vbox>
     </panelview>
+    <panelview id="PanelUI-history" flex="1">
+      <vbox class="panel-subview-body">
+        <toolbarbutton id="appMenuViewHistorySidebar"
+                       label="&appMenuHistory.viewSidebar.label;"
+                       type="checkbox"
+                       class="subviewbutton subviewbutton-iconic"
+                       key="key_gotoHistory"
+                       oncommand="SidebarUI.toggle('viewHistorySidebar'); PanelUI.hide();">
+          <observes element="viewHistorySidebar" attribute="checked"/>
+        </toolbarbutton>
+        <toolbarbutton id="appMenuClearRecentHistory"
+                       label="&appMenuHistory.clearRecent.label;"
+                       class="subviewbutton subviewbutton-iconic"
+                       command="Tools:Sanitize"/>
+        <toolbarseparator/>
+        <toolbarbutton id="appMenuRecentlyClosedTabs"
+                       label="&historyUndoMenu.label;"
+                       class="subviewbutton subviewbutton-iconic subviewbutton-nav"
+                       closemenu="none"
+                       oncommand="PanelUI.showSubView('appMenu-library-recentlyClosedTabs', this)"/>
+        <toolbarbutton id="appMenuRecentlyClosedWindows"
+                       label="&historyUndoWindowMenu.label;"
+                       class="subviewbutton subviewbutton-iconic subviewbutton-nav"
+                       closemenu="none"
+                       oncommand="PanelUI.showSubView('appMenu-library-recentlyClosedWindows', this)"/>
+        <toolbarseparator/>
+        <label value="&appMenuHistory.recentHistory.label;"
+               class="subview-subheader"/>
+        <toolbaritem id="appMenu_historyMenu"
+                     orient="vertical"
+                     smoothscroll="false"
+                     flatList="true"
+                     tooltip="bhTooltip">
+          <!-- history menu items will go here -->
+        </toolbaritem>
+      </vbox>
+      <toolbarbutton id="PanelUI-historyMore"
+                     class="panel-subview-footer subviewbutton"
+                     label="&appMenuHistory.showAll.label;"
+                     oncommand="PlacesCommandHook.showPlacesOrganizer('History'); CustomizableUI.hidePanelForNode(this);"/>
+    </panelview>
+
+    <panelview id="appMenu-library-recentlyClosedTabs"/>
+    <panelview id="appMenu-library-recentlyClosedWindows"/>
+
+    <panelview id="PanelUI-remotetabs" flex="1" class="PanelUI-subView"
+               descriptionheightworkaround="true">
+      <vbox class="panel-subview-body">
+        <!-- this widget has 3 boxes in the body, but only 1 is ever visible -->
+        <!-- When Sync is ready to sync -->
+        <vbox id="PanelUI-remotetabs-main" observes="sync-syncnow-state">
+          <vbox id="PanelUI-remotetabs-buttons">
+            <toolbarbutton id="PanelUI-remotetabs-view-sidebar"
+                           class="subviewbutton subviewbutton-iconic"
+                           observes="viewTabsSidebar"
+                           label="&appMenuRemoteTabs.sidebar.label;"/>
+            <toolbarbutton id="PanelUI-remotetabs-view-managedevices"
+                           class="subviewbutton subviewbutton-iconic"
+                           label="&appMenuRemoteTabs.managedevices.label;"
+                           oncommand="gSync.openDevicesManagementPage('syncedtabs-menupanel');"/>
+            <toolbarbutton id="PanelUI-remotetabs-syncnow"
+                           observes="sync-status"
+                           class="subviewbutton subviewbutton-iconic"
+                           oncommand="gSync.doSync();"
+                           closemenu="none"/>
+            <menuseparator id="PanelUI-remotetabs-separator"/>
+          </vbox>
+          <deck id="PanelUI-remotetabs-deck">
+            <!-- Sync is ready to Sync and the "tabs" engine is enabled -->
+            <vbox id="PanelUI-remotetabs-tabspane">
+              <vbox id="PanelUI-remotetabs-tabslist"
+                    showAllLabel="&appMenuRemoteTabs.showAll.label;"
+                    showAllTooltipText="&appMenuRemoteTabs.showAll.tooltip;"
+                    showMoreLabel="&appMenuRemoteTabs.showMore.label;"
+                    showMoreTooltipText="&appMenuRemoteTabs.showMore.tooltip;"
+                    notabsforclientlabel="&appMenuRemoteTabs.notabs.label;"
+                    />
+            </vbox>
+            <!-- Sync is ready to Sync but the "tabs" engine isn't enabled-->
+            <hbox id="PanelUI-remotetabs-tabsdisabledpane" pack="center" flex="1">
+              <vbox class="PanelUI-remotetabs-instruction-box" align="center">
+                <hbox pack="center">
+                  <image class="fxaSyncIllustration"/>
+                </hbox>
+                <label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.tabsnotsyncing.label;</label>
+                <hbox pack="center">
+                  <toolbarbutton class="PanelUI-remotetabs-prefs-button"
+                                 label="&appMenuRemoteTabs.openprefs.label;"
+                                 oncommand="gSync.openPrefs('synced-tabs');"/>
+                </hbox>
+              </vbox>
+            </hbox>
+            <!-- Sync is ready to Sync but we are still fetching the tabs to show -->
+            <vbox id="PanelUI-remotetabs-fetching">
+              <!-- Show intentionally blank panel, see bug 1239845 -->
+            </vbox>
+            <!-- Sync has only 1 (ie, this) device connected -->
+            <hbox id="PanelUI-remotetabs-nodevicespane" pack="center" flex="1">
+              <vbox class="PanelUI-remotetabs-instruction-box">
+                <hbox pack="center">
+                  <image class="fxaSyncIllustration"/>
+                </hbox>
+                <label class="PanelUI-remotetabs-instruction-title">&appMenuRemoteTabs.noclients.title;</label>
+                <label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.noclients.subtitle;</label>
+                <!-- The inner HTML for PanelUI-remotetabs-mobile-promo is built at runtime -->
+                <label id="PanelUI-remotetabs-mobile-promo" fxAccountsBrand="&syncBrand.fxAccount.label;"/>
+              </vbox>
+            </hbox>
+          </deck>
+        </vbox>
+        <!-- a box to ensure contained boxes are centered horizonally -->
+        <hbox pack="center" flex="1">
+          <!-- When Sync is not configured -->
+          <vbox id="PanelUI-remotetabs-setupsync"
+                flex="1"
+                align="center"
+                class="PanelUI-remotetabs-instruction-box"
+                observes="sync-setup-state">
+            <image class="fxaSyncIllustration"/>
+            <label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.notsignedin.label;</label>
+            <toolbarbutton class="PanelUI-remotetabs-prefs-button"
+                           label="&appMenuRemoteTabs.signin.label;"
+                           oncommand="gSync.openPrefs('synced-tabs');"/>
+          </vbox>
+          <!-- When Sync needs re-authentication. This uses the exact same messaging
+               as "Sync is not configured" but remains a separate box so we get
+               the goodness of observing broadcasters to manage the hidden states -->
+          <vbox id="PanelUI-remotetabs-reauthsync"
+                flex="1"
+                align="center"
+                class="PanelUI-remotetabs-instruction-box"
+                observes="sync-reauth-state">
+            <image class="fxaSyncIllustration"/>
+            <label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.notsignedin.label;</label>
+            <toolbarbutton class="PanelUI-remotetabs-prefs-button"
+                           label="&appMenuRemoteTabs.signin.label;"
+                           oncommand="gSync.openPrefs('synced-tabs');"/>
+          </vbox>
+        </hbox>
+      </vbox>
+    </panelview>
+
+    <panelview id="PanelUI-bookmarks" flex="1" class="PanelUI-subView">
+      <vbox class="panel-subview-body">
+        <toolbarbutton id="panelMenuBookmarkThisPage"
+                       class="subviewbutton subviewbutton-iconic"
+                       observes="bookmarkThisPageBroadcaster"
+                       command="Browser:AddBookmarkAs"
+                       onclick="PanelUI.hide();"/>
+        <toolbarbutton id="panelMenu_bookmarkingTools"
+                       label="&bookmarkingTools.label;"
+                       class="subviewbutton subviewbutton-iconic subviewbutton-nav"
+                       closemenu="none"
+                       oncommand="BookmarkingUI.showBookmarkingTools(this);"/>
+        <toolbarbutton id="panelMenu_searchBookmarks"
+                       label="&searchBookmarks.label;"
+                       class="subviewbutton subviewbutton-iconic"
+                       oncommand="PlacesCommandHook.searchBookmarks(); PanelUI.hide();"/>
+        <toolbarseparator/>
+        <label id="panelMenu_recentBookmarks"
+               value="&recentBookmarks.label;"
+               class="subview-subheader"/>
+        <toolbaritem id="panelMenu_bookmarksMenu"
+                     orient="vertical"
+                     smoothscroll="false"
+                     flatList="true"
+                     tooltip="bhTooltip">
+          <!-- bookmarks menu items will go here -->
+        </toolbaritem>
+      </vbox>
+      <toolbarbutton id="panelMenu_showAllBookmarks"
+                     label="&showAllBookmarks2.label;"
+                     class="subviewbutton panel-subview-footer"
+                     command="Browser:ShowAllBookmarks"
+                     onclick="PanelUI.hide();"/>
+    </panelview>
+
+    <panelview id="PanelUI-feeds" flex="1" oncommand="FeedHandler.subscribeToFeed(null, event);">
+    </panelview>
+
+    <panelview id="PanelUI-containers" flex="1">
+      <vbox id="PanelUI-containersItems"/>
+    </panelview>
+
+    <panelview id="PanelUI-helpView" flex="1" class="PanelUI-subView">
+      <vbox id="PanelUI-helpItems" class="panel-subview-body"/>
+    </panelview>
+
+    <panelview id="PanelUI-developer" flex="1">
+      <vbox id="PanelUI-developerItems" class="panel-subview-body"/>
+    </panelview>
+
+    <panelview id="PanelUI-characterEncodingView" flex="1">
+      <vbox class="panel-subview-body">
+        <vbox id="PanelUI-characterEncodingView-pinned"
+              class="PanelUI-characterEncodingView-list"/>
+        <toolbarseparator/>
+        <vbox id="PanelUI-characterEncodingView-charsets"
+              class="PanelUI-characterEncodingView-list"/>
+        <toolbarseparator/>
+        <vbox>
+          <label id="PanelUI-characterEncodingView-autodetect-label"/>
+          <vbox id="PanelUI-characterEncodingView-autodetect"
+                class="PanelUI-characterEncodingView-list"/>
+        </vbox>
+      </vbox>
+    </panelview>
+
+    <panelview id="PanelUI-panicView" flex="1"
+               descriptionheightworkaround="true">
+      <vbox class="panel-subview-body">
+        <hbox id="PanelUI-panic-timeframe">
+          <image id="PanelUI-panic-timeframe-icon" alt=""/>
+          <vbox flex="1">
+            <hbox id="PanelUI-panic-header">
+              <image id="PanelUI-panic-timeframe-icon-small" alt=""/>
+              <description id="PanelUI-panic-mainDesc" flex="1">&panicButton.view.mainTimeframeDesc;</description>
+            </hbox>
+            <radiogroup id="PanelUI-panic-timeSpan" aria-labelledby="PanelUI-panic-mainDesc" closemenu="none">
+              <radio id="PanelUI-panic-5min" label="&panicButton.view.5min;" selected="true"
+                     value="5" class="subviewradio"/>
+              <radio id="PanelUI-panic-2hr" label="&panicButton.view.2hr;"
+                     value="2" class="subviewradio"/>
+              <radio id="PanelUI-panic-day" label="&panicButton.view.day;"
+                     value="6" class="subviewradio"/>
+            </radiogroup>
+          </vbox>
+        </hbox>
+        <vbox id="PanelUI-panic-explanations">
+          <label id="PanelUI-panic-actionlist-main-label">&panicButton.view.mainActionDesc;</label>
+
+          <label id="PanelUI-panic-actionlist-windows" class="PanelUI-panic-actionlist">&panicButton.view.deleteTabsAndWindows;</label>
+          <label id="PanelUI-panic-actionlist-cookies" class="PanelUI-panic-actionlist">&panicButton.view.deleteCookies;</label>
+          <label id="PanelUI-panic-actionlist-history" class="PanelUI-panic-actionlist">&panicButton.view.deleteHistory;</label>
+          <label id="PanelUI-panic-actionlist-newwindow" class="PanelUI-panic-actionlist">&panicButton.view.openNewWindow;</label>
+
+          <label id="PanelUI-panic-warning">&panicButton.view.undoWarning;</label>
+        </vbox>
+        <button id="PanelUI-panic-view-button"
+                label="&panicButton.view.forgetButton;"/>
+      </vbox>
+    </panelview>
+
     <panelview id="appMenu-moreView" title="&moreMenu.label;" class="PanelUI-subView">
       <vbox class="panel-subview-body">
         <toolbarbutton id="appMenu-characterencoding-button"
                        class="subviewbutton subviewbutton-nav"
                        label="&charsetMenu2.label;"
                        closemenu="none"
                        oncommand="PanelUI.showSubView('PanelUI-characterEncodingView', this)"/>
         <toolbarbutton id="appMenu-workoffline-button"
--- a/browser/components/customizableui/test/browser.ini
+++ b/browser/components/customizableui/test/browser.ini
@@ -36,19 +36,16 @@ skip-if = os == "linux"
 
 [browser_914138_widget_API_overflowable_toolbar.js]
 skip-if = os == "linux"
 
 [browser_918049_skipintoolbarset_dnd.js]
 [browser_923857_customize_mode_event_wrapping_during_reset.js]
 [browser_927717_customize_drag_empty_toolbar.js]
 
-[browser_932928_show_notice_when_palette_empty.js]
-disabled=Bug 1163231 - Fails on all platforms
-
 [browser_934113_menubar_removable.js]
 # Because this test is about the menubar, it can't be run on mac
 skip-if = os == "mac"
 
 [browser_934951_zoom_in_toolbar.js]
 [browser_938980_navbar_collapsed.js]
 [browser_938995_indefaultstate_nonremovable.js]
 [browser_940013_registerToolbarNode_calls_registerArea.js]
deleted file mode 100644
--- a/browser/components/customizableui/test/browser_932928_show_notice_when_palette_empty.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/* 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";
-
-// There should be an advert to get more addons when the palette is empty.
-add_task(async function() {
-  await startCustomizing();
-  let visiblePalette = document.getElementById("customization-palette");
-  let emptyPaletteNotice = document.getElementById("customization-empty");
-  is(emptyPaletteNotice.hidden, true, "The empty palette notice should not be shown when there are items in the palette.");
-
-  while (visiblePalette.childElementCount) {
-    gCustomizeMode.addToToolbar(visiblePalette.children[0]);
-  }
-  is(visiblePalette.childElementCount, 0, "There shouldn't be any items remaining in the visible palette.");
-  is(emptyPaletteNotice.hidden, false, "The empty palette notice should be shown when there are no items in the palette.");
-
-  await endCustomizing();
-  await startCustomizing();
-  visiblePalette = document.getElementById("customization-palette");
-  emptyPaletteNotice = document.getElementById("customization-empty");
-  is(emptyPaletteNotice.hidden, false,
-     "The empty palette notice should be shown when there are no items in the palette and cust. mode is re-entered.");
-
-  gCustomizeMode.removeFromArea(document.getElementById("wrapper-home-button"));
-  is(emptyPaletteNotice.hidden, true,
-     "The empty palette notice should not be shown when there is at least one item in the palette.");
-});
-
-add_task(async function asyncCleanup() {
-  await endCustomizing();
-  await resetCustomization();
-});
--- a/browser/components/customizableui/test/browser_switch_to_customize_mode.js
+++ b/browser/components/customizableui/test/browser_switch_to_customize_mode.js
@@ -23,12 +23,10 @@ add_task(async function() {
   is(newKidCount, paletteKidCount, "Should have just as many items in the palette as before.");
   await endCustomizing();
   is(startedCount, 1, "Should have only started once");
   gNavToolbox.removeEventListener("customizationstarting", handler);
   let customizableToolbars = document.querySelectorAll("toolbar[customizable=true]:not([autohide=true])");
   for (let toolbar of customizableToolbars) {
     ok(!toolbar.hasAttribute("customizing"), "Toolbar " + toolbar.id + " is no longer customizing");
   }
-  let menuitem = document.getElementById("PanelUI-customize");
-  isnot(menuitem.getAttribute("label"), menuitem.getAttribute("exitLabel"), "Should have exited successfully");
 });
 
--- a/browser/components/extensions/ext-pageAction.js
+++ b/browser/components/extensions/ext-pageAction.js
@@ -62,17 +62,17 @@ this.pageAction = class extends Extensio
     this.defaults.icon = await StartupCache.get(
       extension, ["pageAction", "default_icon"],
       () => IconDetails.normalize({path: options.default_icon}, extension));
 
     if (!this.browserPageAction) {
       this.browserPageAction = PageActions.addAction(new PageActions.Action({
         id: widgetId,
         title: this.defaults.title,
-        iconURL: this.defaults.icon,
+        iconURL: this.getIconData(this.defaults.icon),
         shownInUrlbar: true,
         disabled: true,
         onCommand: (event, buttonNode) => {
           this.handleClick(event.target.ownerGlobal);
         },
         onBeforePlacedInWindow: browserWindow => {
           if (this.extension.hasPermission("menus") ||
               this.extension.hasPermission("contextMenus")) {
@@ -132,24 +132,33 @@ this.pageAction = class extends Extensio
     this.browserPageAction.setTitle(title, window);
     this.browserPageAction.setTooltip(title, window);
     this.browserPageAction.setDisabled(!tabData.show, window);
 
     let iconURL;
     if (typeof(tabData.icon) == "string") {
       iconURL = IconDetails.escapeUrl(tabData.icon);
     } else {
-      iconURL = Object.entries(tabData.icon).reduce((memo, [size, url]) => {
-        memo[size] = IconDetails.escapeUrl(url);
-        return memo;
-      }, {});
+      iconURL = this.getIconData(tabData.icon);
     }
     this.browserPageAction.setIconURL(iconURL, window);
   }
 
+  getIconData(icons) {
+    let getIcon = size => {
+      let {icon} = IconDetails.getPreferredIcon(icons, this.extension, size);
+      // TODO: implement theme based icon for pageAction (Bug 1398156)
+      return IconDetails.escapeUrl(icon);
+    };
+    return {
+      "16": getIcon(16),
+      "32": getIcon(32),
+    };
+  }
+
   /**
    * Triggers this page action for the given window, with the same effects as
    * if it were clicked by a user.
    *
    * This has no effect if the page action is hidden for the selected tab.
    *
    * @param {Window} window
    */
--- a/browser/components/extensions/test/browser/browser_ext_browserAction_pageAction_icon.js
+++ b/browser/components/extensions/test/browser/browser_ext_browserAction_pageAction_icon.js
@@ -259,26 +259,30 @@ add_task(async function testDetailsObjec
   const RESOLUTION_PREF = "layout.css.devPixelsPerPx";
 
   await extension.startup();
 
   let pageActionId = BrowserPageActions.urlbarButtonNodeIDForActionID(makeWidgetId(extension.id));
   let browserActionWidget = getBrowserActionWidget(extension);
 
   let tests = await extension.awaitMessage("ready");
+
+  // The initial icon should be the default icon since no icon is in the manifest.
+  const DEFAULT_ICON = "chrome://browser/content/extension.svg";
+  let browserActionButton = browserActionWidget.forWindow(window).node;
+  let pageActionImage = document.getElementById(pageActionId);
+  is(getListStyleImage(browserActionButton), DEFAULT_ICON, `browser action has the correct default image`);
+  is(getListStyleImage(pageActionImage), DEFAULT_ICON, `page action has the correct default image`);
+
   for (let test of tests) {
     extension.sendMessage("setIcon", test);
     await extension.awaitMessage("iconSet");
 
     await promiseAnimationFrame();
 
-    let browserActionButton = browserActionWidget.forWindow(window).node;
-    let pageActionImage = document.getElementById(pageActionId);
-
-
     // Test icon sizes in the toolbar/urlbar.
     for (let resolution of Object.keys(test.resolutions)) {
       await SpecialPowers.pushPrefEnv({set: [[RESOLUTION_PREF, resolution]]});
 
       is(window.devicePixelRatio, +resolution, "window has the required resolution");
 
       let imageURL = test.resolutions[resolution];
       is(getListStyleImage(browserActionButton), imageURL, `browser action has the correct image at ${resolution}x resolution`);
--- a/browser/components/newtab/aboutNewTabService.js
+++ b/browser/components/newtab/aboutNewTabService.js
@@ -11,39 +11,38 @@ const {utils: Cu, interfaces: Ci} = Comp
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/AppConstants.jsm");
 
 XPCOMUtils.defineLazyModuleGetter(this, "AboutNewTab",
                                   "resource:///modules/AboutNewTab.jsm");
 
 const LOCAL_NEWTAB_URL = "chrome://browser/content/newtab/newTab.xhtml";
+const TOPIC_APP_QUIT = "quit-application-granted";
+const TOPIC_LOCALES_CHANGE = "intl:requested-locales-changed";
 
-// Debug versions are only available in Nightly
-const ACTIVITY_STREAM_URLS = {
-  "": "resource://activity-stream/data/content/activity-stream.html",
-  "debug": "resource://activity-stream/data/content/activity-stream-debug.html",
-  "prerender": "resource://activity-stream/data/content/activity-stream-prerendered.html",
-  "prerenderdebug": "resource://activity-stream/data/content/activity-stream-prerendered-debug.html",
-};
+// Automated tests ensure packaged locales are in this list. Copied output of:
+// https://github.com/mozilla/activity-stream/blob/master/bin/render-activity-stream-html.js
+const ACTIVITY_STREAM_LOCALES = new Set("en-US ach ar ast az be bg bn-BD bn-IN br bs ca cak cs cy da de dsb el en-GB eo es-AR es-CL es-ES es-MX et eu fa ff fi fr fy-NL ga-IE gd gu-IN he hi-IN hr hsb hu hy-AM ia id it ja ka kab kk km kn ko lij lo lt ltg lv mk ml mr ms my nb-NO ne-NP nl nn-NO pa-IN pl pt-BR pt-PT rm ro ru sk sl sq sr sv-SE ta te th tl tr uk ur uz vi zh-CN zh-TW".split(" "));
 
 const ABOUT_URL = "about:newtab";
 
 const IS_MAIN_PROCESS = Services.appinfo.processType === Services.appinfo.PROCESS_TYPE_DEFAULT;
 
 const IS_RELEASE_OR_BETA = AppConstants.RELEASE_OR_BETA;
 
 // Pref that tells if activity stream is enabled
 const PREF_ACTIVITY_STREAM_ENABLED = "browser.newtabpage.activity-stream.enabled";
 const PREF_ACTIVITY_STREAM_PRERENDER_ENABLED = "browser.newtabpage.activity-stream.prerender";
 const PREF_ACTIVITY_STREAM_DEBUG = "browser.newtabpage.activity-stream.debug";
 
 
 function AboutNewTabService() {
-  Services.obs.addObserver(this, "quit-application-granted");
+  Services.obs.addObserver(this, TOPIC_APP_QUIT);
+  Services.obs.addObserver(this, TOPIC_LOCALES_CHANGE);
   Services.prefs.addObserver(PREF_ACTIVITY_STREAM_ENABLED, this);
   Services.prefs.addObserver(PREF_ACTIVITY_STREAM_PRERENDER_ENABLED, this);
   if (!IS_RELEASE_OR_BETA) {
     Services.prefs.addObserver(PREF_ACTIVITY_STREAM_DEBUG, this);
   }
 
   // More initialization happens here
   this.toggleActivityStream();
@@ -88,16 +87,17 @@ function AboutNewTabService() {
  * LOAD_NORMAL or LOAD_REPLACE flags yield unexpected behaviors, so a roundtrip
  * to the redirector from browser chrome is avoided.
  */
 AboutNewTabService.prototype = {
 
   _newTabURL: ABOUT_URL,
   _activityStreamEnabled: false,
   _activityStreamPrerender: false,
+  _activityStreamPath: "",
   _activityStreamDebug: false,
   _overridden: false,
 
   classID: Components.ID("{dfcd2adc-7867-4d3a-ba70-17501f208142}"),
   QueryInterface: XPCOMUtils.generateQI([
     Ci.nsIAboutNewTabService,
     Ci.nsIObserver
   ]),
@@ -105,35 +105,44 @@ AboutNewTabService.prototype = {
     service: true
   }],
 
   observe(subject, topic, data) {
     switch (topic) {
       case "nsPref:changed":
         if (data === PREF_ACTIVITY_STREAM_ENABLED) {
           if (this.toggleActivityStream()) {
-            Services.obs.notifyObservers(null, "newtab-url-changed", ABOUT_URL);
+            this.notifyChange();
           }
         } else if (data === PREF_ACTIVITY_STREAM_PRERENDER_ENABLED) {
           this._activityStreamPrerender = Services.prefs.getBoolPref(PREF_ACTIVITY_STREAM_PRERENDER_ENABLED);
-          Services.obs.notifyObservers(null, "newtab-url-changed", ABOUT_URL);
+          this.notifyChange();
         } else if (!IS_RELEASE_OR_BETA && data === PREF_ACTIVITY_STREAM_DEBUG) {
           this._activityStreamDebug = Services.prefs.getBoolPref(PREF_ACTIVITY_STREAM_DEBUG, false);
-          Services.obs.notifyObservers(null, "newtab-url-changed", ABOUT_URL);
+          this.updatePrerenderedPath();
+          this.notifyChange();
         }
         break;
-      case "quit-application-granted":
+      case TOPIC_APP_QUIT:
         this.uninit();
         if (IS_MAIN_PROCESS) {
           AboutNewTab.uninit();
         }
         break;
+      case TOPIC_LOCALES_CHANGE:
+        this.updatePrerenderedPath();
+        this.notifyChange();
+        break;
     }
   },
 
+  notifyChange() {
+    Services.obs.notifyObservers(null, "newtab-url-changed", this._newTabURL);
+  },
+
   /**
    * React to changes to the activity stream pref.
    *
    * If browser.newtabpage.activity-stream.enabled is true, this will change the default URL to the
    * activity stream page URL. If browser.newtabpage.activity-stream.enabled is false, the default URL
    * will be a local chrome URL.
    *
    * This will only act if there is a change of state and if not overridden.
@@ -154,33 +163,70 @@ AboutNewTabService.prototype = {
       this._activityStreamEnabled = true;
     } else {
       this._activityStreamEnabled = false;
     }
     this._activityStreamPrerender = Services.prefs.getBoolPref(PREF_ACTIVITY_STREAM_PRERENDER_ENABLED);
     if (!IS_RELEASE_OR_BETA) {
       this._activityStreamDebug = Services.prefs.getBoolPref(PREF_ACTIVITY_STREAM_DEBUG, false);
     }
+    this.updatePrerenderedPath();
     this._newtabURL = ABOUT_URL;
     return true;
   },
 
+  /**
+   * Figure out what path under prerendered to use based on current state.
+   */
+  updatePrerenderedPath() {
+    // Debug files are specially packaged in a non-localized directory
+    let path;
+    if (this._activityStreamDebug) {
+      path = "static";
+    } else {
+      // Use the exact match locale if it's packaged
+      const locale = Services.locale.getRequestedLocale();
+      if (ACTIVITY_STREAM_LOCALES.has(locale)) {
+        path = locale;
+      } else {
+        // Fall back to a shared-language packaged locale
+        const language = locale.split("-")[0];
+        if (ACTIVITY_STREAM_LOCALES.has(language)) {
+          path = language;
+        } else {
+          // Just use the default locale as a final fallback
+          path = "en-US";
+        }
+      }
+    }
+    this._activityStreamPath = `${path}/`;
+  },
+
   /*
    * Returns the default URL.
    *
    * This URL only depends on the browser.newtabpage.activity-stream.enabled pref. Overriding
    * the newtab page has no effect on the result of this function.
    *
    * @returns {String} the default newtab URL, activity-stream or regular depending on browser.newtabpage.activity-stream.enabled
    */
   get defaultURL() {
     if (this.activityStreamEnabled) {
-      const prerender = this.activityStreamPrerender ? "prerender" : "";
-      const debug = this.activityStreamDebug ? "debug" : "";
-      return ACTIVITY_STREAM_URLS[prerender + debug];
+      // Generate the desired activity stream resource depending on state, e.g.,
+      // resource://activity-stream/prerendered/ar/activity-stream.html
+      // resource://activity-stream/prerendered/en-US/activity-stream-prerendered.html
+      // resource://activity-stream/prerendered/static/activity-stream-debug.html
+      return [
+        "resource://activity-stream/prerendered/",
+        this._activityStreamPath,
+        "activity-stream",
+        this._activityStreamPrerender ? "-prerendered" : "",
+        this._activityStreamDebug ? "-debug" : "",
+        ".html"
+      ].join("");
     }
     return LOCAL_NEWTAB_URL;
   },
 
   get newTabURL() {
     return this._newTabURL;
   },
 
@@ -192,17 +238,17 @@ AboutNewTabService.prototype = {
       return;
     } else if (aNewTabURL === "") {
       aNewTabURL = "about:blank";
     }
 
     this.toggleActivityStream(false);
     this._newTabURL = aNewTabURL;
     this._overridden = true;
-    Services.obs.notifyObservers(null, "newtab-url-changed", this._newTabURL);
+    this.notifyChange();
   },
 
   get overridden() {
     return this._overridden;
   },
 
   get activityStreamEnabled() {
     return this._activityStreamEnabled;
@@ -215,24 +261,25 @@ AboutNewTabService.prototype = {
   get activityStreamDebug() {
     return this._activityStreamDebug;
   },
 
   resetNewTabURL() {
     this._overridden = false;
     this._newTabURL = ABOUT_URL;
     this.toggleActivityStream(undefined, true);
-    Services.obs.notifyObservers(null, "newtab-url-changed", this._newTabURL);
+    this.notifyChange();
   },
 
   uninit() {
     if (!this.initialized) {
       return;
     }
-    Services.obs.removeObserver(this, "quit-application-granted");
+    Services.obs.removeObserver(this, TOPIC_APP_QUIT);
+    Services.obs.removeObserver(this, TOPIC_LOCALES_CHANGE);
     Services.prefs.removeObserver(PREF_ACTIVITY_STREAM_ENABLED, this);
     Services.prefs.removeObserver(PREF_ACTIVITY_STREAM_PRERENDER_ENABLED, this);
     if (!IS_RELEASE_OR_BETA) {
       Services.prefs.removeObserver(PREF_ACTIVITY_STREAM_DEBUG, this);
     }
     this.initialized = false;
   }
 };
--- a/browser/components/newtab/tests/browser/browser.ini
+++ b/browser/components/newtab/tests/browser/browser.ini
@@ -1,3 +1,4 @@
 [DEFAULT]
 
+[browser_packaged_as_locales.js]
 [browser_newtab_overrides.js]
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/tests/browser/browser_packaged_as_locales.js
@@ -0,0 +1,52 @@
+const LOCALE_PREF = "general.useragent.locale";
+
+XPCOMUtils.defineLazyServiceGetter(this, "aboutNewTabService",
+                                   "@mozilla.org/browser/aboutnewtab-service;1",
+                                   "nsIAboutNewTabService");
+
+const DEFAULT_URL = "resource://activity-stream/prerendered/en-US/activity-stream-prerendered.html";
+async function getUrlForLocale(locale) {
+  await SpecialPowers.pushPrefEnv({set: [[LOCALE_PREF, locale]]});
+  return aboutNewTabService.defaultURL;
+}
+
+/**
+ * Test that an unknown locale defaults to en-US
+ */
+add_task(async function test_unknown_locale() {
+  const url = await getUrlForLocale("foo-BAR");
+  Assert.equal(url, DEFAULT_URL);
+});
+
+/**
+ * Test that we at least have en-US
+ */
+add_task(async function test_default_locale() {
+  const url = await getUrlForLocale("en-US");
+  Assert.equal(url, DEFAULT_URL);
+});
+
+/**
+ * Test that we use a shared language before en-US
+ */
+add_task(async function test_default_locale() {
+  const url = await getUrlForLocale("de-UNKNOWN");
+  Assert.equal(url, DEFAULT_URL.replace("en-US", "de"));
+});
+
+/**
+ * Tests that all activity stream packaged locales can be referenced / accessed
+ */
+add_task(async function test_all_packaged_locales() {
+  const listing = await (await fetch("resource://activity-stream/prerendered/")).text();
+  for (const line of listing.split("\n").slice(2)) {
+    const [file, , , type] = line.split(" ").slice(1);
+    if (type === "DIRECTORY") {
+      const locale = file.replace("/", "");
+      if (locale !== "static") {
+        const url = await getUrlForLocale(locale);
+        Assert[locale === "en-US" ? "equal" : "notEqual"](url, DEFAULT_URL, `can reference "${locale}" files`);
+      }
+    }
+  }
+});
--- a/browser/components/newtab/tests/xpcshell/test_AboutNewTabService.js
+++ b/browser/components/newtab/tests/xpcshell/test_AboutNewTabService.js
@@ -10,20 +10,20 @@ Cu.import("resource://gre/modules/XPCOMU
 Cu.import("resource://gre/modules/Preferences.jsm");
 Cu.import("resource://gre/modules/AppConstants.jsm");
 XPCOMUtils.defineLazyServiceGetter(this, "aboutNewTabService",
                                    "@mozilla.org/browser/aboutnewtab-service;1",
                                    "nsIAboutNewTabService");
 
 const IS_RELEASE_OR_BETA = AppConstants.RELEASE_OR_BETA;
 
-const ACTIVITY_STREAM_PRERENDER_URL = "resource://activity-stream/data/content/activity-stream-prerendered.html";
-const ACTIVITY_STREAM_PRERENDER_DEBUG_URL = "resource://activity-stream/data/content/activity-stream-prerendered-debug.html";
-const ACTIVITY_STREAM_URL = "resource://activity-stream/data/content/activity-stream.html";
-const ACTIVITY_STREAM_DEBUG_URL = "resource://activity-stream/data/content/activity-stream-debug.html";
+const ACTIVITY_STREAM_PRERENDER_URL = "resource://activity-stream/prerendered/en-US/activity-stream-prerendered.html";
+const ACTIVITY_STREAM_PRERENDER_DEBUG_URL = "resource://activity-stream/prerendered/static/activity-stream-prerendered-debug.html";
+const ACTIVITY_STREAM_URL = "resource://activity-stream/prerendered/en-US/activity-stream.html";
+const ACTIVITY_STREAM_DEBUG_URL = "resource://activity-stream/prerendered/static/activity-stream-debug.html";
 
 const DEFAULT_CHROME_URL = "chrome://browser/content/newtab/newTab.xhtml";
 const DOWNLOADS_URL = "chrome://browser/content/downloads/contentAreaDownloadsView.xul";
 const ACTIVITY_STREAM_PREF = "browser.newtabpage.activity-stream.enabled";
 const ACTIVITY_STREAM_PRERENDER_PREF = "browser.newtabpage.activity-stream.prerender";
 const ACTIVITY_STREAM_DEBUG_PREF = "browser.newtabpage.activity-stream.debug";
 
 function cleanup() {
--- a/browser/components/places/content/controller.js
+++ b/browser/components/places/content/controller.js
@@ -1313,46 +1313,30 @@ PlacesController.prototype = {
     }
 
     let itemsToSelect = [];
     if (PlacesUIUtils.useAsyncTransactions) {
       if (ip.isTag) {
         let urls = items.filter(item => "uri" in item).map(item => Services.io.newURI(item.uri));
         await PlacesTransactions.Tag({ urls, tag: ip.tagName }).transact();
       } else {
-        let transactionData = [];
+        let transactions = [];
 
         let insertionIndex = await ip.getIndex();
-        let parent = ip.guid;
-
-        for (let item of items) {
-          let doCopy = action == "copy";
-
-          // If this is not a copy, check for safety that we can move the
-          // source, otherwise report an error and fallback to a copy.
-          if (!doCopy &&
-              !PlacesControllerDragHelper.canMoveUnwrappedNode(item)) {
-            Components.utils.reportError("Tried to move an unmovable " +
-                           "Places node, reverting to a copy operation.");
-            doCopy = true;
-          }
-
-          transactionData.push([item, type, parent, insertionIndex, doCopy]);
-
-          // Adjust index to make sure items are pasted in the correct
-          // position.  If index is DEFAULT_INDEX, items are just appended.
-          if (insertionIndex != PlacesUtils.bookmarks.DEFAULT_INDEX)
-            insertionIndex++;
+        let doCopy = action == "copy";
+        let newTransactions = await getTransactionsForTransferItems(type,
+          items, insertionIndex, ip.guid, doCopy);
+        if (newTransactions.length) {
+          transactions = [...transactions, ...newTransactions];
         }
 
-        await PlacesUIUtils.batchUpdatesForNode(this._view.result, transactionData.length, async () => {
+        await PlacesUIUtils.batchUpdatesForNode(this._view.result, transactions.length, async () => {
           await PlacesTransactions.batch(async () => {
-            for (let item of transactionData) {
-              let guid = await PlacesUIUtils.getTransactionForData(
-                ...item).transact();
+            for (let transaction of transactions) {
+              let guid = await transaction.transact();
               itemsToSelect.push(await PlacesUtils.promiseItemId(guid));
             }
           });
         });
       }
     } else {
       let transactions = [];
       let insertionIndex = await ip.getIndex();
@@ -1629,17 +1613,16 @@ var PlacesControllerDragHelper = {
    *                                dropped to. This allows batching to take
    *                                place.
    */
   async onDrop(insertionPoint, dt, view) {
     let doCopy = ["copy", "link"].includes(dt.dropEffect);
 
     let transactions = [];
     let dropCount = dt.mozItemCount;
-    let movedCount = 0;
     let parentGuid = insertionPoint.guid;
     let tagName = insertionPoint.tagName;
 
     // Following flavors may contain duplicated data.
     let duplicable = new Map();
     duplicable.set(PlacesUtils.TYPE_UNICODE, new Set());
     duplicable.set(PlacesUtils.TYPE_X_MOZ_URL, new Set());
 
@@ -1671,79 +1654,67 @@ var PlacesControllerDragHelper = {
         let uri = data.linkedBrowser.currentURI;
         let spec = uri ? uri.spec : "about:blank";
         nodes = [{ uri: spec,
                    title: data.label,
                    type: PlacesUtils.TYPE_X_MOZ_URL}];
       } else
         throw new Error("bogus data was passed as a tab");
 
-      for (let unwrapped of nodes) {
-        let index = await insertionPoint.getIndex();
-
-        if (index != -1 && unwrapped.itemGuid) {
-          // Note: we use the parent from the existing bookmark as the sidebar
-          // gives us an unwrapped.parent that is actually a query and not the real
-          // parent.
-          let existingBookmark = await PlacesUtils.bookmarks.fetch(unwrapped.itemGuid);
+      if (PlacesUIUtils.useAsyncTransactions) {
+        // If dragging over a tag container we should tag the item.
+        if (insertionPoint.isTag) {
+          let urls = nodes.filter(item => "uri" in item).map(item => item.uri);
+          transactions.push(PlacesTransactions.Tag({ urls, tag: tagName }));
+        } else {
+          let insertionIndex = await insertionPoint.getIndex();
+          let newTransactions = await getTransactionsForTransferItems(flavor,
+            nodes, insertionIndex, parentGuid, doCopy);
+          if (newTransactions.length) {
+            transactions = [...transactions, ...newTransactions];
+          }
+        }
+      } else {
+        let movedCount = 0;
+        for (let unwrapped of nodes) {
+          let index = await insertionPoint.getIndex();
 
-          // If we're dropping on the same folder, then we may need to adjust
-          // the index to insert at the correct place.
-          if (existingBookmark && parentGuid == existingBookmark.parentGuid) {
-            if (PlacesUIUtils.useAsyncTransactions) {
-              if (index < existingBookmark.index) {
-                // When you drag multiple elts upward: need to increment index or
-                // each successive elt will be inserted at the same index, each
-                // above the previous.
-                index += movedCount++;
-              } else if (index > existingBookmark.index) {
-                // If we're dragging down, we need to go one lower to insert at
-                // the real point as moving the element changes the index of
-                // everything below by 1.
-                index--;
-              } else {
-                // This isn't moving so we skip it.
-                continue;
-              }
-            } else {
+          if (index != -1 && unwrapped.itemGuid) {
+            // Note: we use the parent from the existing bookmark as the sidebar
+            // gives us an unwrapped.parent that is actually a query and not the real
+            // parent.
+            let existingBookmark = await PlacesUtils.bookmarks.fetch(unwrapped.itemGuid);
+
+            // If we're dropping on the same folder, then we may need to adjust
+            // the index to insert at the correct place.
+            if (existingBookmark && parentGuid == existingBookmark.parentGuid) {
               // Sync Transactions. Adjust insertion index to prevent reversal
               // of dragged items. When you drag multiple elts upward: need to
               // increment index or each successive elt will be inserted at the
               // same index, each above the previous.
               if (index < existingBookmark.index) { // eslint-disable-line no-lonely-if
                 index += movedCount++;
               }
             }
           }
-        }
 
-        // If dragging over a tag container we should tag the item.
-        if (insertionPoint.isTag) {
-          let uri = NetUtil.newURI(unwrapped.uri);
-          let tagItemId = insertionPoint.itemId;
-          if (PlacesUIUtils.useAsyncTransactions)
-            transactions.push(PlacesTransactions.Tag({ uri, tag: tagName }));
-          else
+          // If dragging over a tag container we should tag the item.
+          // eslint-disable-next-line no-lonely-if
+          if (insertionPoint.isTag) {
+            let uri = NetUtil.newURI(unwrapped.uri);
+            let tagItemId = insertionPoint.itemId;
             transactions.push(new PlacesTagURITransaction(uri, [tagItemId]));
-        } else {
-          // If this is not a copy, check for safety that we can move the
-          // source, otherwise report an error and fallback to a copy.
-          if (!doCopy && !PlacesControllerDragHelper.canMoveUnwrappedNode(unwrapped)) {
-            Components.utils.reportError("Tried to move an unmovable Places " +
-                                         "node, reverting to a copy operation.");
-            doCopy = true;
-          }
-          if (PlacesUIUtils.useAsyncTransactions) {
-            transactions.push(
-              PlacesUIUtils.getTransactionForData(unwrapped,
-                                                  flavor,
-                                                  parentGuid,
-                                                  index,
-                                                  doCopy));
           } else {
+            // If this is not a copy, check for safety that we can move the
+            // source, otherwise report an error and fallback to a copy.
+            if (!doCopy && !PlacesControllerDragHelper.canMoveUnwrappedNode(unwrapped)) {
+              Components.utils.reportError("Tried to move an unmovable Places " +
+                                           "node, reverting to a copy operation.");
+              doCopy = true;
+            }
             transactions.push(PlacesUIUtils.makeTransaction(unwrapped,
                                 flavor, insertionPoint.itemId,
                                 index, doCopy));
           }
         }
       }
     }
     // Check if we actually have something to add, if we don't it probably wasn't
@@ -1833,8 +1804,69 @@ function doGetPlacesControllerForCommand
   return null;
 }
 
 function goDoPlacesCommand(aCommand) {
   let controller = doGetPlacesControllerForCommand(aCommand);
   if (controller && controller.isCommandEnabled(aCommand))
     controller.doCommand(aCommand);
 }
+
+/**
+ * Processes a set of transfer items and returns transactions to insert or
+ * move them.
+ *
+ * @param {String} dataFlavor The transfer flavor for the items.
+ * @param {Array} items A list of unwrapped nodes to get transactions for.
+ * @param {Integer} insertionIndex The requested index for insertion.
+ * @param {String} insertionParentGuid The guid of the parent folder to insert
+ *                                     or move the items to.
+ * @param {Boolean} doCopy Set to true to copy the items, false will move them
+ *                         if possible.
+ * @return {Array} Returns an array of created PlacesTransactions.
+ */
+async function getTransactionsForTransferItems(dataFlavor, items, insertionIndex,
+                                               insertionParentGuid, doCopy) {
+  let transactions = [];
+  let index = insertionIndex;
+
+  for (let item of items) {
+    if (index != -1 && item.itemGuid) {
+      // Note: we use the parent from the existing bookmark as the sidebar
+      // gives us an unwrapped.parent that is actually a query and not the real
+      // parent.
+      let existingBookmark = await PlacesUtils.bookmarks.fetch(item.itemGuid);
+
+      // If we're dropping on the same folder, then we may need to adjust
+      // the index to insert at the correct place.
+      if (existingBookmark && insertionParentGuid == existingBookmark.parentGuid) {
+        if (index > existingBookmark.index) {
+          // If we're dragging down, we need to go one lower to insert at
+          // the real point as moving the element changes the index of
+          // everything below by 1.
+          index--;
+        } else if (index == existingBookmark.index) {
+          // This isn't moving so we skip it.
+          continue;
+        }
+      }
+    }
+
+    // If this is not a copy, check for safety that we can move the
+    // source, otherwise report an error and fallback to a copy.
+    if (!doCopy && !PlacesControllerDragHelper.canMoveUnwrappedNode(item)) {
+      Components.utils.reportError("Tried to move an unmovable Places " +
+                                   "node, reverting to a copy operation.");
+      doCopy = true;
+    }
+    transactions.push(
+      PlacesUIUtils.getTransactionForData(item,
+                                          dataFlavor,
+                                          insertionParentGuid,
+                                          index,
+                                          doCopy));
+
+    if (index != -1 && item.itemGuid) {
+      index++;
+    }
+  }
+  return transactions;
+}
--- a/browser/components/places/tests/browser/browser.ini
+++ b/browser/components/places/tests/browser/browser.ini
@@ -22,16 +22,17 @@ support-files =
 [browser_bookmarkProperties_addLivemark.js]
 [browser_bookmarkProperties_bookmarkAllTabs.js]
 [browser_bookmarkProperties_cancel.js]
 [browser_bookmarkProperties_editTagContainer.js]
 [browser_bookmarkProperties_readOnlyRoot.js]
 [browser_bookmarksProperties.js]
 [browser_check_correct_controllers.js]
 [browser_click_bookmarks_on_toolbar.js]
+[browser_controller_onDrop_tagFolder.js]
 [browser_controller_onDrop.js]
 [browser_copy_folder_tree.js]
 [browser_copy_query_without_tree.js]
 subsuite = clipboard
 [browser_cutting_bookmarks.js]
 subsuite = clipboard
 [browser_drag_bookmarks_on_toolbar.js]
 [browser_forgetthissite_single.js]
--- a/browser/components/places/tests/browser/browser_controller_onDrop.js
+++ b/browser/components/places/tests/browser/browser_controller_onDrop.js
@@ -148,13 +148,21 @@ add_task(async function test_simple_move
 });
 
 add_task(async function test_simple_move_to_same_index() {
   // If we move to the same index, then we don't expect any transactions to be
   // created.
   await run_drag_test(1, 1, null, 1, false);
 });
 
-add_task(async function test_simple_move_different_folder() {
-  // When we move items to a different folder, the index should never change.
-  await run_drag_test(0, 2, bookmarks[3].guid, 2);
-  await run_drag_test(2, 0, bookmarks[3].guid, 0);
+add_task(async function test_simple_move_different_folder_append() {
+  // When we move items to a different folder, the insertion index will be -1
+  // and shouldn't change.
+  await run_drag_test(0, -1, bookmarks[3].guid, -1);
+  await run_drag_test(2, -1, bookmarks[3].guid, -1);
 });
+
+add_task(async function test_move_different_folder_insert_at() {
+  // When we move items to a different folder, the insertion index will be -1
+  // and shouldn't change.
+  await run_drag_test(0, 0, bookmarks[3].guid, 0);
+  await run_drag_test(2, 2, bookmarks[3].guid, 2);
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/places/tests/browser/browser_controller_onDrop_tagFolder.js
@@ -0,0 +1,112 @@
+/* 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";
+
+/* global sinon */
+Services.scriptloader.loadSubScript("resource://testing-common/sinon-2.3.2.js");
+
+const sandbox = sinon.sandbox.create();
+const TAG_NAME = "testTag";
+
+var bookmarks;
+var bookmarkId;
+
+add_task(async function setup() {
+  registerCleanupFunction(async function() {
+    sandbox.restore();
+    delete window.sinon;
+    await PlacesUtils.bookmarks.eraseEverything();
+    await PlacesTestUtils.clearHistory();
+  });
+
+  sandbox.stub(PlacesTransactions, "batch");
+  sandbox.stub(PlacesTransactions, "Tag");
+
+  bookmarks = await PlacesUtils.bookmarks.insertTree({
+    guid: PlacesUtils.bookmarks.unfiledGuid,
+    children: [{
+      title: "bm1",
+      url: "http://example1.com"
+    }, {
+      title: "bm2",
+      url: "http://example2.com",
+      tags: [TAG_NAME]
+    }]
+  });
+  bookmarkId = await PlacesUtils.promiseItemId(bookmarks[0].guid);
+});
+
+async function run_drag_test(startBookmarkIndex, newParentGuid) {
+  if (!PlacesUIUtils.useAsyncTransactions) {
+    Assert.ok(true, "Skipping test as async transactions are turned off");
+    return;
+  }
+
+  if (!newParentGuid) {
+    newParentGuid = PlacesUtils.bookmarks.unfiledGuid;
+  }
+
+  // Reset the stubs so that previous test runs don't count against us.
+  PlacesTransactions.Tag.reset();
+  PlacesTransactions.batch.reset();
+
+  let dragBookmark = bookmarks[startBookmarkIndex];
+
+  await withSidebarTree("bookmarks", async (tree) => {
+    tree.selectItems([PlacesUtils.unfiledBookmarksFolderId]);
+    PlacesUtils.asContainer(tree.selectedNode).containerOpen = true;
+
+    // Simulating a drag-drop with a tree view turns out to be really difficult
+    // as you can't get a node for the source/target. Hence, we fake the
+    // insertion point and drag data and call the function direct.
+    let ip = new InsertionPoint({
+      isTag: true,
+      tagName: TAG_NAME,
+      orientation: Ci.nsITreeView.DROP_ON
+    });
+
+    let bookmarkWithId = JSON.stringify(Object.assign({
+      id: bookmarkId,
+      itemGuid: dragBookmark.guid,
+      parent: PlacesUtils.unfiledBookmarksFolderId,
+      uri: dragBookmark.url
+    }, dragBookmark));
+
+    let dt = {
+      dropEffect: "move",
+      mozCursor: "auto",
+      mozItemCount: 1,
+      types: [ PlacesUtils.TYPE_X_MOZ_PLACE ],
+      mozTypesAt(i) {
+        return this.types;
+      },
+      mozGetDataAt(i) {
+        return bookmarkWithId;
+      }
+    };
+
+    await PlacesControllerDragHelper.onDrop(ip, dt);
+
+    Assert.ok(PlacesTransactions.Tag.calledOnce,
+      "Should have called getTransactionForData at least once.");
+
+    let arg = PlacesTransactions.Tag.args[0][0];
+
+    Assert.equal(arg.urls.length, 1,
+      "Should have called PlacesTransactions.Tag with an array of one url");
+    Assert.equal(arg.urls[0], dragBookmark.url,
+      "Should have called PlacesTransactions.Tag with the correct url");
+    Assert.equal(arg.tag, TAG_NAME,
+      "Should have called PlacesTransactions.Tag with the correct tag name");
+  });
+}
+
+add_task(async function test_simple_drop_and_tag() {
+  // When we move items down the list, we'll get a drag index that is one higher
+  // than where we actually want to insert to - as the item is being moved up,
+  // everything shifts down one. Hence the index to pass to the transaction should
+  // be one less than the supplied index.
+  await run_drag_test(0, PlacesUtils.bookmarks.tagGuid);
+});
--- a/browser/components/places/tests/browser/browser_paste_bookmarks.js
+++ b/browser/components/places/tests/browser/browser_paste_bookmarks.js
@@ -1,52 +1,50 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 const TEST_URL = "http://example.com/";
-const TEST_URL1 = "https://example.com/otherbrowser";
+const TEST_URL1 = "https://example.com/otherbrowser/";
 
 var PlacesOrganizer;
 var ContentTree;
-var bookmark;
-var bookmarkId;
 
 add_task(async function setup() {
   await PlacesUtils.bookmarks.eraseEverything();
   let organizer = await promiseLibrary();
 
   registerCleanupFunction(async function() {
     await promiseLibraryClosed(organizer);
     await PlacesUtils.bookmarks.eraseEverything();
   });
 
   PlacesOrganizer = organizer.PlacesOrganizer;
   ContentTree = organizer.ContentTree;
+});
 
+add_task(async function paste() {
   info("Selecting BookmarksToolbar in the left pane");
   PlacesOrganizer.selectLeftPaneQuery("BookmarksToolbar");
 
-  bookmark = await PlacesUtils.bookmarks.insert({
+  let bookmark = await PlacesUtils.bookmarks.insert({
     parentGuid: PlacesUtils.bookmarks.toolbarGuid,
     url: TEST_URL,
     title: "0"
   });
-  bookmarkId = await PlacesUtils.promiseItemId(bookmark.guid);
+  let bookmarkId = await PlacesUtils.promiseItemId(bookmark.guid);
 
   ContentTree.view.selectItems([bookmarkId]);
 
   await promiseClipboard(() => {
-    info("Copying selection");
+    info("Cutting selection");
     ContentTree.view.controller.cut();
   }, PlacesUtils.TYPE_X_MOZ_PLACE);
-});
 
-add_task(async function paste() {
   info("Selecting UnfiledBookmarks in the left pane");
   PlacesOrganizer.selectLeftPaneQuery("UnfiledBookmarks");
</