merge mozilla-inbound to mozilla-central
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Tue, 03 Dec 2013 10:14:06 +0100
changeset 158428 71088609c1f33e529518f6ad8cc23383844f4b1c
parent 158387 1fe0178cd92d924b6f01eee3c3649cafb8210e28 (current diff)
parent 158427 a0b60b2d12f066579e90ff6c0e96f1a22cfb801b (diff)
child 158450 41a3163ac71405b46341ef57e2cf63417d753a26
push id25744
push usercbook@mozilla.com
push dateTue, 03 Dec 2013 09:14:36 +0000
treeherdermozilla-central@71088609c1f3 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone28.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
merge mozilla-inbound to mozilla-central
build/pgo/certs/evroot.ca
configure.in
editor/libeditor/html/tests/Makefile.in
js/src/configure.in
js/src/jit-test/tests/ion/bug715460.js
js/src/jit-test/tests/ion/bug900437.js
media/libvpx/I1bad27ea.patch
media/libvpx/I256a37c6.patch
media/libvpx/I3915d597.patch
media/libvpx/I42ab00e3.patch
media/libvpx/I6f2b218d.patch
media/libvpx/I8a35831e.patch
media/libvpx/I9713c9f0.patch
media/libvpx/bug640935.patch
media/libvpx/bug646815.patch
media/libvpx/bug666931.patch
media/libvpx/bug671818.patch
media/libvpx/bug696390.patch
media/libvpx/compile_errors.patch
media/libvpx/solaris.patch
media/libvpx/textrels.patch
media/libvpx/variance-invoke.patch
media/libvpx/vp8/common/arm/arm_systemdependent.c
media/libvpx/vp8/common/arm/armv6/vp8_mse16x16_armv6.asm
media/libvpx/vp8/common/arm/dequantize_arm.h
media/libvpx/vp8/common/arm/idct_arm.h
media/libvpx/vp8/common/arm/loopfilter_arm.h
media/libvpx/vp8/common/arm/neon/save_neon_reg.asm
media/libvpx/vp8/common/arm/neon/vp8_mse16x16_neon.asm
media/libvpx/vp8/common/arm/recon_arm.h
media/libvpx/vp8/common/arm/subpixel_arm.h
media/libvpx/vp8/common/arm/variance_arm.h
media/libvpx/vp8/common/dequantize.h
media/libvpx/vp8/common/idct.h
media/libvpx/vp8/common/modecontext.c
media/libvpx/vp8/common/recon.h
media/libvpx/vp8/common/reconintra.h
media/libvpx/vp8/common/subpixel.h
media/libvpx/vp8/common/x86/dequantize_x86.h
media/libvpx/vp8/common/x86/idct_x86.h
media/libvpx/vp8/common/x86/loopfilter_x86.h
media/libvpx/vp8/common/x86/postproc_x86.h
media/libvpx/vp8/common/x86/recon_x86.h
media/libvpx/vp8/common/x86/subpixel_x86.h
media/libvpx/vp8/common/x86/variance_x86.h
media/libvpx/vp8/common/x86/x86_systemdependent.c
media/libvpx/vp8/decoder/arm/arm_dsystemdependent.c
media/libvpx/vp8/decoder/generic/dsystemdependent.c
media/libvpx/vp8/decoder/reconintra_mt.c
media/libvpx/vp8/decoder/reconintra_mt.h
media/libvpx/vp8/decoder/x86/x86_dsystemdependent.c
media/libvpx/vp8/encoder/arm/arm_csystemdependent.c
media/libvpx/vp8/encoder/arm/dct_arm.h
media/libvpx/vp8/encoder/arm/encodemb_arm.h
media/libvpx/vp8/encoder/arm/quantize_arm.h
media/libvpx/vp8/encoder/dct.h
media/libvpx/vp8/encoder/generic/csystemdependent.c
media/libvpx/vp8/encoder/temporal_filter.h
media/libvpx/vp8/encoder/x86/dct_x86.h
media/libvpx/vp8/encoder/x86/encodemb_x86.h
media/libvpx/vp8/encoder/x86/mcomp_x86.h
media/libvpx/vp8/encoder/x86/quantize_x86.h
media/libvpx/vp8/encoder/x86/temporal_filter_x86.h
media/libvpx/vp8/encoder/x86/x86_csystemdependent.c
media/libvpx/vpx/src/vpx_decoder_compat.c
media/libvpx/vpx/vp8e.h
media/libvpx/vpx/vpx_decoder_compat.h
media/libvpx/vpx_config_arm-linux-gcc.c
media/libvpx/vpx_config_arm-linux-gcc.h
media/libvpx/vpx_scale/arm/arm_scalesystemdependent.c
media/libvpx/vpx_scale/arm/yv12extend_arm.h
media/libvpx/vpx_scale/generic/scalesystemdependent.c
media/libvpx/vpx_scale/yv12extend.h
media/libvpx/xcode4.patch
security/manager/ssl/tests/mochitest/bugs/test_ev_validation.html
security/manager/ssl/tests/mochitest/bugs/test_ev_validation_child.html
testing/mochitest/intermediate-ev-tester.crl
testing/mochitest/root-ev-tester.crl
--- a/Makefile.in
+++ b/Makefile.in
@@ -39,44 +39,44 @@ ifndef MOZ_PROFILE_USE
 # otherwise the rule in rules.mk doesn't run early enough.
 libs binaries export tools:: CLOBBER $(topsrcdir)/configure config.status backend.RecursiveMakeBackend
 ifdef BUILD_JS
 libs binaries export tools:: js-config-status
 endif
 endif
 
 CLOBBER: $(topsrcdir)/CLOBBER
-	@echo "STOP!  The CLOBBER file has changed."
-	@echo "Please run the build through a sanctioned build wrapper, such as"
-	@echo "'mach build' or client.mk."
+	@echo 'STOP!  The CLOBBER file has changed.'
+	@echo 'Please run the build through a sanctioned build wrapper, such as'
+	@echo '"mach build" or client.mk.'
 	@exit 1
 
 $(topsrcdir)/configure: $(topsrcdir)/configure.in
-	@echo "STOP!  configure.in has changed, and your configure is out of date."
-	@echo "Please rerun autoconf and re-configure your build directory."
-	@echo "To ignore this message, touch 'configure' in the source directory,"
-	@echo "but your build might not succeed."
+	@echo 'STOP!  configure.in has changed, and your configure is out of date.'
+	@echo 'Please rerun autoconf and re-configure your build directory.'
+	@echo 'To ignore this message, touch "configure" in the source directory,'
+	@echo 'but your build might not succeed.'
 	@exit 1
 
 config.status: $(topsrcdir)/configure
-	@echo "STOP!  configure has changed and needs to be run in this build directory."
-	@echo "Please rerun configure."
-	@echo "To ignore this message, touch 'config.status' in the build directory,"
-	@echo "but your build might not succeed."
+	@echo 'STOP!  configure has changed and needs to be run in this build directory.'
+	@echo 'Please rerun configure.'
+	@echo 'To ignore this message, touch "config.status" in the build directory,'
+	@echo 'but your build might not succeed.'
 	@exit 1
 
 # Regenerate the build backend if it is out of date. We only have this rule in
 # this main make file because having it in rules.mk and applied to partial tree
 # builds resulted in a world of hurt. Gory details are in bug 877308.
 #
 # The mach build driver will ensure the backend is up to date for partial tree
 # builds. This cleanly avoids most of the pain.
 
 backend.RecursiveMakeBackend:
-	@echo "Build configuration changed. Regenerating backend."
+	@echo 'Build configuration changed. Regenerating backend.'
 	$(PYTHON) config.status
 
 Makefile: backend.RecursiveMakeBackend
 	@$(TOUCH) $@
 
 include backend.RecursiveMakeBackend.pp
 
 default:: backend.RecursiveMakeBackend
@@ -160,17 +160,17 @@ MAKE_SYM_STORE_ARGS += -i
 endif
 DUMP_SYMS_BIN ?= $(topsrcdir)/toolkit/crashreporter/tools/win32/dump_syms_vc$(_MSC_VER).exe
 # PDB files don't get moved to dist, so we need to scan the whole objdir
 MAKE_SYM_STORE_PATH := .
 endif
 ifeq ($(OS_ARCH),Darwin)
 # need to pass arch flags for universal builds
 ifdef UNIVERSAL_BINARY
-MAKE_SYM_STORE_ARGS := -c -a "i386 x86_64" --vcs-info
+MAKE_SYM_STORE_ARGS := -c -a 'i386 x86_64' --vcs-info
 MAKE_SYM_STORE_PATH := $(DIST)/universal
 else
 MAKE_SYM_STORE_ARGS := -c -a $(OS_TEST) --vcs-info
 MAKE_SYM_STORE_PATH := $(DIST)/bin
 endif
 DUMP_SYMS_BIN ?= $(DIST)/host/bin/dump_syms
 endif
 ifeq (,$(filter-out Linux SunOS,$(OS_ARCH)))
@@ -189,40 +189,40 @@ endif
 
 SYMBOL_INDEX_NAME = \
   $(MOZ_APP_NAME)-$(MOZ_APP_VERSION)-$(OS_TARGET)-$(BUILDID)-$(CPU_ARCH)$(EXTRA_BUILDID)-symbols.txt
 
 buildsymbols:
 ifdef MOZ_CRASHREPORTER
 	echo building symbol store
 	$(RM) -r $(DIST)/crashreporter-symbols
-	$(RM) "$(DIST)/$(SYMBOL_ARCHIVE_BASENAME).zip"
+	$(RM) '$(DIST)/$(SYMBOL_ARCHIVE_BASENAME).zip'
 	$(NSINSTALL) -D $(DIST)/crashreporter-symbols
-	OBJCOPY="$(OBJCOPY)" \
+	OBJCOPY='$(OBJCOPY)' \
 	$(PYTHON) $(topsrcdir)/toolkit/crashreporter/tools/symbolstore.py \
 	  $(MAKE_SYM_STORE_ARGS)                                          \
 	  $(foreach dir,$(SYM_STORE_SOURCE_DIRS),-s $(dir))               \
 	  $(DUMP_SYMS_BIN)                                                \
 	  $(DIST)/crashreporter-symbols                                   \
 	  $(MAKE_SYM_STORE_PATH) | grep -iv test >                        \
 	  $(DIST)/crashreporter-symbols/$(SYMBOL_INDEX_NAME)
 	echo packing symbols
 	$(NSINSTALL) -D $(DIST)/$(PKG_PATH)
 	cd $(DIST)/crashreporter-symbols && \
-          zip -r9D "../$(PKG_PATH)$(SYMBOL_FULL_ARCHIVE_BASENAME).zip" . -x "*test*" -x "*Test*"
+          zip -r9D '../$(PKG_PATH)$(SYMBOL_FULL_ARCHIVE_BASENAME).zip' . -x '*test*' -x '*Test*'
 	cd $(DIST)/crashreporter-symbols && \
-	grep "sym" $(SYMBOL_INDEX_NAME) > $(SYMBOL_INDEX_NAME).tmp && \
+	grep 'sym' $(SYMBOL_INDEX_NAME) > $(SYMBOL_INDEX_NAME).tmp && \
 	  mv $(SYMBOL_INDEX_NAME).tmp $(SYMBOL_INDEX_NAME)
 	cd $(DIST)/crashreporter-symbols && \
-          zip -r9D "../$(PKG_PATH)$(SYMBOL_ARCHIVE_BASENAME).zip" . -i "*.sym" -i "*.txt"  -x "*test*" -x "*Test*"
+          zip -r9D '../$(PKG_PATH)$(SYMBOL_ARCHIVE_BASENAME).zip' . -i '*.sym' -i '*.txt'  -x '*test*' -x '*Test*'
 endif # MOZ_CRASHREPORTER
 
 uploadsymbols:
 ifdef MOZ_CRASHREPORTER
-	$(SHELL) $(topsrcdir)/toolkit/crashreporter/tools/upload_symbols.sh $(SYMBOL_INDEX_NAME) "$(DIST)/$(PKG_PATH)$(SYMBOL_FULL_ARCHIVE_BASENAME).zip"
+	$(SHELL) $(topsrcdir)/toolkit/crashreporter/tools/upload_symbols.sh $(SYMBOL_INDEX_NAME) '$(DIST)/$(PKG_PATH)$(SYMBOL_FULL_ARCHIVE_BASENAME).zip'
 endif
 
 # MOZ_SOURCE_STAMP is defined in package-name.mk with a deferred assignment.
 # exporting it makes make run its $(shell) command for each invoked submake,
 # so transform it to an immediate assignment.
 MOZ_SOURCE_STAMP := $(MOZ_SOURCE_STAMP)
 export MOZ_SOURCE_STAMP
 
@@ -233,26 +233,26 @@ ifneq ($(OS_ARCH)_$(GNU_CC), WINNT_)
 ifndef NO_PROFILE_GUIDED_OPTIMIZE
 maybe_clobber_profiledbuild: clean
 else
 maybe_clobber_profiledbuild:
 endif
 else
 maybe_clobber_profiledbuild:
 	$(RM) $(DIST)/bin/*.pgc
-	find $(DIST)/$(MOZ_APP_NAME) -name "*.pgc" -exec mv {} $(DIST)/bin \;
+	find $(DIST)/$(MOZ_APP_NAME) -name '*.pgc' -exec mv {} $(DIST)/bin \;
 endif
 
 .PHONY: maybe_clobber_profiledbuild
 
 # Look for R_386_PC32 relocations in shared libs, these
 # break x86_64 builds and SELinux users.
 ifeq ($(OS_TARGET)_$(TARGET_XPCOM_ABI),Linux_x86-gcc3)
 scheck::
-	@relcount=`find $(DIST)/bin -name "*.so" | xargs objdump -R | grep R_386_PC32 | wc -l` && if test $$relcount -gt 0; then echo "FAILED: R_386_PC32 relocations detected in a shared library.  Did you use a system header without adding it to config/system-headers?"; exit 1; else echo "PASSED"; fi
+	@relcount=`find $(DIST)/bin -name '*.so' | xargs objdump -R | grep R_386_PC32 | wc -l` && if test $$relcount -gt 0; then echo 'FAILED: R_386_PC32 relocations detected in a shared library.  Did you use a system header without adding it to config/system-headers?'; exit 1; else echo 'PASSED'; fi
 endif
 
 ifdef BUILD_JS
 js/src/Makefile: subsrcdir := js/src
 
 ifdef MOZ_PSEUDO_DERECURSE
 # Interdependencies for parallel export.
 js/xpconnect/src/export: dom/bindings/export xpcom/xpidl/export
--- a/b2g/app/Makefile.in
+++ b/b2g/app/Makefile.in
@@ -60,32 +60,32 @@ ifdef _MSC_VER
 WIN32_EXE_LDFLAGS += -ENTRY:wmainCRTStartup
 endif
 endif #LIBXUL_SDK
 
 UA_UPDATE_FILE = ua-update.json
 
 $(UA_UPDATE_FILE): % : %.in
 	# strip out comment lines, which are not valid in JSON
-	sed -e "/^ *\\/\\//d" -e "/^ *$$/d" $^ > $@
+	sed -e '/^ *\/\//d' -e '/^ *$$/d' $^ > $@
 
 UA_UPDATE_FILES = $(UA_UPDATE_FILE)
 UA_UPDATE_DEST  = $(FINAL_TARGET)
 INSTALL_TARGETS += UA_UPDATE
 
 # Make sure the standalone glue doesn't try to get libxpcom.so from b2g/app.
 NSDISTMODE = copy
 
 include $(topsrcdir)/config/rules.mk
 
 APP_ICON = b2g
 
 source_repo ?= $(call getSourceRepo,$(srcdir)/..)
 ifneq (,$(filter http%,$(source_repo)))
-  DEFINES += -DMOZ_SOURCE_REPO="$(source_repo)"
+  DEFINES += -DMOZ_SOURCE_REPO='$(source_repo)'
 endif
 
 ifeq ($(OS_ARCH),WINNT)
 REDIT_PATH = $(LIBXUL_DIST)/bin
 endif
 
 APP_BINARY = $(MOZ_APP_NAME)$(BIN_SUFFIX)
 
@@ -113,31 +113,31 @@ endif
 
 libs-preqs = \
   $(call mkdir_deps,$(DIST)/$(APP_NAME).app/Contents/MacOS) \
   $(call mkdir_deps,$(DIST)/$(APP_NAME).app/Contents/Resources/$(AB).lproj) \
   $(NULL)
 
 .PHONY: repackage
 tools repackage:: $(libs-preqs)
-	rsync -a --exclude "*.in" $(srcdir)/macbuild/Contents $(DIST)/$(APP_NAME).app --exclude English.lproj
-	rsync -a --exclude "*.in" $(srcdir)/macbuild/Contents/Resources/English.lproj/ $(DIST)/$(APP_NAME).app/Contents/Resources/$(AB).lproj
-	sed -e "s/%MOZ_APP_VERSION%/$(MOZ_APP_VERSION)/" -e "s/%MOZ_APP_NAME%/$(MOZ_APP_NAME)/" -e "s/%APP_VERSION%/$(APP_VERSION)/" -e "s/%APP_NAME%/$(APP_NAME)/" -e "s/%APP_BINARY%/$(APP_BINARY)/" $(srcdir)/macbuild/Contents/Info.plist.in > $(DIST)/$(APP_NAME).app/Contents/Info.plist
-	sed -e "s/%APP_VERSION%/$(APP_VERSION)/" -e "s/%APP_NAME%/$(APP_NAME)/" $(srcdir)/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | iconv -f UTF-8 -t UTF-16 > $(DIST)/$(APP_NAME).app/Contents/Resources/$(AB).lproj/InfoPlist.strings
+	rsync -a --exclude '*.in' $(srcdir)/macbuild/Contents $(DIST)/$(APP_NAME).app --exclude English.lproj
+	rsync -a --exclude '*.in' $(srcdir)/macbuild/Contents/Resources/English.lproj/ $(DIST)/$(APP_NAME).app/Contents/Resources/$(AB).lproj
+	sed -e 's/%MOZ_APP_VERSION%/$(MOZ_APP_VERSION)/' -e 's/%MOZ_APP_NAME%/$(MOZ_APP_NAME)/' -e 's/%APP_VERSION%/$(APP_VERSION)/' -e 's/%APP_NAME%/$(APP_NAME)/' -e 's/%APP_BINARY%/$(APP_BINARY)/' $(srcdir)/macbuild/Contents/Info.plist.in > $(DIST)/$(APP_NAME).app/Contents/Info.plist
+	sed -e 's/%APP_VERSION%/$(APP_VERSION)/' -e 's/%APP_NAME%/$(APP_NAME)/' $(srcdir)/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | iconv -f UTF-8 -t UTF-16 > $(DIST)/$(APP_NAME).app/Contents/Resources/$(AB).lproj/InfoPlist.strings
 	rsync -a $(DIST)/bin/ $(DIST)/$(APP_NAME).app/Contents/$(APPFILES)
 	$(RM) $(DIST)/$(APP_NAME).app/Contents/$(APPFILES)/mangle $(DIST)/$(APP_NAME).app/Contents/$(APPFILES)/shlibsign
 ifdef LIBXUL_SDK
 	cp $(LIBXUL_DIST)/bin/xulrunner$(BIN_SUFFIX) $(DIST)/$(APP_NAME).app/Contents/MacOS/$(APP_BINARY)
 	rsync -a --exclude nsinstall --copy-unsafe-links $(LIBXUL_DIST)/XUL.framework $(DIST)/$(APP_NAME).app/Contents/Frameworks
 else
 	$(RM) $(DIST)/$(APP_NAME).app/Contents/MacOS/$(PROGRAM)
 	rsync -aL $(PROGRAM) $(DIST)/$(APP_NAME).app/Contents/MacOS
 endif
 	cp -RL $(srcdir)/b2g.icns $(DIST)/$(APP_NAME).app/Contents/Resources/$(MOZ_APP_NAME).icns
-	printf "APPLMOZB" > $(DIST)/$(APP_NAME).app/Contents/PkgInfo
+	printf APPLMOZB > $(DIST)/$(APP_NAME).app/Contents/PkgInfo
 
 else # MOZ_WIDGET_TOOLKIT != cocoa
 
 libs::
 ifdef LIBXUL_SDK
 	cp $(LIBXUL_DIST)/bin/xulrunner-stub$(BIN_SUFFIX) $(DIST)/bin/$(APP_BINARY)
 endif
 ifndef SKIP_COPY_XULRUNNER
--- a/b2g/build.mk
+++ b/b2g/build.mk
@@ -4,17 +4,17 @@
 
 installer: 
 	@$(MAKE) -C b2g/installer installer
 
 package:
 	@$(MAKE) -C b2g/installer
 
 install::
-	@echo "B2G can't be installed directly."
+	@echo 'B2G can't be installed directly.'
 	@exit 1
 
 upload::
 	@$(MAKE) -C b2g/installer upload
 
 ifdef ENABLE_TESTS
 # Implemented in testing/testsuite-targets.mk
 
--- a/b2g/installer/Makefile.in
+++ b/b2g/installer/Makefile.in
@@ -57,18 +57,18 @@ endif
 ifdef GKMEDIAS_SHARED_LIBRARY
 DEFINES += -DGKMEDIAS_SHARED_LIBRARY
 endif
 
 ifdef MOZ_PKG_MANIFEST_P
 $(MOZ_PKG_MANIFEST): $(MOZ_PKG_MANIFEST_P) FORCE
 	$(call py_action,preprocessor,$(DEFINES) $(ACDEFINES) $< -o $@)
 ifdef MOZ_CHROME_MULTILOCALE
-	printf "\n[multilocale]\n" >> $@
+	printf '\n[multilocale]\n' >> $@
 	for LOCALE in $(MOZ_CHROME_MULTILOCALE) ;\
 	do \
-	  printf "$(BINPATH)/chrome/$$LOCALE$(JAREXT)\n" >> $@; \
-	  printf "$(BINPATH)/chrome/$$LOCALE.manifest\n" >> $@; \
+	  printf '$(BINPATH)/chrome/$$LOCALE$(JAREXT)\n' >> $@; \
+	  printf '$(BINPATH)/chrome/$$LOCALE.manifest\n' >> $@; \
 	done
 endif
 
 GARBAGE += $(MOZ_PKG_MANIFEST)
 endif
--- a/b2g/locales/Makefile.in
+++ b/b2g/locales/Makefile.in
@@ -26,17 +26,17 @@ RETRIEVE_WINDOWS_INSTALLER = 1
 MOZ_LANGPACK_EID=langpack-$(AB_CD)@b2g.mozilla.org
 
 PREF_JS_EXPORTS = $(call MERGE_FILE,b2g-l10n.js)
 
 ifneq (,$(filter cocoa,$(MOZ_WIDGET_TOOLKIT)))
 MOZ_PKG_MAC_DSSTORE=$(_ABS_DIST)/branding/dsstore
 MOZ_PKG_MAC_BACKGROUND=$(_ABS_DIST)/branding/background.png
 MOZ_PKG_MAC_ICON=$(_ABS_DIST)/branding/disk.icns
-MOZ_PKG_MAC_EXTRA=--symlink "/Applications:/ "
+MOZ_PKG_MAC_EXTRA=--symlink '/Applications:/ '
 endif
 
 ifeq (WINNT,$(OS_ARCH))
 UNINSTALLER_PACKAGE_HOOK = $(RM) -r $(STAGEDIST)/uninstall; \
     $(NSINSTALL) -D $(STAGEDIST)/uninstall; \
     cp ../installer/windows/l10ngen/helper.exe $(STAGEDIST)/uninstall; \
     $(RM) $(_ABS_DIST)/l10n-stage/setup.exe; \
     cp ../installer/windows/l10ngen/setup.exe $(_ABS_DIST)/l10n-stage; \
@@ -48,17 +48,17 @@ include $(topsrcdir)/config/rules.mk
 include $(topsrcdir)/toolkit/locales/l10n.mk
 
 $(STAGEDIST): $(DIST)/branding
 
 $(DIST)/branding:
 	$(NSINSTALL) -D $@
 
 libs::
-	@if test -f "$(LOCALE_SRCDIR)/existing-profile-defaults.js"; then \
+	@if test -f '$(LOCALE_SRCDIR)/existing-profile-defaults.js'; then \
 	  $(PYTHON) -m mozbuild.action.preprocessor $(PREF_PPFLAGS) $(DEFINES) $(ACDEFINES) $(XULPPFLAGS) \
 	    $(LOCALE_SRCDIR)/existing-profile-defaults.js -o $(FINAL_TARGET)/defaults/existing-profile-defaults.js; \
 	fi
 
 NO_JA_JP_MAC_AB_CD := $(if $(filter ja-JP-mac, $(AB_CD)),ja,$(AB_CD))
 
 libs-%:
 	$(NSINSTALL) -D $(DIST)/install
@@ -69,30 +69,30 @@ libs-%:
 
 # Tailored target to just add the chrome processing for multi-locale builds
 chrome-%:
 	@$(MAKE) chrome AB_CD=$*
 	@$(MAKE) -C $(DEPTH)/$(MOZ_BRANDING_DIRECTORY)/locales chrome AB_CD=$*
 
 repackage-win32-installer: WIN32_INSTALLER_OUT=$(_ABS_DIST)/$(PKG_INST_PATH)$(PKG_INST_BASENAME).exe
 repackage-win32-installer: $(call ESCAPE_SPACE,$(WIN32_INSTALLER_IN)) $(SUBMAKEFILES) libs-$(AB_CD)
-	@echo "Repackaging $(WIN32_INSTALLER_IN) into $(WIN32_INSTALLER_OUT)."
+	@echo 'Repackaging $(WIN32_INSTALLER_IN) into $(WIN32_INSTALLER_OUT).'
 	$(MAKE) -C $(DEPTH)/$(MOZ_BRANDING_DIRECTORY) export
 	$(MAKE) -C ../installer/windows CONFIG_DIR=l10ngen l10ngen/setup.exe l10ngen/7zSD.sfx
 	$(MAKE) repackage-zip \
 	  AB_CD=$(AB_CD) \
 	  MOZ_PKG_FORMAT=SFX7Z \
-	  ZIP_IN="$(WIN32_INSTALLER_IN)" \
-	  ZIP_OUT="$(WIN32_INSTALLER_OUT)" \
-	  SFX_HEADER="$(PWD)/../installer/windows/l10ngen/7zSD.sfx \
-	              $(topsrcdir)/b2g/installer/windows/app.tag"
+	  ZIP_IN='$(WIN32_INSTALLER_IN)' \
+	  ZIP_OUT='$(WIN32_INSTALLER_OUT)' \
+	  SFX_HEADER='$(PWD)/../installer/windows/l10ngen/7zSD.sfx \
+	              $(topsrcdir)/b2g/installer/windows/app.tag'
 
 ifeq (WINNT,$(OS_ARCH))
 repackage-win32-installer-%:
-	@$(MAKE) repackage-win32-installer AB_CD=$* WIN32_INSTALLER_IN="$(WIN32_INSTALLER_IN)"
+	@$(MAKE) repackage-win32-installer AB_CD=$* WIN32_INSTALLER_IN='$(WIN32_INSTALLER_IN)'
 else
 repackage-win32-installer-%: ;
 endif
 
 
 clobber-zip:
 	$(RM) $(STAGEDIST)/chrome/$(AB_CD).jar \
 	  $(STAGEDIST)/chrome/$(AB_CD).manifest \
@@ -104,51 +104,51 @@ clobber-zip:
 
 langpack: langpack-$(AB_CD)
 
 # This is a generic target that will make a langpack, repack ZIP (+tarball)
 # builds, and repack an installer if applicable. It is called from the
 # tinderbox scripts. Alter it with caution.
 
 installers-%: clobber-% langpack-% repackage-win32-installer-% repackage-zip-%
-	@echo "repackaging done"
+	@echo 'repackaging done'
 
 # When we unpack b2g on MacOS X the platform.ini and application.ini are in slightly
 # different locations that on all other platforms
 ifeq (Darwin, $(OS_ARCH))
 ifdef LIBXUL_SDK
-GECKO_PLATFORM_INI_PATH="$(STAGEDIST)/../Frameworks/XUL.framework/Versions/$(MOZILLA_VERSION)/platform.ini"
+GECKO_PLATFORM_INI_PATH='$(STAGEDIST)/../Frameworks/XUL.framework/Versions/$(MOZILLA_VERSION)/platform.ini'
 else
-GECKO_PLATFORM_INI_PATH="$(STAGEDIST)/platform.ini"
+GECKO_PLATFORM_INI_PATH='$(STAGEDIST)/platform.ini'
 endif
-B2G_APPLICATION_INI_PATH="$(STAGEDIST)/application.ini"
+B2G_APPLICATION_INI_PATH='$(STAGEDIST)/application.ini'
 else
 ifdef LIBXUL_SDK
-GECKO_PLATFORM_INI_PATH="$(STAGEDIST)/xulrunner/platform.ini"
+GECKO_PLATFORM_INI_PATH='$(STAGEDIST)/xulrunner/platform.ini'
 else
-GECKO_PLATFORM_INI_PATH="$(STAGEDIST)/platform.ini"
+GECKO_PLATFORM_INI_PATH='$(STAGEDIST)/platform.ini'
 endif
-B2G_APPLICATION_INI_PATH="$(STAGEDIST)/application.ini"
+B2G_APPLICATION_INI_PATH='$(STAGEDIST)/application.ini'
 endif
 
 
 ident:
-	@printf "gecko_revision "
+	@printf 'gecko_revision '
 	@$(PYTHON) $(topsrcdir)/config/printconfigsetting.py $(GECKO_PLATFORM_INI_PATH) Build SourceStamp
-	@printf "b2g_revision "
+	@printf 'b2g_revision '
 	@$(PYTHON) $(topsrcdir)/config/printconfigsetting.py $(B2G_APPLICATION_INI_PATH) App SourceStamp
-	@printf "buildid "
+	@printf 'buildid '
 	@$(PYTHON) $(topsrcdir)/config/printconfigsetting.py $(B2G_APPLICATION_INI_PATH) App BuildID
 
 merge-%:
 ifdef LOCALE_MERGEDIR
 	$(RM) -rf $(LOCALE_MERGEDIR)
 	MACOSX_DEPLOYMENT_TARGET= compare-locales -m $(LOCALE_MERGEDIR) $(srcdir)/l10n.ini $(L10NBASEDIR) $*
 endif
 	@echo
 
 # test target, depends on make package
 # try to repack x-test, with just toolkit/defines.inc being there
 l10n-check::
 	$(RM) -rf x-test
 	$(NSINSTALL) -D x-test/toolkit
-	echo "#define MOZ_LANG_TITLE Just testing" > x-test/toolkit/defines.inc
-	$(MAKE) installers-x-test L10NBASEDIR="$(PWD)" LOCALE_MERGEDIR="$(PWD)/mergedir"
+	echo '#define MOZ_LANG_TITLE Just testing' > x-test/toolkit/defines.inc
+	$(MAKE) installers-x-test L10NBASEDIR='$(PWD)' LOCALE_MERGEDIR='$(PWD)/mergedir'
--- a/browser/app/Makefile.in
+++ b/browser/app/Makefile.in
@@ -8,21 +8,21 @@ PREF_JS_EXPORTS = $(srcdir)/profile/fire
 		  $(NULL)
 
 
 # hardcode en-US for the moment
 AB_CD = en-US
 
 DEFINES += \
   -DAB_CD=$(AB_CD) \
-  -DFIREFOX_ICO=\"$(DIST)/branding/firefox.ico\" \
-  -DDOCUMENT_ICO=\"$(DIST)/branding/document.ico\" \
-  -DNEWWINDOW_ICO=\"$(DIST)/branding/newwindow.ico\" \
-  -DNEWTAB_ICO=\"$(DIST)/branding/newtab.ico\" \
-  -DPBMODE_ICO=\"$(DIST)/branding/pbmode.ico\" \
+  -DFIREFOX_ICO='"$(DIST)/branding/firefox.ico"' \
+  -DDOCUMENT_ICO='"$(DIST)/branding/document.ico"' \
+  -DNEWWINDOW_ICO='"$(DIST)/branding/newwindow.ico"' \
+  -DNEWTAB_ICO='"$(DIST)/branding/newtab.ico"' \
+  -DPBMODE_ICO='"$(DIST)/branding/pbmode.ico"' \
   $(NULL)
 
 ifdef LIBXUL_SDK #{
 PREF_JS_EXPORTS += $(srcdir)/profile/channel-prefs.js
 endif #} LIBXUL_SDK
 
 # Build a binary bootstrapping with XRE_main
 
@@ -79,17 +79,17 @@ RCFLAGS += -DMOZ_PHOENIX -I$(srcdir)
 else
 RCFLAGS += -DMOZ_PHOENIX --include-dir $(srcdir)
 endif
 endif
 
 ifeq ($(OS_ARCH),OS2)
 RESFILE=splashos2.res
 RCFLAGS += -DMOZ_PHOENIX
-RCFLAGS += -DFIREFOX_ICO=\"$(DIST)/branding/firefox-os2.ico\" -DDOCUMENT_ICO=\"$(DIST)/branding/document-os2.ico\"
+RCFLAGS += -DFIREFOX_ICO='"$(DIST)/branding/firefox-os2.ico"' -DDOCUMENT_ICO='"$(DIST)/branding/document-os2.ico"'
 endif
 
 PROGRAMS_DEST = $(DIST)/bin
 
 include $(topsrcdir)/config/rules.mk
 
 ifeq ($(OS_ARCH),WINNT) #{
 #
@@ -161,20 +161,20 @@ APPFILES = MacOS
 endif
 
 MAC_BUNDLE_VERSION = $(shell $(PYTHON) $(srcdir)/macversion.py --version=$(MOZ_APP_VERSION) --buildid=$(DEPTH)/config/buildid)
 
 .PHONY: repackage
 tools repackage:: $(PROGRAM)
 	$(MKDIR) -p $(dist_dest)/Contents/MacOS
 	$(MKDIR) -p $(dist_dest)/Contents/Resources/$(AB).lproj
-	rsync -a --exclude "*.in" $(srcdir)/macbuild/Contents $(dist_dest) --exclude English.lproj
-	rsync -a --exclude "*.in" $(srcdir)/macbuild/Contents/Resources/English.lproj/ $(dist_dest)/Contents/Resources/$(AB).lproj
-	sed -e "s/%APP_VERSION%/$(MOZ_APP_VERSION)/" -e "s/%MAC_APP_NAME%/$(MAC_APP_NAME)/" -e "s/%MOZ_MACBUNDLE_ID%/$(MOZ_MACBUNDLE_ID)/" -e "s/%MAC_BUNDLE_VERSION%/$(MAC_BUNDLE_VERSION)/" $(srcdir)/macbuild/Contents/Info.plist.in > $(dist_dest)/Contents/Info.plist
-	sed -e "s/%MAC_APP_NAME%/$(MAC_APP_NAME)/" $(srcdir)/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | iconv -f UTF-8 -t UTF-16 > $(dist_dest)/Contents/Resources/$(AB).lproj/InfoPlist.strings
+	rsync -a --exclude '*.in' $(srcdir)/macbuild/Contents $(dist_dest) --exclude English.lproj
+	rsync -a --exclude '*.in' $(srcdir)/macbuild/Contents/Resources/English.lproj/ $(dist_dest)/Contents/Resources/$(AB).lproj
+	sed -e 's/%APP_VERSION%/$(MOZ_APP_VERSION)/' -e 's/%MAC_APP_NAME%/$(MAC_APP_NAME)/' -e 's/%MOZ_MACBUNDLE_ID%/$(MOZ_MACBUNDLE_ID)/' -e 's/%MAC_BUNDLE_VERSION%/$(MAC_BUNDLE_VERSION)/' $(srcdir)/macbuild/Contents/Info.plist.in > $(dist_dest)/Contents/Info.plist
+	sed -e 's/%MAC_APP_NAME%/$(MAC_APP_NAME)/' $(srcdir)/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | iconv -f UTF-8 -t UTF-16 > $(dist_dest)/Contents/Resources/$(AB).lproj/InfoPlist.strings
 	rsync -a $(DIST)/bin/ $(dist_dest)/Contents/$(APPFILES)
 	$(RM) $(dist_dest)/Contents/MacOS/$(PROGRAM)
 	rsync -aL $(PROGRAM) $(dist_dest)/Contents/MacOS
 	cp -RL $(DIST)/branding/firefox.icns $(dist_dest)/Contents/Resources/firefox.icns
 	cp -RL $(DIST)/branding/document.icns $(dist_dest)/Contents/Resources/document.icns
 	printf APPLMOZB > $(dist_dest)/Contents/PkgInfo
 endif
 
--- a/browser/extensions/Makefile.in
+++ b/browser/extensions/Makefile.in
@@ -12,40 +12,40 @@ exclude_files = \
   test \
   install.rdf \
   bootstrap.js \
   icon.png \
   icon64.png \
   $(NULL)
 
 $(FINAL_TARGET)/chrome/pdfjs.manifest: $(GLOBAL_DEPS)
-	printf "manifest pdfjs/chrome.manifest" > $@
+	printf 'manifest pdfjs/chrome.manifest' > $@
 
 libs:: $(FINAL_TARGET)/chrome/pdfjs.manifest
 	$(PYTHON) $(topsrcdir)/config/nsinstall.py \
 	  $(srcdir)/pdfjs \
           $(foreach exclude,$(exclude_files), -X $(srcdir)/pdfjs/$(exclude)) \
           $(FINAL_TARGET)/chrome
-	$(call py_action,buildlist,$(FINAL_TARGET)/chrome.manifest "manifest chrome/pdfjs.manifest")
+	$(call py_action,buildlist,$(FINAL_TARGET)/chrome.manifest 'manifest chrome/pdfjs.manifest')
 
 ifdef NIGHTLY_BUILD
 $(FINAL_TARGET)/chrome/shumway.manifest: $(GLOBAL_DEPS)
-	printf "manifest shumway/chrome.manifest" > $@
+	printf 'manifest shumway/chrome.manifest' > $@
 
 libs:: $(FINAL_TARGET)/chrome/shumway.manifest
 	$(PYTHON) $(topsrcdir)/config/nsinstall.py \
 	  $(srcdir)/shumway \
           $(foreach exclude,$(exclude_files), -X $(srcdir)/shumway/$(exclude)) \
           $(FINAL_TARGET)/chrome
-	$(call py_action,buildlist,$(FINAL_TARGET)/chrome.manifest "manifest chrome/shumway.manifest")
+	$(call py_action,buildlist,$(FINAL_TARGET)/chrome.manifest 'manifest chrome/shumway.manifest')
 endif
 
 ifdef MOZ_METRO
 $(DIST)/bin/metro/chrome/pdfjs.manifest: $(GLOBAL_DEPS)
-	printf "manifest pdfjs/chrome.manifest" > $@
+	printf 'manifest pdfjs/chrome.manifest' > $@
 
 libs:: $(DIST)/bin/metro/chrome/pdfjs.manifest
 	$(PYTHON) $(topsrcdir)/config/nsinstall.py \
 	  $(srcdir)/pdfjs \
           $(foreach exclude,$(exclude_files), -X $(srcdir)/pdfjs/$(exclude)) \
           $(DIST)/bin/metro/chrome
-	$(call py_action,buildlist,$(DIST)/bin/metro/chrome.manifest "manifest chrome/pdfjs.manifest")
+	$(call py_action,buildlist,$(DIST)/bin/metro/chrome.manifest 'manifest chrome/pdfjs.manifest')
 endif
--- a/browser/installer/Makefile.in
+++ b/browser/installer/Makefile.in
@@ -87,17 +87,17 @@ MOZ_PKG_MANIFEST = package-manifest
 
 GARBAGE += $(MOZ_PKG_MANIFEST)
 endif
 
 ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT))
 MOZ_PKG_MAC_DSSTORE=branding/dsstore
 MOZ_PKG_MAC_BACKGROUND=branding/background.png
 MOZ_PKG_MAC_ICON=branding/disk.icns
-MOZ_PKG_MAC_EXTRA=--symlink "/Applications:/ "
+MOZ_PKG_MAC_EXTRA=--symlink '/Applications:/ '
 endif
 
 ifndef LIBXUL_SDK
 INSTALL_SDK = 1
 endif
 
 include $(topsrcdir)/toolkit/mozapps/installer/signing.mk
 include $(topsrcdir)/toolkit/mozapps/installer/packager.mk
@@ -123,17 +123,17 @@ ifeq (Darwin, $(OS_ARCH))
 FINDPATH = $(_APPNAME)/Contents/MacOS
 else
 FINDPATH=bin
 endif
 
 package-compare:: $(MOZ_PKG_MANIFEST)
 ifdef MOZ_PKG_MANIFEST_P
 	cd $(DIST); find $(PKGCOMP_FIND_OPTS) $(FINDPATH) -type f | sort > bin-list.txt
-	grep "^$(BINPATH)" $(MOZ_PKG_MANIFEST) | sed -e 's/^\///' | sort > $(DIST)/pack-list.txt
+	grep '^$(BINPATH)' $(MOZ_PKG_MANIFEST) | sed -e 's/^\///' | sort > $(DIST)/pack-list.txt
 	-diff -u $(DIST)/pack-list.txt $(DIST)/bin-list.txt
 	rm -f $(DIST)/pack-list.txt $(DIST)/bin-list.txt
 endif
 
 installer::
 ifdef INSTALLER_DIR
 	$(MAKE) -C $(INSTALLER_DIR)
 endif
--- a/browser/installer/windows/Makefile.in
+++ b/browser/installer/windows/Makefile.in
@@ -36,17 +36,17 @@ BRANDING_FILES = \
 	wizHeader.bmp \
 	wizHeaderRTL.bmp \
 	wizWatermark.bmp \
 	$(NULL)
 
 DEFINES += \
 	-DAB_CD=$(AB_CD) \
 	-DMOZ_APP_NAME=$(MOZ_APP_NAME) \
-	-DMOZ_APP_DISPLAYNAME="${MOZ_APP_DISPLAYNAME}" \
+	-DMOZ_APP_DISPLAYNAME='${MOZ_APP_DISPLAYNAME}' \
 	-DMOZILLA_VERSION=${MOZILLA_VERSION} \
 	$(NULL)
 
 include $(topsrcdir)/config/config.mk
 
 ifdef LOCALE_MERGEDIR
 PPL_LOCALE_ARGS = \
   --l10n-dir=$(LOCALE_MERGEDIR)/browser/installer \
--- a/browser/locales/Makefile.in
+++ b/browser/locales/Makefile.in
@@ -45,31 +45,31 @@ RETRIEVE_WINDOWS_INSTALLER = 1
 MOZ_LANGPACK_EID=langpack-$(AB_CD)@firefox.mozilla.org
 
 PREF_JS_EXPORTS = $(call MERGE_FILE,firefox-l10n.js)
 
 ifneq (,$(filter cocoa,$(MOZ_WIDGET_TOOLKIT)))
 MOZ_PKG_MAC_DSSTORE=$(_ABS_DIST)/branding/dsstore
 MOZ_PKG_MAC_BACKGROUND=$(_ABS_DIST)/branding/background.png
 MOZ_PKG_MAC_ICON=$(_ABS_DIST)/branding/disk.icns
-MOZ_PKG_MAC_EXTRA=--symlink "/Applications:/ "
+MOZ_PKG_MAC_EXTRA=--symlink '/Applications:/ '
 endif
 
 ifeq (WINNT,$(OS_ARCH))
 UNINSTALLER_PACKAGE_HOOK = $(RM) -r $(STAGEDIST)/uninstall; \
     $(NSINSTALL) -D $(STAGEDIST)/uninstall; \
     cp ../installer/windows/l10ngen/helper.exe $(STAGEDIST)/uninstall; \
     $(RM) $(_ABS_DIST)/l10n-stage/setup.exe; \
     cp ../installer/windows/l10ngen/setup.exe $(_ABS_DIST)/l10n-stage; \
     $(NULL)
 
-STUB_HOOK = $(NSINSTALL) -D "$(_ABS_DIST)/$(PKG_INST_PATH)"; \
-    $(RM) "$(_ABS_DIST)/$(PKG_INST_PATH)$(PKG_STUB_BASENAME).exe"; \
-    cp ../installer/windows/l10ngen/stub.exe "$(_ABS_DIST)/$(PKG_INST_PATH)$(PKG_STUB_BASENAME).exe"; \
-    chmod 0755 "$(_ABS_DIST)/$(PKG_INST_PATH)$(PKG_STUB_BASENAME).exe"; \
+STUB_HOOK = $(NSINSTALL) -D '$(_ABS_DIST)/$(PKG_INST_PATH)'; \
+    $(RM) '$(_ABS_DIST)/$(PKG_INST_PATH)$(PKG_STUB_BASENAME).exe'; \
+    cp ../installer/windows/l10ngen/stub.exe '$(_ABS_DIST)/$(PKG_INST_PATH)$(PKG_STUB_BASENAME).exe'; \
+    chmod 0755 '$(_ABS_DIST)/$(PKG_INST_PATH)$(PKG_STUB_BASENAME).exe'; \
     $(NULL)
 endif
 
 ifeq ($(MOZ_WIDGET_TOOLKIT) $(DIST_SUBDIR),windows metro)
 SEARCHPLUGINS_NAMES = $(shell cat $(call MERGE_FILE,/searchplugins/metrolist.txt))
 else
 SEARCHPLUGINS_NAMES = $(shell cat $(call MERGE_FILE,/searchplugins/list.txt))
 endif
@@ -135,30 +135,30 @@ endif
 	@$(MAKE) libs AB_CD=$* XPI_NAME=locale-$* PREF_DIR=$(PREF_DIR)
 ifdef MOZ_METRO
 	@$(MAKE) -C ../metro/locales AB_CD=$* XPI_NAME=locale-$*
 endif
 	@$(MAKE) -C $(DEPTH)/$(MOZ_BRANDING_DIRECTORY)/locales AB_CD=$* XPI_NAME=locale-$*
 
 repackage-win32-installer: WIN32_INSTALLER_OUT=$(_ABS_DIST)/$(PKG_INST_PATH)$(PKG_INST_BASENAME).exe
 repackage-win32-installer: $(call ESCAPE_WILDCARD,$(WIN32_INSTALLER_IN)) $(SUBMAKEFILES) libs-$(AB_CD)
-	@echo "Repackaging $(WIN32_INSTALLER_IN) into $(WIN32_INSTALLER_OUT)."
+	@echo 'Repackaging $(WIN32_INSTALLER_IN) into $(WIN32_INSTALLER_OUT).'
 	$(MAKE) -C $(DEPTH)/$(MOZ_BRANDING_DIRECTORY) export
 	$(MAKE) -C ../installer/windows CONFIG_DIR=l10ngen l10ngen/setup.exe l10ngen/7zSD.sfx
 	$(MAKE) repackage-zip \
 	  AB_CD=$(AB_CD) \
 	  MOZ_PKG_FORMAT=SFX7Z \
-	  ZIP_IN="$(WIN32_INSTALLER_IN)" \
-	  ZIP_OUT="$(WIN32_INSTALLER_OUT)" \
-	  SFX_HEADER="$(PWD)/../installer/windows/l10ngen/7zSD.sfx \
-	              $(topsrcdir)/browser/installer/windows/app.tag"
+	  ZIP_IN='$(WIN32_INSTALLER_IN)' \
+	  ZIP_OUT='$(WIN32_INSTALLER_OUT)' \
+	  SFX_HEADER='$(PWD)/../installer/windows/l10ngen/7zSD.sfx \
+	              $(topsrcdir)/browser/installer/windows/app.tag'
 
 ifeq (WINNT,$(OS_ARCH))
 repackage-win32-installer-%: $(STAGEDIST)
-	@$(MAKE) repackage-win32-installer AB_CD=$* WIN32_INSTALLER_IN="$(WIN32_INSTALLER_IN)"
+	@$(MAKE) repackage-win32-installer AB_CD=$* WIN32_INSTALLER_IN='$(WIN32_INSTALLER_IN)'
 
 repackage-zip-%: repackage-win32-installer-%
 else
 repackage-win32-installer-%: ;
 endif
 
 
 clobber-zip:
@@ -177,57 +177,57 @@ clobber-zip:
 
 langpack: langpack-$(AB_CD)
 
 # This is a generic target that will make a langpack, repack ZIP (+tarball)
 # builds, and repack an installer if applicable. It is called from the
 # tinderbox scripts. Alter it with caution.
 
 installers-%: clobber-% langpack-% repackage-win32-installer-% repackage-zip-%
-	@echo "repackaging done"
+	@echo 'repackaging done'
 
 ifdef MOZ_UPDATER
 # Note that we want updater.ini to be in the top directory, not the browser/
 # subdirectory, because that's where the updater is installed and runs.
 libs:: $(call MERGE_FILE,updater/updater.ini) $(call mkdir_deps,$(DIST)/bin)
 ifeq ($(OS_ARCH),WINNT)
 	cat $< $(srcdir)/../installer/windows/nsis/updater_append.ini | \
-	  sed -e "s/^InfoText=/Info=/" -e "s/^TitleText=/Title=/" | \
-	  sed -e "s/%MOZ_APP_DISPLAYNAME%/$(MOZ_APP_DISPLAYNAME)/" > \
+	  sed -e 's/^InfoText=/Info=/' -e 's/^TitleText=/Title=/' | \
+	  sed -e 's/%MOZ_APP_DISPLAYNAME%/$(MOZ_APP_DISPLAYNAME)/' > \
 	  $(FINAL_TARGET)/../updater.ini
 else
 	cat $< | \
-	  sed -e "s/^InfoText=/Info=/" -e "s/^TitleText=/Title=/" | \
-	  sed -e "s/%MOZ_APP_DISPLAYNAME%/$(MOZ_APP_DISPLAYNAME)/" > \
+	  sed -e 's/^InfoText=/Info=/' -e 's/^TitleText=/Title=/' | \
+	  sed -e 's/%MOZ_APP_DISPLAYNAME%/$(MOZ_APP_DISPLAYNAME)/' > \
 	  $(FINAL_TARGET)/../updater.ini
 endif
 endif
 
 ifdef MOZ_CRASHREPORTER
 libs:: crashreporter-override.ini
 	$(SYSINSTALL) $(IFLAGS1) $^ $(FINAL_TARGET)
 endif
 
 ident:
-	@printf "fx_revision "
+	@printf 'fx_revision '
 	@$(PYTHON) $(topsrcdir)/config/printconfigsetting.py \
 	    $(STAGEDIST)/application.ini App SourceStamp
-	@printf "buildid "
+	@printf 'buildid '
 	@$(PYTHON) $(topsrcdir)/config/printconfigsetting.py \
 	    $(STAGEDIST)/application.ini App BuildID
 
 merge-%:
 ifdef LOCALE_MERGEDIR
 	$(RM) -rf $(LOCALE_MERGEDIR)
 	MACOSX_DEPLOYMENT_TARGET= compare-locales -m $(LOCALE_MERGEDIR) $(srcdir)/l10n.ini $(L10NBASEDIR) $*
 endif
 	@echo
 
 # test target, depends on make package
 # try to repack x-test, with just toolkit/defines.inc being there
 l10n-check:: INNER_UNMAKE_PACKAGE=true
 l10n-check::
 	$(RM) -rf x-test
 	$(NSINSTALL) -D x-test/toolkit
-	echo "#define MOZ_LANG_TITLE Just testing" > x-test/toolkit/defines.inc
-	$(MAKE) installers-x-test L10NBASEDIR="$(PWD)" LOCALE_MERGEDIR="$(PWD)/mergedir"
+	echo '#define MOZ_LANG_TITLE Just testing' > x-test/toolkit/defines.inc
+	$(MAKE) installers-x-test L10NBASEDIR='$(PWD)' LOCALE_MERGEDIR='$(PWD)/mergedir'
 	$(PYTHON) $(topsrcdir)/toolkit/mozapps/installer/unpack.py $(DIST)/l10n-stage/$(STAGEPATH)$(MOZ_PKG_DIR)$(_BINPATH)
 	cd $(DIST)/l10n-stage && test $$(cat $(STAGEPATH)$(MOZ_PKG_DIR)$(_BINPATH)/update.locale) = x-test
--- a/browser/metro/Makefile.in
+++ b/browser/metro/Makefile.in
@@ -7,17 +7,17 @@ include $(topsrcdir)/config/rules.mk
 #########################################
 # application.ini
 
 GRE_BUILDID := $(shell cat $(DEPTH)/config/buildid)
 DEFINES += -DGRE_BUILDID=$(GRE_BUILDID) -DMOZ_APP_BASENAME=$(MOZ_APP_BASENAME)
 
 # 'application.ini' breaks firefox build config. So we use something different.
 metroapp.ini: metroapp.ini.in $(DEPTH)/config/buildid $(topsrcdir)/config/milestone.txt
-	$(RM) "metroapp.ini"
+	$(RM) metroapp.ini
 	$(call py_action,preprocessor,$(DEFINES) $< -o $@)
 
 libs:: metroapp.ini
 	$(INSTALL) metroapp.ini $(FINAL_TARGET)
 
 #########################################
 
 GARBAGE += metroapp.ini
--- a/browser/metro/locales/Makefile.in
+++ b/browser/metro/locales/Makefile.in
@@ -14,11 +14,11 @@ include $(topsrcdir)/config/rules.mk
 #########################################
 # Branding
 
 # 'browser/branding/nightly' -> 'nightly'
 BRANDFOLDER = $(notdir $(MOZ_BRANDING_DIRECTORY))
 
 branding-$(BRANDFOLDER):
 	$(MAKE) -C $(DEPTH)/browser/branding/$(BRANDFOLDER) \
-	  DIST_SUBDIR=$(DIST_SUBDIR) XPI_ROOT_APPID="$(XPI_ROOT_APPID)"
+	  DIST_SUBDIR=$(DIST_SUBDIR) XPI_ROOT_APPID='$(XPI_ROOT_APPID)'
 
 libs:: branding-$(BRANDFOLDER)
--- a/browser/metro/locales/import/Makefile.in
+++ b/browser/metro/locales/import/Makefile.in
@@ -19,17 +19,17 @@ PREF_JS_EXPORTS = $(firstword $(wildcard
 include $(topsrcdir)/config/rules.mk
 
 #########################################
 # Search plugins
 
 # Metro reuses desktop search plugins
 libs::
 	$(MAKE) -C $(DEPTH)/browser/locales searchplugins \
-	  DIST_SUBDIR=$(DIST_SUBDIR) XPI_ROOT_APPID="$(XPI_ROOT_APPID)"
+	  DIST_SUBDIR=$(DIST_SUBDIR) XPI_ROOT_APPID='$(XPI_ROOT_APPID)'
 
 #########################################
 # Bookmarks
 
 # Pick up desktop's bookmarks.inc file
 ifdef LOCALE_MERGEDIR
 vpath book%.inc $(LOCALE_MERGEDIR)/browser/profile
 endif
@@ -38,15 +38,15 @@ ifdef LOCALE_MERGEDIR
 vpath book%.inc @top_srcdir@/$(relativesrcdir)/en-US/profile
 endif
 
 bookmarks-src = $(srcdir)/../generic/profile/bookmarks.json.in
 
 # The resulting bookmarks.json will get picked up and packaged by the
 # processing of the jar file in the parent directory.
 bookmarks: bookmarks.inc
-	@echo "Generating: $@"
+	@echo 'Generating: $@'
 	$(call py_action,preprocessor, \
 	  -I $^ \
 	  -DAB_CD=$(AB_CD) \
 	  $(bookmarks-src) -o ../bookmarks.json)
 
 export:: bookmarks
--- a/browser/themes/linux/Makefile.in
+++ b/browser/themes/linux/Makefile.in
@@ -9,19 +9,19 @@ INSTALL_TARGETS += ICON
 # By default, the pre-processor used for jar.mn will use "%" as a marker for ".css" files and "#"
 # otherwise. This falls apart when a file using one marker needs to include a file with the other
 # marker since the pre-processor instructions in the included file will not be processed. The
 # following SVG files need to include a file which uses "%" as the marker so we invoke the pre-
 # processor ourselves here with the marker specified. The resulting SVG files will get packaged by
 # the processing of the jar file in this directory.
 tab-selected-svg: $(srcdir)/../shared/tab-selected.svg
 	$(call py_action,preprocessor, \
-	  --marker "%" -D TAB_SIDE=start \
+	  --marker % -D TAB_SIDE=start \
 	  $(ACDEFINES) \
 	  $(srcdir)/../shared/tab-selected.svg -o tab-selected-start.svg)
 	$(call py_action,preprocessor, \
-	  --marker "%" -D TAB_SIDE=end \
+	  --marker % -D TAB_SIDE=end \
 	  $(ACDEFINES) \
 	  $(srcdir)/../shared/tab-selected.svg -o tab-selected-end.svg)
 
 .PHONY: tab-selected-svg
 
 export:: tab-selected-svg
--- a/browser/themes/osx/Makefile.in
+++ b/browser/themes/osx/Makefile.in
@@ -9,19 +9,19 @@ INSTALL_TARGETS += ICON
 # By default, the pre-processor used for jar.mn will use "%" as a marker for ".css" files and "#"
 # otherwise. This falls apart when a file using one marker needs to include a file with the other
 # marker since the pre-processor instructions in the included file will not be processed. The
 # following SVG files need to include a file which uses "%" as the marker so we invoke the pre-
 # processor ourselves here with the marker specified. The resulting SVG files will get packaged by
 # the processing of the jar file in this directory.
 tab-selected-svg: $(srcdir)/../shared/tab-selected.svg
 	$(call py_action,preprocessor, \
-	  --marker "%" -D TAB_SIDE=start \
+	  --marker % -D TAB_SIDE=start \
 	  $(ACDEFINES) \
 	  $(srcdir)/../shared/tab-selected.svg -o tab-selected-start.svg)
 	$(call py_action,preprocessor, \
-	  --marker "%" -D TAB_SIDE=end \
+	  --marker % -D TAB_SIDE=end \
 	  $(ACDEFINES) \
 	  $(srcdir)/../shared/tab-selected.svg -o tab-selected-end.svg)
 
 .PHONY: tab-selected-svg
 
 export:: tab-selected-svg
--- a/build/Makefile.in
+++ b/build/Makefile.in
@@ -23,24 +23,24 @@ endif
 
 APP_BUILDID := $(shell cat $(DEPTH)/config/buildid)
 APP_INI_DEPS += $(DEPTH)/config/buildid
 
 DEFINES += -DAPP_BUILDID=$(APP_BUILDID)
 
 APP_INI_DEPS += $(DEPTH)/config/autoconf.mk
 
-MOZ_SOURCE_STAMP := $(firstword $(shell cd $(topsrcdir)/$(MOZ_BUILD_APP)/.. && hg parent --template="{node|short}\n" 2>/dev/null))
+MOZ_SOURCE_STAMP := $(firstword $(shell cd $(topsrcdir)/$(MOZ_BUILD_APP)/.. && hg parent --template='{node|short}\n' 2>/dev/null))
 ifdef MOZ_SOURCE_STAMP
-DEFINES += -DMOZ_SOURCE_STAMP="$(MOZ_SOURCE_STAMP)"
+DEFINES += -DMOZ_SOURCE_STAMP='$(MOZ_SOURCE_STAMP)'
 endif
 
 source_repo ?= $(call getSourceRepo,$(topsrcdir)/$(MOZ_BUILD_APP)/..)
 ifneq (,$(source_repo))
-  DEFINES += -DMOZ_SOURCE_REPO="$(source_repo)"
+  DEFINES += -DMOZ_SOURCE_REPO='$(source_repo)'
 endif
 
 endif
 
 # Put a useful .gdbinit in the bin directory, to be picked up automatically
 # by GDB when we debug executables there.
 # NOTE: Keep .gdbinit in the topsrcdir for people who run gdb from the topsrcdir.
 GDBINIT_FILES := $(topsrcdir)/.gdbinit
--- a/build/automation-build.mk
+++ b/build/automation-build.mk
@@ -1,28 +1,28 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 include $(MOZILLA_DIR)/build/binary-location.mk
 
-browser_path := \"$(browser_path)\"
+browser_path := '"$(browser_path)"'
 
 _PROFILE_DIR = $(TARGET_DEPTH)/_profile/pgo
 
 ABSOLUTE_TOPSRCDIR = $(abspath $(MOZILLA_DIR))
 _CERTS_SRC_DIR = $(ABSOLUTE_TOPSRCDIR)/build/pgo/certs
 
 AUTOMATION_PPARGS = 	\
 			-DBROWSER_PATH=$(browser_path) \
-			-DXPC_BIN_PATH=\"$(LIBXUL_DIST)/bin\" \
-			-DBIN_SUFFIX=\"$(BIN_SUFFIX)\" \
-			-DPROFILE_DIR=\"$(_PROFILE_DIR)\" \
-			-DCERTS_SRC_DIR=\"$(_CERTS_SRC_DIR)\" \
-			-DPERL="\"$(PERL)\"" \
+			-DXPC_BIN_PATH='"$(LIBXUL_DIST)/bin"' \
+			-DBIN_SUFFIX='"$(BIN_SUFFIX)"' \
+			-DPROFILE_DIR='"$(_PROFILE_DIR)"' \
+			-DCERTS_SRC_DIR='"$(_CERTS_SRC_DIR)"' \
+			-DPERL='"$(PERL)"' \
 			$(NULL)
 
 ifeq ($(OS_ARCH),Darwin)
 AUTOMATION_PPARGS += -DIS_MAC=1
 else
 AUTOMATION_PPARGS += -DIS_MAC=0
 endif
 
--- a/build/package/Makefile.in
+++ b/build/package/Makefile.in
@@ -53,17 +53,17 @@ maketgz-%:
 makebz2-%:
 	$(PERL) $(srcdir)/stage-packages.pl -o $(DEPTH) -l $(PACKAGE_LIST) -s $(STAGE_DIR) $(addprefix -m ,$(MAPPINGS)) $(addprefix -c ,$(HANDLERS)) --make-package bz2=$(BZ2_FILE) -d $(PACKAGE_FLAGS) $*
 
 makedmg-%:
 	$(PERL) $(srcdir)/stage-packages.pl -o $(DEPTH) -l $(PACKAGE_LIST) -s $(STAGE_DIR) $(addprefix -m ,$(MACAPP_MAPPINGS)) $(addprefix -c ,$(HANDLERS)) --make-package dmg=$(DMG_FILE) -d $(PACKAGE_FLAGS) $*
 
 ifndef PACKAGES
 stage-packages makexpi-packages:
-	@echo "Please set PACKAGES on the makefile command line or environment."
+	@echo 'Please set PACKAGES on the makefile command line or environment.'
 
 else #PACKAGES
 stage-packages:
 	$(PERL) $(srcdir)/stage-packages.pl -o $(DEPTH) -l $(PACKAGE_LIST) -s $(STAGE_DIR) $(addprefix -m ,$(MAPPINGS)) $(apprefix -c ,$(HANDLERS)) $(PACKAGE_FLAGS) $(PACKAGES)
 
 makexpi-packages:
 	$(PERL) $(srcdir)/stage-packages.pl -o $(DEPTH) -l $(PACKAGE_LIST) -s $(STAGE_DIR) $(addprefix -m ,$(MAPPINGS)) $(apprefix -c ,$(HANDLERS)) --make-package xpi=$(XPI_FILE) -d $(PACKAGE_FLAGS) $(PACKAGES)
 
index aa38b3b0d57ae2c303d6873e659ee0f288853e3e..38c3dfe1146e6a1a279c8b01c5f1bc3c0231fd09
GIT binary patch
literal 65536
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
z{BD9j{gXd;0RR9100000000000000000000000000000000000000000000000000
S00000000000001Bg#QBjPfi2?
deleted file mode 100644
--- a/build/pgo/certs/evroot.ca
+++ /dev/null
@@ -1,32 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFljCCBH6gAwIBAgIJAK/FPSJmJkkyMA0GCSqGSIb3DQEBBQUAMIHhMQswCQYD
-VQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxIzAh
-BgNVBAoTGk1vemlsbGEgLSBFViBkZWJ1ZyB0ZXN0IENBMR0wGwYDVQQLExRTZWN1
-cml0eSBFbmdpbmVlcmluZzEmMCQGA1UEAxMdRVYgVGVzdGluZyAodW50cnVzdHdv
-cnRoeSkgQ0ExEzARBgNVBCkTCmV2LXRlc3QtY2ExLDAqBgkqhkiG9w0BCQEWHWNo
-YXJsYXRhbkB0ZXN0aW5nLmV4YW1wbGUuY29tMB4XDTEzMDIxNDE3NDkwMFoXDTIz
-MDIxMjE3NDkwMFowgeExCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UE
-BxMNTW91bnRhaW4gVmlldzEjMCEGA1UEChMaTW96aWxsYSAtIEVWIGRlYnVnIHRl
-c3QgQ0ExHTAbBgNVBAsTFFNlY3VyaXR5IEVuZ2luZWVyaW5nMSYwJAYDVQQDEx1F
-ViBUZXN0aW5nICh1bnRydXN0d29ydGh5KSBDQTETMBEGA1UEKRMKZXYtdGVzdC1j
-YTEsMCoGCSqGSIb3DQEJARYdY2hhcmxhdGFuQHRlc3RpbmcuZXhhbXBsZS5jb20w
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCk+k5mvnrxhVdVnhaxCeDG
-ZC5kcC8951K3xTkh2JMtUpSQL2IoGLOZOWTNY+2wGNyHbdJjKDv1d0bzZfz3yDkB
-AbY6OcxS4WkwccKsyIzkdacpYWhi7kEFevm9p7TI8jdrpKmItrlqfZKfteh+K+DF
-XZF7xp6zpoUis6dykmk5v8RivpCZl7HIlsOW0wSqCocXWH/WWFgAQyozjW8MgGOL
-/eV2aLsx+yg7it9GMMtyidggwvlYM7O8vY0gJqQKXntbHq1zV7jIJ3bXzJceur+G
-Ce4HvsRHAQUSl6jUfm00aKkqS+1t3svZURIKM6qWAuIKMGcspv+L8lyn1KImG8M5
-AgMBAAGjggFNMIIBSTAdBgNVHQ4EFgQUyJg651hwk+3BV0rQvQZv9n2bWPYwggEY
-BgNVHSMEggEPMIIBC4AUyJg651hwk+3BV0rQvQZv9n2bWPahgeekgeQwgeExCzAJ
-BgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEj
-MCEGA1UEChMaTW96aWxsYSAtIEVWIGRlYnVnIHRlc3QgQ0ExHTAbBgNVBAsTFFNl
-Y3VyaXR5IEVuZ2luZWVyaW5nMSYwJAYDVQQDEx1FViBUZXN0aW5nICh1bnRydXN0
-d29ydGh5KSBDQTETMBEGA1UEKRMKZXYtdGVzdC1jYTEsMCoGCSqGSIb3DQEJARYd
-Y2hhcmxhdGFuQHRlc3RpbmcuZXhhbXBsZS5jb22CCQCvxT0iZiZJMjAMBgNVHRME
-BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAcKVLC9MbdSZjzkVBseCm6t49aIIBm
-xQrsTNV2Gnp5eIXBfUhNAfD0zbBcKHK9AfHmNT8ZK6iABjiOrnn6yQNufW5MMdNx
-+/4FtTmdlBPLpyuBY7re+XbIaPxr/jB9jJ1pmh52xH3wMkO7ATDQ2fqFnODFrUKS
-UpXzuydPnsCdu32KPSnewIrkDB10Sah7vw3uwASO2GWqaFtUDFWGpt6rYQTcOF8g
-7a6Zj0johBMQFHE3HDRebWxiOf21ppN/tvv0gtGiA0ZIXBezeLaJ+Hob1xTbi4sw
-sGYDKHPCrLuTZWXmkv0rAIkLLK4VHbsA5xYPQNJJsTpX3u0Z0vZxJd9/
------END CERTIFICATE-----
--- a/build/pgo/server-locations.txt
+++ b/build/pgo/server-locations.txt
@@ -96,18 +96,16 @@ https://self-signed.example.com:443    p
 https://untrusted.example.com:443      privileged,cert=untrusted
 https://expired.example.com:443        privileged,cert=expired
 https://requestclientcert.example.com:443         privileged,clientauth=request
 https://requireclientcert.example.com:443         privileged,clientauth=require
 https://mismatch.expired.example.com:443	privileged,cert=expired
 https://mismatch.untrusted.example.com:443	privileged,cert=untrusted
 https://untrusted-expired.example.com:443	privileged,cert=untrustedandexpired
 https://mismatch.untrusted-expired.example.com:443	privileged,cert=untrustedandexpired
-https://ev-valid.example.com:443	privileged,cert=evvalid
-https://ev-invalid.example.com:443      priviliged,cert=evinvalid
 
 # This is here so that we don't load the default live bookmark over
 # the network in every test suite.
 http://fxfeeds.mozilla.com:80
 
 # Prevent safebrowsing tests from hitting the network for its-a-trap.html and
 # its-an-attack.html.
 http://www.mozilla.org:80
--- a/build/unix/elfhack/Makefile.in
+++ b/build/unix/elfhack/Makefile.in
@@ -22,17 +22,17 @@ test-array$(DLL_SUFFIX) test-ctors$(DLL_
 	@echo === and your environment \(compiler and linker versions\), and use
 	@echo === --disable-elf-hack until this is fixed.
 	@echo ===
 	# Fail if the library doesn't have $(DT_TYPE) .dynamic info
 	$(TOOLCHAIN_PREFIX)readelf -d $@ | grep '($(DT_TYPE))'
 	@rm -f $@.bak
 	$(CURDIR)/elfhack -b -f $@
 	# Fail if the backup file doesn't exist
-	[ -f "$@.bak" ]
+	[ -f '$@.bak' ]
 	# Fail if the new library doesn't contain less relocations
 	[ $$($(TOOLCHAIN_PREFIX)objdump -R $@.bak | wc -l) -gt $$(objdump -R $@ | wc -l) ]
 
 test-array$(DLL_SUFFIX): DT_TYPE=INIT_ARRAY
 test-ctors$(DLL_SUFFIX): DT_TYPE=INIT
 
 .PRECIOUS: test-array$(DLL_SUFFIX) test-ctors$(DLL_SUFFIX)
 
--- a/build/win32/Makefile.in
+++ b/build/win32/Makefile.in
@@ -39,17 +39,17 @@ REDIST_FILES = \
 endif
 
 ifdef REDIST_FILES
 libs-preqs = \
   $(call mkdir_deps,$(FINAL_TARGET)) \
   $(NULL)
 
 libs:: $(libs-preqs)
-	install --preserve-timestamps $(foreach f,$(REDIST_FILES),"$(WIN32_REDIST_DIR)"/$(f)) $(FINAL_TARGET)
+	install --preserve-timestamps $(foreach f,$(REDIST_FILES),'$(WIN32_REDIST_DIR)'/$(f)) $(FINAL_TARGET)
 endif
 
 endif # ! MOZ_DEBUG
 endif # WIN32_REDIST_DIR
 
 # run the binscope tool to make sure the binary and all libraries
 # are using all available Windows OS-level security mechanisms
 check::
--- a/client.mk
+++ b/client.mk
@@ -199,17 +199,17 @@ endif
 else
 WANT_MOZCONFIG_MK = 1
 endif
 
 ifdef WANT_MOZCONFIG_MK
 # For now, only output "export" lines from mozconfig2client-mk output.
 MOZCONFIG_MK_LINES := $(filter export||%,$(MOZCONFIG_OUT_LINES))
 $(OBJDIR)/.mozconfig.mk: $(FOUND_MOZCONFIG) $(call mkdir_deps,$(OBJDIR))
-	$(if $(MOZCONFIG_MK_LINES),( $(foreach line,$(MOZCONFIG_MK_LINES), echo "$(subst ||, ,$(line))";) )) > $@
+	$(if $(MOZCONFIG_MK_LINES),( $(foreach line,$(MOZCONFIG_MK_LINES), echo '$(subst ||, ,$(line))';) )) > $@
 
 # Include that makefile so that it is created. This should not actually change
 # the environment since MOZCONFIG_CONTENT, which MOZCONFIG_OUT_LINES derives
 # from, has already been eval'ed.
 -include $(OBJDIR)/.mozconfig.mk
 endif
 
 # Print out any options loaded from mozconfig.
@@ -273,17 +273,17 @@ ifndef MOZ_BUILD_PROJECTS
 	for mkfile in $(MOZ_PREFLIGHT_ALL); do \
 	  $(MAKE) -f $(TOPSRCDIR)/$$mkfile preflight_all TOPSRCDIR=$(TOPSRCDIR) OBJDIR=$(OBJDIR) MOZ_OBJDIR=$(MOZ_OBJDIR); \
 	done
 else
 # OBJDIR refers to the project-specific OBJDIR, which is not available at
 # this point when building multiple projects.  Only MOZ_OBJDIR is available.
 	set -e; \
 	for mkfile in $(MOZ_PREFLIGHT_ALL); do \
-	  $(MAKE) -f $(TOPSRCDIR)/$$mkfile preflight_all TOPSRCDIR=$(TOPSRCDIR) MOZ_OBJDIR=$(MOZ_OBJDIR) MOZ_BUILD_PROJECTS="$(MOZ_BUILD_PROJECTS)"; \
+	  $(MAKE) -f $(TOPSRCDIR)/$$mkfile preflight_all TOPSRCDIR=$(TOPSRCDIR) MOZ_OBJDIR=$(MOZ_OBJDIR) MOZ_BUILD_PROJECTS='$(MOZ_BUILD_PROJECTS)'; \
 	done
 endif
 endif
 
 # If we're building multiple projects, but haven't specified which project,
 # loop through them.
 
 ifeq (,$(MOZ_CURRENT_PROJECT)$(if $(MOZ_BUILD_PROJECTS),,1))
@@ -325,17 +325,17 @@ CONFIG_STATUS_DEPS := \
   $(TOPSRCDIR)/js/src/config/milestone.txt \
   $(TOPSRCDIR)/browser/config/version.txt \
   $(TOPSRCDIR)/build/virtualenv_packages.txt \
   $(TOPSRCDIR)/python/mozbuild/mozbuild/virtualenv.py \
   $(TOPSRCDIR)/testing/mozbase/packages.txt \
   $(NULL)
 
 CONFIGURE_ENV_ARGS += \
-  MAKE="$(MAKE)" \
+  MAKE='$(MAKE)' \
   $(NULL)
 
 # configure uses the program name to determine @srcdir@. Calling it without
 #   $(TOPSRCDIR) will set @srcdir@ to "."; otherwise, it is set to the full
 #   path of $(TOPSRCDIR).
 ifeq ($(TOPSRCDIR),$(OBJDIR))
   CONFIGURE = ./configure
 else
@@ -358,18 +358,18 @@ configure-preqs = \
 
 save-mozconfig: $(FOUND_MOZCONFIG)
 	-cp $(FOUND_MOZCONFIG) $(OBJDIR)/.mozconfig
 
 configure:: $(configure-preqs)
 	@echo cd $(OBJDIR);
 	@echo $(CONFIGURE) $(CONFIGURE_ARGS)
 	@cd $(OBJDIR) && $(BUILD_PROJECT_ARG) $(CONFIGURE_ENV_ARGS) $(CONFIGURE) $(CONFIGURE_ARGS) \
-	  || ( echo "*** Fix above errors and then restart with\
-               \"$(MAKE) -f client.mk build\"" && exit 1 )
+	  || ( echo '*** Fix above errors and then restart with\
+               "$(MAKE) -f client.mk build"' && exit 1 )
 	@touch $(OBJDIR)/Makefile
 
 ifneq (,$(MAKEFILE))
 $(OBJDIR)/Makefile: $(OBJDIR)/config.status
 
 $(OBJDIR)/config.status: $(CONFIG_STATUS_DEPS)
 else
 $(OBJDIR)/Makefile: $(CONFIG_STATUS_DEPS)
@@ -432,27 +432,27 @@ ifndef MOZ_BUILD_PROJECTS
 	for mkfile in $(MOZ_POSTFLIGHT_ALL); do \
 	  $(MAKE) -f $(TOPSRCDIR)/$$mkfile postflight_all TOPSRCDIR=$(TOPSRCDIR) OBJDIR=$(OBJDIR) MOZ_OBJDIR=$(MOZ_OBJDIR); \
 	done
 else
 # OBJDIR refers to the project-specific OBJDIR, which is not available at
 # this point when building multiple projects.  Only MOZ_OBJDIR is available.
 	set -e; \
 	for mkfile in $(MOZ_POSTFLIGHT_ALL); do \
-	  $(MAKE) -f $(TOPSRCDIR)/$$mkfile postflight_all TOPSRCDIR=$(TOPSRCDIR) MOZ_OBJDIR=$(MOZ_OBJDIR) MOZ_BUILD_PROJECTS="$(MOZ_BUILD_PROJECTS)"; \
+	  $(MAKE) -f $(TOPSRCDIR)/$$mkfile postflight_all TOPSRCDIR=$(TOPSRCDIR) MOZ_OBJDIR=$(MOZ_OBJDIR) MOZ_BUILD_PROJECTS='$(MOZ_BUILD_PROJECTS)'; \
 	done
 endif
 endif
 
 cleansrcdir:
 	@cd $(TOPSRCDIR); \
 	if [ -f Makefile ]; then \
 	  $(MAKE) distclean ; \
 	else \
-	  echo "Removing object files from srcdir..."; \
+	  echo 'Removing object files from srcdir...'; \
 	  rm -fr `find . -type d \( -name .deps -print -o -name CVS \
 	          -o -exec test ! -d {}/CVS \; \) -prune \
 	          -o \( -name '*.[ao]' -o -name '*.so' \) -type f -print`; \
 	   build/autoconf/clean-config.sh; \
 	fi;
 
 # Because SpiderMonkey can be distributed and built independently
 # of the Mozilla source tree, it contains its own copies of many of
--- a/config/Makefile.in
+++ b/config/Makefile.in
@@ -54,17 +54,17 @@ PYTHON_UNIT_TESTS := $(wildcard $(srcdir
 include $(topsrcdir)/config/rules.mk
 
 HOST_CFLAGS += -DUNICODE -D_UNICODE
 
 # Generate a new buildid every time we "export" in config... that's only
 # supposed to be once per-build!
 export::
 ifdef MOZ_BUILD_DATE
-	printf "%s" $(MOZ_BUILD_DATE) > buildid
+	printf '%s' $(MOZ_BUILD_DATE) > buildid
 else
 	$(PYTHON) $(topsrcdir)/toolkit/xre/make-platformini.py --print-buildid > buildid
 endif
 
 ifdef WRAP_SYSTEM_INCLUDES
 export-preqs = \
   $(call mkdir_deps,system_wrappers) \
   $(NULL)
--- a/config/config.mk
+++ b/config/config.mk
@@ -806,17 +806,17 @@ MERGE_FILE = $(firstword \
   $(wildcard $(LOCALE_SRCDIR)/$(1)) \
   $(srcdir)/en-US/$(1) )
 else
 MERGE_FILE = $(LOCALE_SRCDIR)/$(1)
 endif
 MERGE_FILES = $(foreach f,$(1),$(call MERGE_FILE,$(f)))
 
 ifeq (OS2,$(OS_ARCH))
-RUN_TEST_PROGRAM = $(topsrcdir)/build/os2/test_os2.cmd "$(LIBXUL_DIST)"
+RUN_TEST_PROGRAM = $(topsrcdir)/build/os2/test_os2.cmd '$(LIBXUL_DIST)'
 else
 ifneq (WINNT,$(OS_ARCH))
 RUN_TEST_PROGRAM = $(LIBXUL_DIST)/bin/run-mozilla.sh
 endif # ! WINNT
 endif # ! OS2
 
 #
 # Java macros
@@ -843,17 +843,17 @@ EXPAND_LD = $(EXPAND_LIBS_EXEC) --uselis
 EXPAND_MKSHLIB_ARGS = --uselist
 ifdef SYMBOL_ORDER
 EXPAND_MKSHLIB_ARGS += --symbol-order $(SYMBOL_ORDER)
 endif
 EXPAND_MKSHLIB = $(EXPAND_LIBS_EXEC) $(EXPAND_MKSHLIB_ARGS) -- $(MKSHLIB)
 
 ifneq (,$(MOZ_LIBSTDCXX_TARGET_VERSION)$(MOZ_LIBSTDCXX_HOST_VERSION))
 ifneq ($(OS_ARCH),Darwin)
-CHECK_STDCXX = objdump -p $(1) | grep -e 'GLIBCXX_3\.4\.\(9\|[1-9][0-9]\)' > /dev/null && echo "TEST-UNEXPECTED-FAIL | | We don't want these libstdc++ symbols to be used:" && objdump -T $(1) | grep -e 'GLIBCXX_3\.4\.\(9\|[1-9][0-9]\)' && exit 1 || exit 0
+CHECK_STDCXX = objdump -p $(1) | grep -e 'GLIBCXX_3\.4\.\(9\|[1-9][0-9]\)' > /dev/null && echo 'TEST-UNEXPECTED-FAIL | | We do not want these libstdc++ symbols to be used:' && objdump -T $(1) | grep -e 'GLIBCXX_3\.4\.\(9\|[1-9][0-9]\)' && exit 1 || exit 0
 endif
 
 ifdef MOZ_LIBSTDCXX_TARGET_VERSION
 EXTRA_LIBS += $(call EXPAND_LIBNAME_PATH,stdc++compat,$(DEPTH)/build/unix/stdc++compat)
 endif
 ifdef MOZ_LIBSTDCXX_HOST_VERSION
 HOST_EXTRA_LIBS += $(call EXPAND_LIBNAME_PATH,host_stdc++compat,$(DEPTH)/build/unix/stdc++compat)
 endif
--- a/config/makefiles/autotargets.mk
+++ b/config/makefiles/autotargets.mk
@@ -51,28 +51,28 @@ mkdir_stem =$(foreach val,$(getargv),$(s
 ## Generate timestamp file for threadsafe directory creation
 mkdir_deps =$(foreach dir,$(getargv),$(call slash_strip,$(dir)/.mkdir.done))
 
 #######################
 ##---]  TARGETS  [---##
 #######################
 
 %/.mkdir.done: # mkdir -p -p => mkdir -p
-	$(subst $(space)-p,$(null),$(MKDIR)) -p "$(dir $@)"
+	$(subst $(space)-p,$(null),$(MKDIR)) -p '$(dir $@)'
 # Make the timestamp old enough for not being a problem with symbolic links
 # targets depending on it. Use Jan 3, 1980 to accomodate any timezone where
 # 198001010000 would translate to something older than FAT epoch.
-	@$(TOUCH) -t 198001030000 "$@"
+	@$(TOUCH) -t 198001030000 '$@'
 
 # A handful of makefiles are attempting "mkdir dot".
 # tbpl/valgrind builds are using this target
 # https://bugzilla.mozilla.org/show_bug.cgi?id=837754
 .mkdir.done:
-	@echo "WARNING: $(MKDIR) -dot- requested by $(MAKE) -C $(CURDIR) $(MAKECMDGOALS)"
-	@$(TOUCH) -t 198001030000 "$@"
+	@echo 'WARNING: $(MKDIR) -dot- requested by $(MAKE) -C $(CURDIR) $(MAKECMDGOALS)'
+	@$(TOUCH) -t 198001030000 '$@'
 
 INCLUDED_AUTOTARGETS_MK = 1
 endif #}
 
 
 ## Accumulate deps and cleanup
 ifneq (,$(GENERATED_DIRS))
   GENERATED_DIRS := $(strip $(sort $(GENERATED_DIRS)))
--- a/config/makefiles/target_binaries.mk
+++ b/config/makefiles/target_binaries.mk
@@ -20,18 +20,18 @@ endif # EXPORT_LIBRARY
 
 binaries libs:: $(SUBMAKEFILES) $(TARGETS)
 ifndef NO_DIST_INSTALL
 ifdef SHARED_LIBRARY
 ifdef IS_COMPONENT
 	$(INSTALL) $(IFLAGS2) $(SHARED_LIBRARY) $(FINAL_TARGET)/components
 	$(ELF_DYNSTR_GC) $(FINAL_TARGET)/components/$(SHARED_LIBRARY)
 ifndef NO_COMPONENTS_MANIFEST
-	$(call py_action,buildlist,$(FINAL_TARGET)/chrome.manifest "manifest components/components.manifest")
-	$(call py_action,buildlist,$(FINAL_TARGET)/components/components.manifest "binary-component $(SHARED_LIBRARY)")
+	$(call py_action,buildlist,$(FINAL_TARGET)/chrome.manifest 'manifest components/components.manifest')
+	$(call py_action,buildlist,$(FINAL_TARGET)/components/components.manifest 'binary-component $(SHARED_LIBRARY)')
 endif
 endif # IS_COMPONENT
 endif # SHARED_LIBRARY
 endif # !NO_DIST_INSTALL
 
 ifndef NO_DIST_INSTALL
 
 ifneq (,$(strip $(PROGRAM)$(SIMPLE_PROGRAMS)))
@@ -104,20 +104,20 @@ endif # !NO_DIST_INSTALL
 ifdef MOZ_PSEUDO_DERECURSE
 BINARIES_INSTALL_TARGETS := $(foreach category,$(INSTALL_TARGETS),$(if $(filter binaries,$($(category)_TARGET)),$(category)))
 
 # Fill a dependency file with all the binaries installed somewhere in $(DIST)
 # and with dependencies on the relevant backend files.
 BINARIES_PP := $(MDDEPDIR)/binaries.pp
 
 $(BINARIES_PP): Makefile $(wildcard backend.mk) $(call mkdir_deps,$(MDDEPDIR))
-	@echo "$(strip $(foreach category,$(BINARIES_INSTALL_TARGETS),\
+	@echo '$(strip $(foreach category,$(BINARIES_INSTALL_TARGETS),\
 		$(foreach file,$($(category)_FILES) $($(category)_EXECUTABLES),\
 			$($(category)_DEST)/$(notdir $(file)): $(file)%\
 		)\
-	))binaries: Makefile $(wildcard backend.mk)" | tr % '\n' > $@
+	))binaries: Makefile $(wildcard backend.mk)' | tr % '\n' > $@
 
 else
 binaries::
 	$(error The binaries target is not supported without MOZ_PSEUDO_DERECURSE)
 endif
 
 # EOF
--- a/config/recurse.mk
+++ b/config/recurse.mk
@@ -124,17 +124,17 @@ ifneq (,$(filter libs binaries,$(CURRENT
 # A few things that are not traversed by a "binaries" build, but should, in an ideal
 # world, are nspr, nss, icu and ffi.
 recurse_$(CURRENT_TIER):
 	@$(MAKE) binaries-deps
 
 # Creating binaries-deps.mk directly would make us build it twice: once when beginning
 # the build because of the include, and once at the end because of the stamps.
 binaries-deps: $(addsuffix /binaries,$(CURRENT_DIRS))
-	@$(call py_action,link_deps,-o $@.mk --group-by-depfile --topsrcdir $(topsrcdir) --topobjdir $(DEPTH) --dist $(DIST) --guard $(addprefix ",$(addsuffix ",$^)))
+	@$(call py_action,link_deps,-o $@.mk --group-by-depfile --topsrcdir $(topsrcdir) --topobjdir $(DEPTH) --dist $(DIST) --guard $(addprefix ',$(addsuffix ',$^)))
 	@$(TOUCH) $@
 
 ifeq (recurse_binaries,$(MAKECMDGOALS))
 $(call include_deps,binaries-deps.mk)
 endif
 
 endif
 
--- a/config/rules.mk
+++ b/config/rules.mk
@@ -124,25 +124,25 @@ libs:: $(CPP_UNIT_TEST_BINS) $(call mkdi
 	$(NSINSTALL) $(CPP_UNIT_TEST_BINS) $(DIST)/cppunittests
 endif
 
 check::
 	@$(PYTHON) $(topsrcdir)/testing/runcppunittests.py --xre-path=$(DIST)/bin --symbols-path=$(DIST)/crashreporter-symbols $(subst .cpp,$(BIN_SUFFIX),$(CPP_UNIT_TESTS))
 
 cppunittests-remote: DM_TRANS?=adb
 cppunittests-remote:
-	@if [ "${TEST_DEVICE}" != "" -o "$(DM_TRANS)" = "adb" ]; then \
+	@if [ '${TEST_DEVICE}' != '' -o '$(DM_TRANS)' = 'adb' ]; then \
 		$(PYTHON) -u $(topsrcdir)/testing/remotecppunittests.py \
 			--xre-path=$(DEPTH)/dist/bin \
 			--localLib=$(DEPTH)/dist/$(MOZ_APP_NAME) \
 			--dm_trans=$(DM_TRANS) \
 			--deviceIP=${TEST_DEVICE} \
 			$(subst .cpp,$(BIN_SUFFIX),$(CPP_UNIT_TESTS)) $(EXTRA_TEST_ARGS); \
 	else \
-		echo "please prepare your host with environment variables for TEST_DEVICE"; \
+		echo 'please prepare your host with environment variables for TEST_DEVICE'; \
 	fi
 
 endif # COMPILE_ENVIRONMENT
 endif # CPP_UNIT_TESTS
 
 .PHONY: check
 
 ifdef PYTHON_UNIT_TESTS
@@ -359,23 +359,23 @@ endif
 ifeq ($(SOLARIS_SUNPRO_CXX),1)
 GARBAGE_DIRS += SunWS_cache
 endif
 
 ifdef MOZ_UPDATE_XTERM
 # Its good not to have a newline at the end of the titlebar string because it
 # makes the make -s output easier to read.  Echo -n does not work on all
 # platforms, but we can trick printf into doing it.
-UPDATE_TITLE = printf "\033]0;%s in %s\007" $(1) $(relativesrcdir)/$(2) ;
+UPDATE_TITLE = printf '\033]0;%s in %s\007' $(1) $(relativesrcdir)/$(2) ;
 endif
 
 ifdef MACH
 ifndef NO_BUILDSTATUS_MESSAGES
 define BUILDSTATUS
-@echo "BUILDSTATUS $1"
+@echo 'BUILDSTATUS $1'
 
 endef
 endif
 endif
 
 define SUBMAKE # $(call SUBMAKE,target,directory,static)
 +@$(UPDATE_TITLE)
 +$(MAKE) $(if $(2),-C $(2)) $(1)
@@ -738,32 +738,32 @@ alltags:
 #
 $(PROGRAM): $(PROGOBJS) $(EXTRA_DEPS) $(EXE_DEF_FILE) $(RESFILE) $(GLOBAL_DEPS)
 	$(REPORT_BUILD)
 	@$(RM) $@.manifest
 ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
 	$(EXPAND_LD) -NOLOGO -OUT:$@ -PDB:$(LINK_PDBFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(MOZ_GLUE_PROGRAM_LDFLAGS) $(PROGOBJS) $(RESFILE) $(LIBS) $(EXTRA_LIBS) $(OS_LIBS)
 ifdef MSMANIFEST_TOOL
 	@if test -f $@.manifest; then \
-		if test -f "$(srcdir)/$@.manifest"; then \
-			echo "Embedding manifest from $(srcdir)/$@.manifest and $@.manifest"; \
-			mt.exe -NOLOGO -MANIFEST "$(win_srcdir)/$@.manifest" $@.manifest -OUTPUTRESOURCE:$@\;1; \
+		if test -f '$(srcdir)/$@.manifest'; then \
+			echo 'Embedding manifest from $(srcdir)/$@.manifest and $@.manifest'; \
+			mt.exe -NOLOGO -MANIFEST '$(win_srcdir)/$@.manifest' $@.manifest -OUTPUTRESOURCE:$@\;1; \
 		else \
-			echo "Embedding manifest from $@.manifest"; \
+			echo 'Embedding manifest from $@.manifest'; \
 			mt.exe -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \
 		fi; \
-	elif test -f "$(srcdir)/$@.manifest"; then \
-		echo "Embedding manifest from $(srcdir)/$@.manifest"; \
-		mt.exe -NOLOGO -MANIFEST "$(win_srcdir)/$@.manifest" -OUTPUTRESOURCE:$@\;1; \
+	elif test -f '$(srcdir)/$@.manifest'; then \
+		echo 'Embedding manifest from $(srcdir)/$@.manifest'; \
+		mt.exe -NOLOGO -MANIFEST '$(win_srcdir)/$@.manifest' -OUTPUTRESOURCE:$@\;1; \
 	fi
 endif	# MSVC with manifest tool
 ifdef MOZ_PROFILE_GENERATE
 # touch it a few seconds into the future to work around FAT's
 # 2-second granularity
-	touch -t `date +%Y%m%d%H%M.%S -d "now+5seconds"` pgo.relink
+	touch -t `date +%Y%m%d%H%M.%S -d 'now+5seconds'` pgo.relink
 endif
 else # !WINNT || GNU_CC
 	$(EXPAND_CCC) -o $@ $(CXXFLAGS) $(PROGOBJS) $(RESFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(WRAP_LDFLAGS) $(LIBS_DIR) $(LIBS) $(MOZ_GLUE_PROGRAM_LDFLAGS) $(OS_LIBS) $(EXTRA_LIBS) $(BIN_FLAGS) $(EXE_DEF_FILE) $(STLPORT_LIBS)
 	@$(call CHECK_STDCXX,$@)
 endif # WINNT && !GNU_CC
 
 ifdef ENABLE_STRIP
 	$(STRIP) $(STRIP_FLAGS) $@
@@ -773,26 +773,26 @@ ifdef MOZ_POST_PROGRAM_COMMAND
 endif
 
 $(HOST_PROGRAM): $(HOST_PROGOBJS) $(HOST_LIBS_DEPS) $(HOST_EXTRA_DEPS) $(GLOBAL_DEPS)
 	$(REPORT_BUILD)
 ifeq (_WINNT,$(GNU_CC)_$(HOST_OS_ARCH))
 	$(EXPAND_LIBS_EXEC) -- $(HOST_LD) -NOLOGO -OUT:$@ -PDB:$(HOST_PDBFILE) $(HOST_OBJS) $(WIN32_EXE_LDFLAGS) $(HOST_LDFLAGS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
 ifdef MSMANIFEST_TOOL
 	@if test -f $@.manifest; then \
-		if test -f "$(srcdir)/$@.manifest"; then \
-			echo "Embedding manifest from $(srcdir)/$@.manifest and $@.manifest"; \
-			mt.exe -NOLOGO -MANIFEST "$(win_srcdir)/$@.manifest" $@.manifest -OUTPUTRESOURCE:$@\;1; \
+		if test -f '$(srcdir)/$@.manifest'; then \
+			echo 'Embedding manifest from $(srcdir)/$@.manifest and $@.manifest'; \
+			mt.exe -NOLOGO -MANIFEST '$(win_srcdir)/$@.manifest' $@.manifest -OUTPUTRESOURCE:$@\;1; \
 		else \
-			echo "Embedding manifest from $@.manifest"; \
+			echo 'Embedding manifest from $@.manifest'; \
 			mt.exe -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \
 		fi; \
-	elif test -f "$(srcdir)/$@.manifest"; then \
-		echo "Embedding manifest from $(srcdir)/$@.manifest"; \
-		mt.exe -NOLOGO -MANIFEST "$(win_srcdir)/$@.manifest" -OUTPUTRESOURCE:$@\;1; \
+	elif test -f '$(srcdir)/$@.manifest'; then \
+		echo 'Embedding manifest from $(srcdir)/$@.manifest'; \
+		mt.exe -NOLOGO -MANIFEST '$(win_srcdir)/$@.manifest' -OUTPUTRESOURCE:$@\;1; \
 	fi
 endif	# MSVC with manifest tool
 else
 ifeq ($(HOST_CPP_PROG_LINK),1)
 	$(EXPAND_LIBS_EXEC) -- $(HOST_CXX) -o $@ $(HOST_CXXFLAGS) $(HOST_LDFLAGS) $(HOST_PROGOBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
 else
 	$(EXPAND_LIBS_EXEC) -- $(HOST_CC) -o $@ $(HOST_CFLAGS) $(HOST_LDFLAGS) $(HOST_PROGOBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
 endif # HOST_CPP_PROG_LINK
@@ -927,41 +927,41 @@ ifdef MSMANIFEST_TOOL
 ifdef EMBED_MANIFEST_AT
 	@if test -f $@.manifest; then \
 		mt.exe -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;$(EMBED_MANIFEST_AT); \
 		rm -f $@.manifest; \
 	fi
 endif   # EMBED_MANIFEST_AT
 endif	# MSVC with manifest tool
 ifdef MOZ_PROFILE_GENERATE
-	touch -t `date +%Y%m%d%H%M.%S -d "now+5seconds"` pgo.relink
+	touch -t `date +%Y%m%d%H%M.%S -d 'now+5seconds'` pgo.relink
 endif
 endif	# WINNT && !GCC
 	@$(RM) foodummyfilefoo $(DELETE_AFTER_LINK)
 	chmod +x $@
 ifdef ENABLE_STRIP
 	$(STRIP) $(STRIP_FLAGS) $@
 endif
 ifdef MOZ_POST_DSO_LIB_COMMAND
 	$(MOZ_POST_DSO_LIB_COMMAND) $@
 endif
 
 ifeq ($(SOLARIS_SUNPRO_CC),1)
 _MDDEPFILE = $(MDDEPDIR)/$(@F).pp
 
 define MAKE_DEPS_AUTO_CC
 if test -d $(@D); then \
-	echo "Building deps for $< using Sun Studio cc"; \
+	echo 'Building deps for $< using Sun Studio cc'; \
 	$(CC) $(COMPILE_CFLAGS) -xM  $< >$(_MDDEPFILE) ; \
 	$(PYTHON) $(topsrcdir)/build/unix/add_phony_targets.py $(_MDDEPFILE) ; \
 fi
 endef
 define MAKE_DEPS_AUTO_CXX
 if test -d $(@D); then \
-	echo "Building deps for $< using Sun Studio CC"; \
+	echo 'Building deps for $< using Sun Studio CC'; \
 	$(CXX) $(COMPILE_CXXFLAGS) -xM $< >$(_MDDEPFILE) ; \
 	$(PYTHON) $(topsrcdir)/build/unix/add_phony_targets.py $(_MDDEPFILE) ; \
 fi
 endef
 endif # Sun Studio on Solaris
 
 # The object file is in the current directory, and the source file can be any
 # relative path. This macro adds the dependency obj: src for each source file.
@@ -1098,18 +1098,18 @@ SPACE := $(EMPTY) $(EMPTY)
 # MSYS has its own special path form, but javac expects the source and class
 # paths to be in the DOS form (i.e. e:/builds/...).  This function does the
 # appropriate conversion on Windows, but is a noop on other systems.
 ifeq ($(HOST_OS_ARCH),WINNT)
 #  We use 'pwd -W' to get DOS form of the path.  However, since the given path
 #  could be a file or a non-existent path, we cannot call 'pwd -W' directly
 #  on the path.  Instead, we extract the root path (i.e. "c:/"), call 'pwd -W'
 #  on it, then merge with the rest of the path.
-root-path = $(shell echo $(1) | sed -e "s|\(/[^/]*\)/\?\(.*\)|\1|")
-non-root-path = $(shell echo $(1) | sed -e "s|\(/[^/]*\)/\?\(.*\)|\2|")
+root-path = $(shell echo $(1) | sed -e 's|\(/[^/]*\)/\?\(.*\)|\1|')
+non-root-path = $(shell echo $(1) | sed -e 's|\(/[^/]*\)/\?\(.*\)|\2|')
 normalizepath = $(foreach p,$(1),$(if $(filter /%,$(1)),$(patsubst %/,%,$(shell cd $(call root-path,$(1)) && pwd -W))/$(call non-root-path,$(1)),$(1)))
 else
 normalizepath = $(1)
 endif
 
 ###############################################################################
 # Java rules
 ###############################################################################
@@ -1173,18 +1173,18 @@ ifdef XPT_NAME #{
 
 ifndef NO_DIST_INSTALL
 _XPT_NAME_FILES := $(DEPTH)/config/makefiles/xpidl/xpt/$(XPT_NAME)
 _XPT_NAME_DEST := $(FINAL_TARGET)/components
 INSTALL_TARGETS += _XPT_NAME
 
 ifndef NO_INTERFACES_MANIFEST
 libs:: $(call mkdir_deps,$(FINAL_TARGET)/components)
-	$(call py_action,buildlist,$(FINAL_TARGET)/components/interfaces.manifest "interfaces $(XPT_NAME)")
-	$(call py_action,buildlist,$(FINAL_TARGET)/chrome.manifest "manifest components/interfaces.manifest")
+	$(call py_action,buildlist,$(FINAL_TARGET)/components/interfaces.manifest 'interfaces $(XPT_NAME)')
+	$(call py_action,buildlist,$(FINAL_TARGET)/chrome.manifest 'manifest components/interfaces.manifest')
 endif
 endif
 
 endif #} XPT_NAME
 
 ################################################################################
 # Copy each element of EXTRA_COMPONENTS to $(FINAL_TARGET)/components
 ifneq (,$(filter %.js,$(EXTRA_COMPONENTS) $(EXTRA_PP_COMPONENTS)))
@@ -1210,17 +1210,17 @@ ifndef NO_DIST_INSTALL
 EXTRA_PP_COMPONENTS_PATH := $(FINAL_TARGET)/components
 PP_TARGETS += EXTRA_PP_COMPONENTS
 endif
 endif
 
 EXTRA_MANIFESTS = $(filter %.manifest,$(EXTRA_COMPONENTS) $(EXTRA_PP_COMPONENTS))
 ifneq (,$(EXTRA_MANIFESTS))
 libs:: $(call mkdir_deps,$(FINAL_TARGET))
-	$(call py_action,buildlist,$(FINAL_TARGET)/chrome.manifest $(patsubst %,"manifest components/%",$(notdir $(EXTRA_MANIFESTS))))
+	$(call py_action,buildlist,$(FINAL_TARGET)/chrome.manifest $(patsubst %,'manifest components/%',$(notdir $(EXTRA_MANIFESTS))))
 endif
 
 ################################################################################
 # Copy each element of EXTRA_JS_MODULES to
 # $(FINAL_TARGET)/$(JS_MODULES_PATH). JS_MODULES_PATH defaults to "modules"
 # if it is undefined.
 JS_MODULES_PATH ?= modules
 FINAL_JS_MODULES_PATH := $(FINAL_TARGET)/$(JS_MODULES_PATH)
@@ -1297,17 +1297,17 @@ chrome::
 ifneq (,$(wildcard $(JAR_MANIFEST)))
 ifndef NO_DIST_INSTALL
 
 ifdef XPI_NAME
 ifdef XPI_ROOT_APPID
 # For add-on packaging we may specify that an application
 # sub-dir should be added to the root chrome manifest with
 # a specific application id.
-MAKE_JARS_FLAGS += --root-manifest-entry-appid="$(XPI_ROOT_APPID)"
+MAKE_JARS_FLAGS += --root-manifest-entry-appid='$(XPI_ROOT_APPID)'
 endif
 
 # if DIST_SUBDIR is defined but XPI_ROOT_APPID is not there's
 # no way langpacks will get packaged right, so error out.
 ifneq (,$(DIST_SUBDIR))
 ifndef XPI_ROOT_APPID
 $(error XPI_ROOT_APPID is not defined - langpacks will break.)
 endif
@@ -1334,55 +1334,55 @@ DIST_CHROME_FILES_PATH := $(FINAL_TARGET
 DIST_CHROME_FILES_FLAGS := $(XULAPP_DEFINES)
 PP_TARGETS += DIST_CHROME_FILES
 endif
 
 ifneq ($(XPI_PKGNAME),)
 tools realchrome::
 ifdef STRIP_XPI
 ifndef MOZ_DEBUG
-	@echo "Stripping $(XPI_PKGNAME) package directory..."
+	@echo 'Stripping $(XPI_PKGNAME) package directory...'
 	@echo $(FINAL_TARGET)
 	@cd $(FINAL_TARGET) && find . ! -type d \
-			! -name "*.js" \
-			! -name "*.xpt" \
-			! -name "*.gif" \
-			! -name "*.jpg" \
-			! -name "*.png" \
-			! -name "*.xpm" \
-			! -name "*.txt" \
-			! -name "*.rdf" \
-			! -name "*.sh" \
-			! -name "*.properties" \
-			! -name "*.dtd" \
-			! -name "*.html" \
-			! -name "*.xul" \
-			! -name "*.css" \
-			! -name "*.xml" \
-			! -name "*.jar" \
-			! -name "*.dat" \
-			! -name "*.tbl" \
-			! -name "*.src" \
-			! -name "*.reg" \
+			! -name '*.js' \
+			! -name '*.xpt' \
+			! -name '*.gif' \
+			! -name '*.jpg' \
+			! -name '*.png' \
+			! -name '*.xpm' \
+			! -name '*.txt' \
+			! -name '*.rdf' \
+			! -name '*.sh' \
+			! -name '*.properties' \
+			! -name '*.dtd' \
+			! -name '*.html' \
+			! -name '*.xul' \
+			! -name '*.css' \
+			! -name '*.xml' \
+			! -name '*.jar' \
+			! -name '*.dat' \
+			! -name '*.tbl' \
+			! -name '*.src' \
+			! -name '*.reg' \
 			$(PLATFORM_EXCLUDE_LIST) \
 			-exec $(STRIP) $(STRIP_FLAGS) {} >/dev/null 2>&1 \;
 endif
 endif
-	@echo "Packaging $(XPI_PKGNAME).xpi..."
+	@echo 'Packaging $(XPI_PKGNAME).xpi...'
 	cd $(FINAL_TARGET) && $(ZIP) -qr ../$(XPI_PKGNAME).xpi *
 endif
 
 ifdef INSTALL_EXTENSION_ID
 ifndef XPI_NAME
 $(error XPI_NAME must be set for INSTALL_EXTENSION_ID)
 endif
 
 tools::
-	$(RM) -r "$(DIST)/bin$(DIST_SUBDIR:%=/%)/extensions/$(INSTALL_EXTENSION_ID)"
-	$(NSINSTALL) -D "$(DIST)/bin$(DIST_SUBDIR:%=/%)/extensions/$(INSTALL_EXTENSION_ID)"
+	$(RM) -r '$(DIST)/bin$(DIST_SUBDIR:%=/%)/extensions/$(INSTALL_EXTENSION_ID)'
+	$(NSINSTALL) -D '$(DIST)/bin$(DIST_SUBDIR:%=/%)/extensions/$(INSTALL_EXTENSION_ID)'
 	$(call copy_dir,$(FINAL_TARGET),$(DIST)/bin$(DIST_SUBDIR:%=/%)/extensions/$(INSTALL_EXTENSION_ID))
 
 endif
 
 #############################################################################
 # MDDEPDIR is the subdirectory where all the dependency files are placed.
 #   This uses a make rule (instead of a macro) to support parallel
 #   builds (-jN). If this were done in the LOOP_OVER_DIRS macro, two
@@ -1494,21 +1494,21 @@ endef
 $(foreach tier,$(INSTALL_TARGETS_TIERS), \
   $(eval $(tier):: $(INSTALL_TARGETS_FILES_$(tier)) $(INSTALL_TARGETS_EXECUTABLES_$(tier))) \
 )
 
 install_targets_sanity = $(if $(filter-out $(notdir $@),$(notdir $(<))),$(error Looks like $@ has an unexpected dependency on $< which breaks INSTALL_TARGETS))
 
 $(sort $(foreach tier,$(INSTALL_TARGETS_TIERS),$(INSTALL_TARGETS_FILES_$(tier)))):
 	$(install_targets_sanity)
-	$(call install_cmd,$(IFLAGS1) "$<" "$(@D)")
+	$(call install_cmd,$(IFLAGS1) '$<' '$(@D)')
 
 $(sort $(foreach tier,$(INSTALL_TARGETS_TIERS),$(INSTALL_TARGETS_EXECUTABLES_$(tier)))):
 	$(install_targets_sanity)
-	$(call install_cmd,$(IFLAGS2) "$<" "$(@D)")
+	$(call install_cmd,$(IFLAGS2) '$<' '$(@D)')
 
 ################################################################################
 # Preprocessing rules
 #
 # The PP_TARGETS variable contains a list of all preprocessing target
 # categories. Each category has associated variables listing input files, the
 # output directory, extra preprocessor flags, and so on. For example:
 #
@@ -1559,18 +1559,18 @@ pp_target_results = $(foreach file,$($(1
 
 $(foreach tier,$(PP_TARGETS_TIERS), \
   $(eval $(tier):: $(PP_TARGETS_RESULTS_$(tier))) \
 )
 
 PP_TARGETS_ALL_RESULTS := $(sort $(foreach tier,$(PP_TARGETS_TIERS),$(PP_TARGETS_RESULTS_$(tier))))
 $(PP_TARGETS_ALL_RESULTS):
 	$(if $(filter-out $(notdir $@),$(notdir $(<:.in=))),$(error Looks like $@ has an unexpected dependency on $< which breaks PP_TARGETS))
-	$(RM) "$@"
-	$(call py_action,preprocessor,--depend $(MDDEPDIR)/$(@F).pp $(PP_TARGET_FLAGS) $(DEFINES) $(ACDEFINES) $(XULPPFLAGS) "$<" -o "$@")
+	$(RM) '$@'
+	$(call py_action,preprocessor,--depend $(MDDEPDIR)/$(@F).pp $(PP_TARGET_FLAGS) $(DEFINES) $(ACDEFINES) $(XULPPFLAGS) '$<' -o '$@')
 
 # The depfile is based on the filename, and we don't want conflicts. So check
 # there's only one occurrence of any given filename in PP_TARGETS_ALL_RESULTS.
 PP_TARGETS_ALL_RESULT_NAMES := $(notdir $(PP_TARGETS_ALL_RESULTS))
 $(foreach file,$(sort $(PP_TARGETS_ALL_RESULT_NAMES)), \
   $(if $(filter-out 1,$(words $(filter $(file),$(PP_TARGETS_ALL_RESULT_NAMES)))), \
     $(error Multiple preprocessing rules are creating a $(file) file) \
   ) \
--- a/config/system-headers
+++ b/config/system-headers
@@ -408,16 +408,29 @@ freetype/ftoutln.h
 freetype/ttnameid.h
 freetype/tttables.h
 freetype/t1tables.h
 freetype/ftlcdfil.h
 freetype/ftsizes.h
 freetype/ftadvanc.h
 freetype/ftbitmap.h
 freetype/ftxf86.h
+freetype.h
+ftcache.h
+ftglyph.h
+ftsynth.h
+ftoutln.h
+ttnameid.h
+tttables.h
+t1tables.h
+ftlcdfil.h
+ftsizes.h
+ftadvanc.h
+ftbitmap.h
+ftxf86.h
 fribidi/fribidi.h
 FSp_fopen.h
 fstream
 fstream.h
 ft2build.h
 fts.h
 gconf/gconf-client.h
 Gdiplus.h
--- a/config/tests/src-simple/Makefile.in
+++ b/config/tests/src-simple/Makefile.in
@@ -16,21 +16,21 @@ DEFINES += \
 	$(NULL)
 
 MY_MANIFEST = $(if $(USE_EXTENSION_MANIFEST), $(FINAL_TARGET)/chrome.manifest, $(FINAL_TARGET)/chrome/test.manifest)
 REF_MANIFEST = $(if $(USE_EXTENSION_MANIFEST),chrome.manifest,test.manifest)
 
 check-%::
 	if test -d $(FINAL_TARGET); then rm -rf $(FINAL_TARGET); fi;
 	$(MAKE) realchrome MOZ_CHROME_FILE_FORMAT=$*
-	@echo "Comparing manifests..."
+	@echo 'Comparing manifests...'
 	@if ! sort $(MY_MANIFEST) | diff --text -U 0 $(srcdir)/../$(REF_MANIFEST).$* - ; then \
-	  echo "TEST-UNEXPECTED-FAIL | config/tests/$(REF_MANIFEST).$* | differing content in manifest!" ; \
+	  echo 'TEST-UNEXPECTED-FAIL | config/tests/$(REF_MANIFEST).$* | differing content in manifest!' ; \
 	  false; \
 	fi
-	@if [ $* = "jar" ]; then \
+	@if [ $* = 'jar' ]; then \
 	  $(UNZIP) -d $(FINAL_TARGET)/chrome/test $(FINAL_TARGET)/chrome/test.jar; \
 	fi
-	@echo "Comparing packages..."
+	@echo 'Comparing packages...'
 	@if ! diff -ur $(srcdir)/../ref-simple $(FINAL_TARGET)/chrome/test ; then\
-	  echo "TEST-UNEXPECTED-FAIL | config/tests/ref-simple | different content in jar" ; \
+	  echo 'TEST-UNEXPECTED-FAIL | config/tests/ref-simple | different content in jar' ; \
 	  false; \
 	fi
--- a/configure.in
+++ b/configure.in
@@ -1690,17 +1690,17 @@ fi
 
 dnl ========================================================
 dnl System overrides of the defaults for host
 dnl ========================================================
 case "$host" in
 *mingw*)
     if test -n "$_WIN32_MSVC"; then
         HOST_AR=lib
-        HOST_AR_FLAGS='-NOLOGO -OUT:"$@"'
+        HOST_AR_FLAGS='-NOLOGO -OUT:$@'
         HOST_CFLAGS="$HOST_CFLAGS -TC -nologo -Fd\$(HOST_PDBFILE)"
         HOST_RANLIB='echo ranlib'
     else
         HOST_CFLAGS="$HOST_CFLAGS -mwindows"
     fi
     HOST_CFLAGS="$HOST_CFLAGS -DXP_WIN32 -DXP_WIN -DWIN32 -D_WIN32 -DNO_X11 -D_CRT_SECURE_NO_WARNINGS"
     HOST_NSPR_MDCPUCFG='\"md/_winnt.cfg\"'
     HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O2}"
@@ -2046,17 +2046,17 @@ ia64*-hpux*)
         TARGET_COMPILER_ABI=msvc
         HOST_CC='$(CC)'
         HOST_CXX='$(CXX)'
         HOST_LD='$(LD)'
         if test "$AS_BIN"; then
             AS="$(basename "$AS_BIN")"
         fi
         AR='lib'
-        AR_FLAGS='-NOLOGO -OUT:"$@"'
+        AR_FLAGS='-NOLOGO -OUT:$@'
         AR_EXTRACT=
         RANLIB='echo not_ranlib'
         STRIP='echo not_strip'
         PKG_SKIP_STRIP=1
         XARGS=xargs
         ZIP=zip
         UNZIP=unzip
         DOXYGEN=:
--- a/content/base/src/FragmentOrElement.cpp
+++ b/content/base/src/FragmentOrElement.cpp
@@ -122,16 +122,17 @@
 #include "mozilla/Telemetry.h"
 
 #include "mozilla/CORSMode.h"
 
 #include "mozilla/dom/ShadowRoot.h"
 #include "mozilla/dom/HTMLTemplateElement.h"
 
 #include "nsStyledElement.h"
+#include "nsIContentInlines.h"
 
 using namespace mozilla;
 using namespace mozilla::dom;
 
 int32_t nsIContent::sTabFocusModel = eTabFocus_any;
 bool nsIContent::sTabFocusModelAppliesToXUL = false;
 uint32_t nsMutationGuard::sMutationCount = 0;
 
--- a/content/media/DecoderTraits.cpp
+++ b/content/media/DecoderTraits.cpp
@@ -166,20 +166,21 @@ IsWaveType(const nsACString& aType)
 
 #ifdef MOZ_WEBM
 static const char* const gWebMTypes[3] = {
   "video/webm",
   "audio/webm",
   nullptr
 };
 
-static char const *const gWebMCodecs[4] = {
+static char const *const gWebMCodecs[5] = {
   "vp8",
   "vp8.0",
   "vorbis",
+  "opus",
   nullptr
 };
 
 static bool
 IsWebMType(const nsACString& aType)
 {
   if (!MediaDecoder::IsWebMEnabled()) {
     return false;
--- a/content/media/MP3FrameParser.cpp
+++ b/content/media/MP3FrameParser.cpp
@@ -1,20 +1,25 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim:set ts=2 sw=2 sts=2 et cindent: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include <algorithm>
+
 #include "nsMemory.h"
 #include "MP3FrameParser.h"
 #include "VideoUtils.h"
 
 
+#define FROM_BIG_ENDIAN(X) ((uint32_t)((uint8_t)(X)[0] << 24 | (uint8_t)(X)[1] << 16 | \
+                                       (uint8_t)(X)[2] << 8 | (uint8_t)(X)[3]))
+
+
 namespace mozilla {
 
 /*
  * Following code taken from http://www.hydrogenaudio.org/forums/index.php?showtopic=85125
  * with permission from the author, Nick Wallette <sirnickity@gmail.com>.
  */
 
 /* BEGIN shameless copy and paste */
@@ -156,16 +161,23 @@ fail:
 
 uint32_t
 MP3Parser::GetSampleRate()
 {
   MP3Frame &frame = mData.mFrame;
   return mpeg_srates[frame.mVersion][frame.mSampleRate];
 }
 
+uint32_t
+MP3Parser::GetSamplesPerFrame()
+{
+  MP3Frame &frame = mData.mFrame;
+  return mpeg_frame_samples[frame.mVersion][frame.mLayer];
+}
+
 
 /** ID3Parser methods **/
 
 const char sID3Head[3] = { 'I', 'D', '3' };
 const uint32_t ID3_HEADER_LENGTH = 10;
 
 ID3Parser::ID3Parser()
   : mCurrentChar(0)
@@ -217,110 +229,226 @@ uint32_t
 ID3Parser::GetHeaderLength() const
 {
   MOZ_ASSERT(IsParsed(),
              "Queried length of ID3 header before parsing finished.");
   return mHeaderLength;
 }
 
 
+/** VBR header helper stuff **/
+
+// Helper function to find a VBR header in an MP3 frame.
+// Based on information from
+// http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header
+
+const uint32_t VBRI_TAG = FROM_BIG_ENDIAN("VBRI");
+const uint32_t VBRI_OFFSET = 32 - sizeof(MP3Frame);
+const uint32_t VBRI_FRAME_COUNT_OFFSET = VBRI_OFFSET + 14;
+const uint32_t VBRI_MIN_FRAME_SIZE = VBRI_OFFSET + 26;
+
+const uint32_t XING_TAG = FROM_BIG_ENDIAN("Xing");
+enum XingFlags {
+  XING_HAS_NUM_FRAMES = 0x01,
+  XING_HAS_NUM_BYTES = 0x02,
+  XING_HAS_TOC = 0x04,
+  XING_HAS_VBR_SCALE = 0x08
+};
+
+static int64_t
+ParseXing(const char *aBuffer)
+{
+  uint32_t flags = FROM_BIG_ENDIAN(aBuffer + 4);
+
+  if (!(flags & XING_HAS_NUM_FRAMES)) {
+    NS_WARNING("VBR file without frame count. Duration estimation likely to "
+               "be totally wrong.");
+    return -1;
+  }
+
+  int64_t numFrames = -1;
+  if (flags & XING_HAS_NUM_FRAMES) {
+    numFrames = FROM_BIG_ENDIAN(aBuffer + 8);
+  }
+
+  return numFrames;
+}
+
+static int64_t
+FindNumVBRFrames(const nsAutoCString& aFrame)
+{
+  const char *buffer = aFrame.get();
+  const char *bufferEnd = aFrame.get() + aFrame.Length();
+
+  // VBRI header is nice and well-defined; let's try to find that first.
+  if (aFrame.Length() > VBRI_MIN_FRAME_SIZE &&
+      FROM_BIG_ENDIAN(buffer + VBRI_OFFSET) == VBRI_TAG) {
+    return FROM_BIG_ENDIAN(buffer + VBRI_FRAME_COUNT_OFFSET);
+  }
+
+  // We have to search for the Xing header as its position can change.
+  for (; buffer + sizeof(XING_TAG) < bufferEnd; buffer++) {
+    if (FROM_BIG_ENDIAN(buffer) == XING_TAG) {
+      return ParseXing(buffer);
+    }
+  }
+
+  return -1;
+}
+
+
 /** MP3FrameParser methods **/
 
 // Some MP3's have large ID3v2 tags, up to 150KB, so we allow lots of
 // skipped bytes to be read, just in case, before we give up and assume
 // we're not parsing an MP3 stream.
-static const uint32_t MAX_SKIPPED_BYTES = 200 * 1024;
+static const uint32_t MAX_SKIPPED_BYTES = 4096;
 
 // The number of audio samples per MP3 frame. This is constant over all MP3
 // streams. With this constant, the stream's sample rate, and an estimated
 // number of frames in the stream, we can estimate the stream's duration
 // fairly accurately.
 static const uint32_t SAMPLES_PER_FRAME = 1152;
 
 enum {
   MP3_HEADER_LENGTH   = 4,
 };
 
 MP3FrameParser::MP3FrameParser(int64_t aLength)
 : mLock("MP3FrameParser.mLock"),
+  mTotalID3Size(0),
   mTotalFrameSize(0),
-  mNumFrames(0),
+  mFrameCount(0),
   mOffset(0),
   mLength(aLength),
   mMP3Offset(-1),
-  mSampleRate(0),
+  mSamplesPerSecond(0),
+  mFirstFrameEnd(-1),
   mIsMP3(MAYBE_MP3)
 { }
 
 nsresult MP3FrameParser::ParseBuffer(const uint8_t* aBuffer,
                                      uint32_t aLength,
                                      int64_t aStreamOffset,
                                      uint32_t* aOutBytesRead)
 {
   // Iterate forwards over the buffer, looking for ID3 tag, or MP3
   // Frame headers.
-
   const uint8_t *buffer = aBuffer;
   const uint8_t *bufferEnd = aBuffer + aLength;
 
   // If we haven't found any MP3 frame data yet, there might be ID3 headers
   // we can skip over.
   if (mMP3Offset < 0) {
     for (const uint8_t *ch = buffer; ch < bufferEnd; ch++) {
       if (mID3Parser.ParseChar(*ch)) {
         // Found an ID3 header. We don't care about the body of the header, so
         // just skip past.
         buffer = ch + mID3Parser.GetHeaderLength() - (ID3_HEADER_LENGTH - 1);
         ch = buffer;
 
+        mTotalID3Size += mID3Parser.GetHeaderLength();
+
         // Yes, this is an MP3!
         mIsMP3 = DEFINITELY_MP3;
 
         mID3Parser.Reset();
       }
     }
   }
 
+  // The first MP3 frame in a variable bitrate stream can contain metadata
+  // for duration estimation and seeking, so we buffer that first frame here.
+  if (aStreamOffset < mFirstFrameEnd) {
+    uint64_t copyLen = std::min((int64_t)aLength, mFirstFrameEnd - aStreamOffset);
+    mFirstFrame.Append((const char *)buffer, copyLen);
+    buffer += copyLen;
+  }
+
   while (buffer < bufferEnd) {
     uint16_t frameLen = mMP3Parser.ParseFrameLength(*buffer);
 
     if (frameLen) {
+      // We've found an MP3 frame!
+      // This is the first frame (and the only one we'll bother parsing), so:
+      // * Mark this stream as MP3;
+      // * Store the offset at which the MP3 data started; and
+      // * Start buffering the frame, as it might contain handy metadata.
 
-      if (mMP3Offset < 0) {
-        // Found our first frame: mark this stream as MP3 and let the decoder
-        // know where in the stream the MP3 data starts.
-        mIsMP3 = DEFINITELY_MP3;
-        // We're at the last byte of an MP3Frame, so MP3 data started
-        // sizeof - 1 bytes ago.
-        mMP3Offset = aStreamOffset
-          + (buffer - aBuffer)
-          - (sizeof(MP3Frame) - 1);
+      // We're now sure this is an MP3 stream.
+      mIsMP3 = DEFINITELY_MP3;
+
+      // We need to know these to convert the number of frames in the stream
+      // to the length of the stream in seconds.
+      mSamplesPerSecond = mMP3Parser.GetSampleRate();
+      mSamplesPerFrame = mMP3Parser.GetSamplesPerFrame();
+
+      // If the stream has a constant bitrate, we should only need the length
+      // of the first frame and the length (in bytes) of the stream to
+      // estimate the length (in seconds).
+      mTotalFrameSize += frameLen;
+      mFrameCount++;
+
+      // If |mMP3Offset| isn't set then this is the first MP3 frame we have
+      // seen in the stream, which is useful for duration estimation.
+      if (mMP3Offset > -1) {
+        uint16_t skip = frameLen - sizeof(MP3Frame);
+        buffer += skip ? skip : 1;
+        continue;
       }
 
-      mSampleRate = mMP3Parser.GetSampleRate();
-      mTotalFrameSize += frameLen;
-      mNumFrames++;
+      // Remember the offset of the MP3 stream.
+      // We're at the last byte of an MP3Frame, so MP3 data started
+      // sizeof(MP3Frame) - 1 bytes ago.
+      mMP3Offset = aStreamOffset
+        + (buffer - aBuffer)
+        - (sizeof(MP3Frame) - 1);
+
+      buffer++;
 
-      buffer += frameLen - sizeof(MP3Frame);
+      // If the stream has a variable bitrate, the first frame has metadata
+      // we need for duration estimation and seeking. Start buffering it so we
+      // can parse it later.
+      mFirstFrameEnd = mMP3Offset + frameLen;
+      uint64_t currOffset = buffer - aBuffer + aStreamOffset;
+      uint64_t copyLen = std::min(mFirstFrameEnd - currOffset,
+                                  (uint64_t)(bufferEnd - buffer));
+      mFirstFrame.Append((const char *)buffer, copyLen);
+
+      buffer += copyLen;
+
     } else {
+      // Nothing to see here. Move along.
       buffer++;
     }
   }
 
   *aOutBytesRead = buffer - aBuffer;
+
+  if (mFirstFrameEnd > -1 && mFirstFrameEnd <= aStreamOffset + buffer - aBuffer) {
+    // We have our whole first frame. Try to find a VBR header.
+    mNumFrames = FindNumVBRFrames(mFirstFrame);
+    mFirstFrameEnd = -1;
+  }
+
   return NS_OK;
 }
 
-void MP3FrameParser::Parse(const char* aBuffer, uint32_t aLength, int64_t aOffset)
+void MP3FrameParser::Parse(const char* aBuffer, uint32_t aLength, uint64_t aOffset)
 {
   MutexAutoLock mon(mLock);
 
+  if (HasExactDuration()) {
+    // We know the duration; nothing to do here.
+    return;
+  }
+
   const uint8_t* buffer = reinterpret_cast<const uint8_t*>(aBuffer);
   int32_t length = aLength;
-  int64_t offset = aOffset;
+  uint64_t offset = aOffset;
 
   // Got some data we have seen already. Skip forward to what we need.
   if (aOffset < mOffset) {
     buffer += mOffset - aOffset;
     length -= mOffset - aOffset;
     offset = mOffset;
 
     if (length <= 0) {
@@ -330,16 +458,22 @@ void MP3FrameParser::Parse(const char* a
 
   // If there is a discontinuity in the input stream, reset the state of the
   // parsers so we don't get any partial headers.
   if (mOffset < aOffset) {
     if (!mID3Parser.IsParsed()) {
       // Only reset this if it hasn't finished yet.
       mID3Parser.Reset();
     }
+
+    if (mFirstFrameEnd > -1) {
+      NS_WARNING("Discontinuity in input while buffering first frame.");
+      mFirstFrameEnd = -1;
+    }
+
     mMP3Parser.Reset();
   }
 
   uint32_t bytesRead = 0;
   if (NS_FAILED(ParseBuffer(buffer,
                             length,
                             offset,
                             &bytesRead))) {
@@ -347,42 +481,68 @@ void MP3FrameParser::Parse(const char* a
   }
 
   MOZ_ASSERT(length <= (int)bytesRead, "All bytes should have been consumed");
 
   // Update next data offset
   mOffset = offset + bytesRead;
 
   // If we've parsed lots of data and we still have nothing, just give up.
-  if (!mID3Parser.IsParsed() && !mNumFrames && mOffset > MAX_SKIPPED_BYTES) {
+  // We don't count ID3 headers towards that count, as MP3 files can have
+  // massive ID3 sections.
+  if (!mID3Parser.IsParsed() && mMP3Offset < 0 &&
+      mOffset - mTotalID3Size > MAX_SKIPPED_BYTES) {
     mIsMP3 = NOT_MP3;
   }
 }
 
 int64_t MP3FrameParser::GetDuration()
 {
   MutexAutoLock mon(mLock);
 
-  if (!mNumFrames || !mSampleRate) {
+  if (mMP3Offset < 0) {
     return -1; // Not a single frame decoded yet
   }
 
-  // Estimate the total number of frames in the file from the average frame
-  // size we've seen so far, and the length of the file.
-  double avgFrameSize = (double)mTotalFrameSize / mNumFrames;
-
-  // Need to cut out the header here. Ignore everything up to the first MP3
-  // frames.
-  double estimatedFrames = (double)(mLength - mMP3Offset) / avgFrameSize;
+  double frames;
+  if (mNumFrames < 0) {
+    // Estimate the number of frames in the stream based on the average frame
+    // size and the length of the MP3 file.
+    double frameSize = (double)mTotalFrameSize / mFrameCount;
+    frames = (double)(mLength - mMP3Offset) / frameSize;
+  } else {
+    // We know the exact number of frames from the VBR header.
+    frames = mNumFrames;
+  }
 
   // The duration of each frame is constant over a given stream.
-  double usPerFrame = USECS_PER_S * SAMPLES_PER_FRAME / mSampleRate;
+  double usPerFrame = USECS_PER_S * mSamplesPerFrame / mSamplesPerSecond;
 
-  return estimatedFrames * usPerFrame;
+  return frames * usPerFrame;
 }
 
 int64_t MP3FrameParser::GetMP3Offset()
 {
   MutexAutoLock mon(mLock);
   return mMP3Offset;
 }
 
+bool MP3FrameParser::ParsedHeaders()
+{
+  // We have seen both the beginning and the end of the first MP3 frame in the
+  // stream.
+  return mMP3Offset > -1 && mFirstFrameEnd < 0;
 }
+
+bool MP3FrameParser::HasExactDuration()
+{
+  return ParsedHeaders() && mNumFrames > -1;
+}
+
+bool MP3FrameParser::NeedsData()
+{
+  // If we don't know the duration exactly then either:
+  //  - we're still waiting for a VBR header; or
+  //  - we look at all frames to constantly update our duration estimate.
+  return IsMP3() && !HasExactDuration();
+}
+
+}
--- a/content/media/MP3FrameParser.h
+++ b/content/media/MP3FrameParser.h
@@ -1,16 +1,18 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim:set ts=2 sw=2 sts=2 et cindent: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include <stdint.h>
+
 #include "mozilla/Mutex.h"
+#include "nsString.h"
 
 namespace mozilla {
 
 // Simple parser to tell whether we've found an ID3 header and how long it is,
 // so that we can skip it.
 // XXX maybe actually parse this stuff?
 class ID3Parser
 {
@@ -52,16 +54,19 @@ public:
 
   // Parse the given byte. If we have found a frame header, return the length of
   // the frame.
   uint16_t ParseFrameLength(uint8_t ch);
 
   // Get the sample rate from the current header.
   uint32_t GetSampleRate();
 
+  // Get the number of samples per frame.
+  uint32_t GetSamplesPerFrame();
+
 private:
   uint32_t mCurrentChar;
   union {
     uint8_t mRaw[3];
     MP3Frame mFrame;
   } mData;
 };
 
@@ -97,27 +102,39 @@ class MP3FrameParser
 public:
   MP3FrameParser(int64_t aLength=-1);
 
   bool IsMP3() {
     MutexAutoLock mon(mLock);
     return mIsMP3 != NOT_MP3;
   }
 
-  void Parse(const char* aBuffer, uint32_t aLength, int64_t aStreamOffset);
+  void Parse(const char* aBuffer, uint32_t aLength, uint64_t aStreamOffset);
 
   // Returns the duration, in microseconds. If the entire stream has not
   // been parsed yet, this is an estimate based on the bitrate of the
   // frames parsed so far.
   int64_t GetDuration();
 
   // Returns the offset of the first MP3 frame in the stream, or -1 of
   // no MP3 frame has been detected yet.
   int64_t GetMP3Offset();
 
+  // Returns true if we've seen the whole first frame of the MP3 stream, and
+  // therefore can make an estimate on the stream duration.
+  // Otherwise, returns false.
+  bool ParsedHeaders();
+
+  // Returns true if we know the exact duration of the MP3 stream;
+  // false otherwise.
+  bool HasExactDuration();
+
+  // Returns true if the parser needs more data for duration estimation.
+  bool NeedsData();
+
 private:
 
   // Parses aBuffer, starting at offset 0. Returns the number of bytes
   // parsed, relative to the start of the buffer. Note this may be
   // greater than aLength if the headers in the buffer indicate that
   // the frame or ID3 tag extends outside of aBuffer. Returns failure
   // if too many non-MP3 bytes are parsed.
   nsresult ParseBuffer(const uint8_t* aBuffer,
@@ -130,34 +147,57 @@ private:
 
   // ID3 header parser. Keeps state between reads in case the header falls
   // in between.
   ID3Parser mID3Parser;
 
   // MP3 frame header parser.
   MP3Parser mMP3Parser;
 
+  // If we read |MAX_SKIPPED_BYTES| from the stream without finding any MP3
+  // frames, we give up and report |NOT_MP3|. Here we track the cumulative size
+  // of any ID3 headers we've seen so big ID3 sections aren't counted towards
+  // skipped bytes.
+  uint32_t mTotalID3Size;
+
   // All fields below are protected by mLock
+
+  // We keep stats on the size of all the frames we've seen, as well as how many
+  // so that we can estimate the duration of the rest of the stream.
   uint64_t mTotalFrameSize;
-  uint64_t mNumFrames;
+  uint64_t mFrameCount;
 
   // Offset of the last data parsed. This is the end offset of the last data
   // block parsed, so it's the start offset we expect to get on the next
   // call to Parse().
-  int64_t  mOffset;
+  uint64_t mOffset;
 
   // Total length of the stream in bytes.
-  int64_t  mLength;
+  int64_t mLength;
 
   // Offset of first MP3 frame in the bitstream. Has value -1 until the
   // first MP3 frame is found.
   int64_t mMP3Offset;
 
-  // Number of audio samples per second. Fixed through the whole file.
-  uint16_t mSampleRate;
+  // The exact number of frames in this stream, if we know it. -1 otherwise.
+  int64_t mNumFrames;
+
+  // Number of audio samples per second and per frame. Fixed through the whole
+  // file. If we know these variables as well as the number of frames in the
+  // file, we can get an exact duration for the stream.
+  uint16_t mSamplesPerSecond;
+  uint16_t mSamplesPerFrame;
+
+  // If the MP3 has a variable bitrate, then there *should* be metadata about
+  // the encoding in the first frame. We buffer the first frame here.
+  nsAutoCString mFirstFrame;
+
+  // While we are reading the first frame, this is the stream offset of the
+  // last byte of that frame. -1 at all other times.
+  int64_t mFirstFrameEnd;
 
   enum eIsMP3 {
     MAYBE_MP3, // We're giving the stream the benefit of the doubt...
     DEFINITELY_MP3, // We've hit at least one ID3 tag or MP3 frame.
     NOT_MP3 // Not found any evidence of the stream being MP3.
   };
 
   eIsMP3 mIsMP3;
--- a/content/media/apple/AppleMP3Reader.cpp
+++ b/content/media/apple/AppleMP3Reader.cpp
@@ -81,53 +81,36 @@ static void _AudioSampleCallback(void *a
 }
 
 
 /*
  * If we're not at end of stream, read |aNumBytes| from the media resource,
  * put it in |aData|, and return true.
  * Otherwise, put as much data as is left into |aData|, set |aNumBytes| to the
  * amount of data we have left, and return false.
- *
- * This function also passes the read data on to the MP3 frame parser for
- * stream duration estimation.
  */
 nsresult
-AppleMP3Reader::ReadAndNotify(uint32_t *aNumBytes, char *aData)
+AppleMP3Reader::Read(uint32_t *aNumBytes, char *aData)
 {
   MediaResource *resource = mDecoder->GetResource();
 
-  uint64_t offset = resource->Tell();
-
   // Loop until we have all the data asked for, or we've reached EOS
   uint32_t totalBytes = 0;
   uint32_t numBytes;
   do {
     uint32_t bytesWanted = *aNumBytes - totalBytes;
     nsresult rv = resource->Read(aData + totalBytes, bytesWanted, &numBytes);
     totalBytes += numBytes;
 
     if (NS_FAILED(rv)) {
       *aNumBytes = 0;
       return NS_ERROR_FAILURE;
     }
   } while(totalBytes < *aNumBytes && numBytes);
 
-  // Pass the buffer to the MP3 frame parser to improve our duration estimate.
-  if (mMP3FrameParser.IsMP3()) {
-    mMP3FrameParser.Parse(aData, totalBytes, offset);
-    uint64_t duration = mMP3FrameParser.GetDuration();
-    if (duration != mDuration) {
-      LOGD("Updating media duration to %lluus\n", duration);
-      mDuration = duration;
-      ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
-      mDecoder->UpdateEstimatedMediaDuration(duration);
-    }
-  }
-
   *aNumBytes = totalBytes;
 
   // We will have read some data in the last iteration iff we filled the buffer.
   // XXX Maybe return a better value than NS_ERROR_FAILURE?
   return numBytes ? NS_OK : NS_ERROR_FAILURE;
 }
 
 nsresult
@@ -281,17 +264,17 @@ bool
 AppleMP3Reader::DecodeAudioData()
 {
   MOZ_ASSERT(mDecoder->OnDecodeThread(), "Should be on decode thread");
 
   // Read AUDIO_READ_BYTES if we can
   char bytes[AUDIO_READ_BYTES];
   uint32_t numBytes = AUDIO_READ_BYTES;
 
-  nsresult readrv = ReadAndNotify(&numBytes, bytes);
+  nsresult readrv = Read(&numBytes, bytes);
 
   // This function calls |AudioSampleCallback| above, synchronously, when it
   // finds compressed MP3 frame.
   OSStatus rv = AudioFileStreamParseBytes(mAudioFileStream,
                                           numBytes,
                                           bytes,
                                           0 /* flags */);
 
@@ -369,46 +352,57 @@ AppleMP3Reader::ReadMetadata(MediaInfo* 
 
   /*
    * Feed bytes into the parser until we have all the metadata we need to
    * set up the decoder. When the parser has enough data, it will
    * synchronously call back to |AudioMetadataCallback| below.
    */
   OSStatus rv;
   nsresult readrv;
+  uint32_t offset = 0;
   do {
     char bytes[AUDIO_READ_BYTES];
     uint32_t numBytes = AUDIO_READ_BYTES;
-    readrv = ReadAndNotify(&numBytes, bytes);
+    readrv = Read(&numBytes, bytes);
 
     rv = AudioFileStreamParseBytes(mAudioFileStream,
                                    numBytes,
                                    bytes,
                                    0 /* flags */);
 
+    mMP3FrameParser.Parse(bytes, numBytes, offset);
+
+    offset += numBytes;
+
     // We have to do our decoder setup from the callback. When it's done it will
     // set mStreamReady.
   } while (!mStreamReady && !rv && NS_SUCCEEDED(readrv));
 
   if (rv) {
     LOGE("Error decoding audio stream metadata\n");
     return NS_ERROR_FAILURE;
   }
 
   if (!mAudioConverter) {
     LOGE("Failed to setup the AudioToolbox audio decoder\n");
     return NS_ERROR_FAILURE;
   }
 
+  if (!mMP3FrameParser.IsMP3()) {
+    LOGE("Frame parser failed to parse MP3 stream\n");
+    return NS_ERROR_FAILURE;
+  }
+
   aInfo->mAudio.mRate = mAudioSampleRate;
   aInfo->mAudio.mChannels = mAudioChannels;
   aInfo->mAudio.mHasAudio = mStreamReady;
 
   {
     ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
+    mDuration = mMP3FrameParser.GetDuration();
     mDecoder->SetMediaDuration(mDuration);
   }
 
   return NS_OK;
 }
 
 
 void
@@ -510,9 +504,30 @@ AppleMP3Reader::Seek(int64_t aTime,
 
   mDecoder->GetResource()->Seek(nsISeekableStream::NS_SEEK_SET, byteOffset);
 
   ResetDecode();
 
   return NS_OK;
 }
 
+void
+AppleMP3Reader::NotifyDataArrived(const char* aBuffer,
+                                  uint32_t aLength,
+                                  int64_t aOffset)
+{
+  MOZ_ASSERT(NS_IsMainThread());
+  if (!mMP3FrameParser.NeedsData()) {
+    return;
+  }
+
+  mMP3FrameParser.Parse(aBuffer, aLength, aOffset);
+
+  uint64_t duration = mMP3FrameParser.GetDuration();
+  if (duration != mDuration) {
+    LOGD("Updating media duration to %lluus\n", duration);
+    mDuration = duration;
+    ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
+    mDecoder->UpdateEstimatedMediaDuration(duration);
+  }
+}
+
 } // namespace mozilla
--- a/content/media/apple/AppleMP3Reader.h
+++ b/content/media/apple/AppleMP3Reader.h
@@ -42,19 +42,23 @@ public:
                            UInt32 aNumPackets,
                            const void *aData,
                            AudioStreamPacketDescription *aPackets);
 
   void AudioMetadataCallback(AudioFileStreamID aFileStream,
                              AudioFileStreamPropertyID aPropertyID,
                              UInt32 *aFlags);
 
+  virtual void NotifyDataArrived(const char* aBuffer,
+                                 uint32_t aLength,
+                                 int64_t aOffset) MOZ_OVERRIDE;
+
 private:
   void SetupDecoder();
-  nsresult ReadAndNotify(uint32_t *aNumBytes, char *aData);
+  nsresult Read(uint32_t *aNumBytes, char *aData);
 
   static OSStatus PassthroughInputDataCallback(AudioConverterRef aAudioConverter,
                                                UInt32 *aNumDataPackets,
                                                AudioBufferList *aData,
                                                AudioStreamPacketDescription **aPacketDesc,
                                                void *aUserData);
 
   // Initialisation has to be done in a callback, so we store the result here.
--- a/content/media/directshow/DirectShowReader.cpp
+++ b/content/media/directshow/DirectShowReader.cpp
@@ -62,16 +62,39 @@ DirectShowReader::~DirectShowReader()
 
 nsresult
 DirectShowReader::Init(MediaDecoderReader* aCloneDonor)
 {
   MOZ_ASSERT(NS_IsMainThread(), "Must be on main thread.");
   return NS_OK;
 }
 
+// Try to parse the MP3 stream to make sure this is indeed an MP3, get the
+// estimated duration of the stream, and find the offset of the actual MP3
+// frames in the stream, as DirectShow doesn't like large ID3 sections.
+static nsresult
+ParseMP3Headers(MP3FrameParser *aParser, MediaResource *aResource)
+{
+  const uint32_t MAX_READ_SIZE = 4096;
+
+  uint64_t offset = 0;
+  while (aParser->NeedsData() && !aParser->ParsedHeaders()) {
+    uint32_t bytesRead;
+    char buffer[MAX_READ_SIZE];
+    nsresult rv = aResource->ReadAt(offset, buffer,
+                                    MAX_READ_SIZE, &bytesRead);
+    NS_ENSURE_SUCCESS(rv, rv);
+
+    aParser->Parse(buffer, bytesRead, offset);
+    offset += bytesRead;
+  }
+
+  return aParser->IsMP3() ? NS_OK : NS_ERROR_FAILURE;
+}
+
 // Windows XP's MP3 decoder filter. This is available on XP only, on Vista
 // and later we can use the DMO Wrapper filter and MP3 decoder DMO.
 static const GUID CLSID_MPEG_LAYER_3_DECODER_FILTER =
 { 0x38BE3000, 0xDBF4, 0x11D0, 0x86, 0x0E, 0x00, 0xA0, 0x24, 0xCF, 0xEF, 0x6D };
 
 nsresult
 DirectShowReader::ReadMetadata(MediaInfo* aInfo,
                                MetadataTags** aTags)
@@ -84,16 +107,19 @@ DirectShowReader::ReadMetadata(MediaInfo
   // to make graph building more convenient.
   hr = CoCreateInstance(CLSID_FilterGraph,
                         nullptr,
                         CLSCTX_INPROC_SERVER,
                         IID_IGraphBuilder,
                         reinterpret_cast<void**>(static_cast<IGraphBuilder**>(byRef(mGraph))));
   NS_ENSURE_TRUE(SUCCEEDED(hr) && mGraph, NS_ERROR_FAILURE);
 
+  rv = ParseMP3Headers(&mMP3FrameParser, mDecoder->GetResource());
+  NS_ENSURE_SUCCESS(rv, rv);
+
   #ifdef DEBUG
   // Add the graph to the Running Object Table so that we can connect
   // to this graph with GraphEdit/GraphStudio. Note: on Vista and up you must
   // also regsvr32 proppage.dll from the Windows SDK.
   // See: http://msdn.microsoft.com/en-us/library/ms787252(VS.85).aspx
   hr = AddGraphToRunningObjectTable(mGraph, &mRotRegister);
   NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
   #endif
@@ -108,17 +134,17 @@ DirectShowReader::ReadMetadata(MediaInfo
   // Build the graph. Create the filters we need, and connect them. We
   // build the entire graph ourselves to prevent other decoders installed
   // on the system being created and used.
 
   // Our source filters, wraps the MediaResource.
   mSourceFilter = new SourceFilter(MEDIATYPE_Stream, MEDIASUBTYPE_MPEG1Audio);
   NS_ENSURE_TRUE(mSourceFilter, NS_ERROR_FAILURE);
 
-  rv = mSourceFilter->Init(mDecoder->GetResource());
+  rv = mSourceFilter->Init(mDecoder->GetResource(), mMP3FrameParser.GetMP3Offset());
   NS_ENSURE_SUCCESS(rv, rv);
 
   hr = mGraph->AddFilter(mSourceFilter, L"MozillaDirectShowSource");
   NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
 
   // The MPEG demuxer.
   RefPtr<IBaseFilter> demuxer;
   hr = CreateAndAddFilter(mGraph,
@@ -179,21 +205,20 @@ DirectShowReader::ReadMetadata(MediaInfo
 
   DWORD seekCaps = 0;
   hr = mMediaSeeking->GetCapabilities(&seekCaps);
   bool canSeek = ((AM_SEEKING_CanSeekAbsolute & seekCaps) == AM_SEEKING_CanSeekAbsolute);
   if (!canSeek) {
     mDecoder->SetMediaSeekable(false);
   }
 
-  int64_t duration = 0;
-  hr = mMediaSeeking->GetDuration(&duration);
+  int64_t duration = mMP3FrameParser.GetDuration();
   if (SUCCEEDED(hr)) {
     ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
-    mDecoder->SetMediaDuration(RefTimeToUsecs(duration));
+    mDecoder->SetMediaDuration(duration);
   }
 
   LOG("Successfully initialized DirectShow MP3 decoder.");
   LOG("Channels=%u Hz=%u duration=%lld bytesPerSample=%d",
       mInfo.mAudio.mChannels,
       mInfo.mAudio.mRate,
       RefTimeToUsecs(duration),
       mBytesPerSample);
--- a/content/media/directshow/SourceFilter.cpp
+++ b/content/media/directshow/SourceFilter.cpp
@@ -663,83 +663,25 @@ SourceFilter::GetPin(int n)
 
 // Get's the media type we're supplying.
 const MediaType*
 SourceFilter::GetMediaType() const
 {
   return &mMediaType;
 }
 
-static uint32_t
-Read(MediaResource* aResource,
-     const int64_t aOffset,
-     char* aBuffer,
-     const uint32_t aBytesToRead)
-{
-  uint32_t totalBytesRead = 0;
-  while (totalBytesRead < aBytesToRead) {
-    uint32_t bytesRead = 0;
-    nsresult rv = aResource->ReadAt(aOffset + totalBytesRead,
-                                    aBuffer+totalBytesRead,
-                                    aBytesToRead-totalBytesRead,
-                                    &bytesRead);
-    if (NS_FAILED(rv) || bytesRead == 0) {
-      // Error or end of stream?
-      break;
-    }
-    totalBytesRead += bytesRead;
-  }
-  return totalBytesRead;
-}
-
-// Parses the MP3 stream and returns the offset of the first MP3
-// sync frame after the ID3v2 headers. This is used to trim off
-// the ID3v2 headers, as DirectShow can't handle large ID3v2 tags.
-static nsresult
-GetMP3DataOffset(MediaResource* aResource, int64_t* aOutOffset)
-{
-  MP3FrameParser parser;
-  int64_t offset = 0;
-  const uint32_t len = 1024;
-  char buffer[len];
-  do {
-    uint32_t bytesRead = Read(aResource, offset, buffer, len);
-    if (bytesRead == 0) {
-      break;
-    }
-    parser.Parse(buffer, bytesRead, offset);
-    offset += bytesRead;
-  } while (parser.GetMP3Offset() == -1 && parser.IsMP3());
-
-  if (!parser.IsMP3() || parser.GetMP3Offset() == -1) {
-    return NS_ERROR_FAILURE;
-  }
-
-  *aOutOffset = parser.GetMP3Offset();
-  return NS_OK;
-}
-
 nsresult
-SourceFilter::Init(MediaResource* aResource)
+SourceFilter::Init(MediaResource* aResource, int64_t aMP3Offset)
 {
   LOG("SourceFilter::Init()");
 
-  // Get the offset of MP3 data in the stream, and pass that into
-  // the output pin so that the stream that we present to DirectShow
-  // does not contain ID3v2 tags. DirectShow can't properly parse some
-  // streams' ID3v2 tags.
-  int64_t mp3DataOffset = 0;
-  nsresult rv = GetMP3DataOffset(aResource, &mp3DataOffset);
-  NS_ENSURE_SUCCESS(rv, rv);
-  LOG("First MP3 sync/data frame lies at offset %lld", mp3DataOffset);
-
   mOutputPin = new OutputPin(aResource,
                              this,
                              mLock,
-                             mp3DataOffset);
+                             aMP3Offset);
   NS_ENSURE_TRUE(mOutputPin != nullptr, NS_ERROR_FAILURE);
 
   return NS_OK;
 }
 
 uint32_t
 SourceFilter::GetAndResetBytesConsumedCount()
 {
--- a/content/media/directshow/SourceFilter.h
+++ b/content/media/directshow/SourceFilter.h
@@ -38,17 +38,17 @@ class DECLSPEC_UUID("5c2a7ad0-ba82-4659-
 SourceFilter : public media::BaseFilter
 {
 public:
 
   // Constructs source filter to deliver given media type.
   SourceFilter(const GUID& aMajorType, const GUID& aSubType);
   ~SourceFilter();
 
-  nsresult Init(MediaResource *aResource);
+  nsresult Init(MediaResource *aResource, int64_t aMP3Offset);
 
   // BaseFilter overrides.
   // Only one output - the byte stream.
   int GetPinCount() MOZ_OVERRIDE { return 1; }
 
   media::BasePin* GetPin(int n) MOZ_OVERRIDE;
 
   // Get's the media type we're supplying.
--- a/content/media/gstreamer/GStreamerReader.cpp
+++ b/content/media/gstreamer/GStreamerReader.cpp
@@ -1,15 +1,16 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim:set ts=2 sw=2 sts=2 et cindent: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "nsError.h"
+#include "nsMimeTypes.h"
 #include "MediaDecoderStateMachine.h"
 #include "AbstractMediaDecoder.h"
 #include "MediaResource.h"
 #include "GStreamerReader.h"
 #include "GStreamerFormatHelper.h"
 #include "GStreamerMozVideoBuffer.h"
 #include "VideoUtils.h"
 #include "mozilla/dom/TimeRanges.h"
@@ -52,16 +53,18 @@ typedef enum {
   GST_PLAY_FLAG_DOWNLOAD      = (1 << 7),
   GST_PLAY_FLAG_BUFFERING     = (1 << 8),
   GST_PLAY_FLAG_DEINTERLACE   = (1 << 9),
   GST_PLAY_FLAG_SOFT_COLORBALANCE = (1 << 10)
 } PlayFlags;
 
 GStreamerReader::GStreamerReader(AbstractMediaDecoder* aDecoder)
   : MediaDecoderReader(aDecoder),
+  mMP3FrameParser(aDecoder->GetResource()->GetLength()),
+  mUseParserDuration(false),
   mPlayBin(nullptr),
   mBus(nullptr),
   mSource(nullptr),
   mVideoSink(nullptr),
   mVideoAppSink(nullptr),
   mAudioSink(nullptr),
   mAudioAppSink(nullptr),
   mFormat(GST_VIDEO_FORMAT_UNKNOWN),
@@ -238,16 +241,45 @@ void GStreamerReader::PlayBinSourceSetup
   GstCaps *caps =
     GStreamerFormatHelper::ConvertFormatsToCaps(mDecoder->GetResource()->GetContentType().get(),
                                                 nullptr);
 
   gst_app_src_set_caps(aSource, caps);
   gst_caps_unref(caps);
 }
 
+/**
+ * If this stream is an MP3, we want to parse the headers to estimate the
+ * stream duration.
+ */
+nsresult GStreamerReader::ParseMP3Headers()
+{
+  MediaResource *resource = mDecoder->GetResource();
+
+  const uint32_t MAX_READ_BYTES = 4096;
+
+  uint64_t offset = 0;
+  char bytes[MAX_READ_BYTES];
+  uint32_t bytesRead;
+  do {
+    nsresult rv = resource->ReadAt(offset, bytes, MAX_READ_BYTES, &bytesRead);
+    NS_ENSURE_SUCCESS(rv, rv);
+    NS_ENSURE_TRUE(bytesRead, NS_ERROR_FAILURE);
+
+    mMP3FrameParser.Parse(bytes, bytesRead, offset);
+    offset += bytesRead;
+  } while (!mMP3FrameParser.ParsedHeaders());
+
+  if (mMP3FrameParser.IsMP3()) {
+    mLastParserDuration = mMP3FrameParser.GetDuration();
+  }
+
+  return NS_OK;
+}
+
 nsresult GStreamerReader::ReadMetadata(MediaInfo* aInfo,
                                        MetadataTags** aTags)
 {
   NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread.");
   nsresult ret = NS_OK;
 
   /* We do 3 attempts here: decoding audio and video, decoding video only,
    * decoding audio only. This allows us to play streams that have one broken
@@ -333,26 +365,42 @@ nsresult GStreamerReader::ReadMetadata(M
        (GstMessageType)(GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_ERROR));
     if (GST_MESSAGE_TYPE(message) == GST_MESSAGE_ERROR) {
       gst_element_set_state(mPlayBin, GST_STATE_NULL);
       gst_message_unref(message);
       return NS_ERROR_FAILURE;
     }
   }
 
+  bool isMP3 = mDecoder->GetResource()->GetContentType().EqualsASCII(AUDIO_MP3);
+  if (isMP3) {
+    ParseMP3Headers();
+  }
+
   /* report the duration */
   gint64 duration;
   GstFormat format = GST_FORMAT_TIME;
-  if (gst_element_query_duration(GST_ELEMENT(mPlayBin),
+
+  if (isMP3 && mMP3FrameParser.IsMP3()) {
+    // The MP3FrameParser has reported a duration; use that over the gstreamer
+    // reported duration for inter-platform consistency.
+    ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
+    mUseParserDuration = true;
+    mLastParserDuration = mMP3FrameParser.GetDuration();
+    mDecoder->SetMediaDuration(mLastParserDuration);
+
+  } else if (gst_element_query_duration(GST_ELEMENT(mPlayBin),
       &format, &duration) && format == GST_FORMAT_TIME) {
+    // Otherwise use the gstreamer duration.
     ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
     LOG(PR_LOG_DEBUG, ("returning duration %" GST_TIME_FORMAT,
           GST_TIME_ARGS (duration)));
     duration = GST_TIME_AS_USECONDS (duration);
     mDecoder->SetMediaDuration(duration);
+
   } else {
     mDecoder->SetMediaSeekable(false);
   }
 
   int n_video = 0, n_audio = 0;
   g_object_get(mPlayBin, "n-video", &n_video, "n-audio", &n_audio, nullptr);
   mInfo.mVideo.mHasVideo = n_video != 0;
   mInfo.mAudio.mHasAudio = n_audio != 0;
@@ -1014,10 +1062,38 @@ void GStreamerReader::Eos()
 
   {
     ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
     /* Potentially unblock the decode thread in ::DecodeLoop */
     mon.NotifyAll();
   }
 }
 
+/**
+ * If this is an MP3 stream, pass any new data we get to the MP3 frame parser
+ * for duration estimation.
+ */
+void GStreamerReader::NotifyDataArrived(const char *aBuffer,
+                                        uint32_t aLength,
+                                        int64_t aOffset)
+{
+  MOZ_ASSERT(NS_IsMainThread());
+
+  if (HasVideo()) {
+    return;
+  }
+
+  if (!mMP3FrameParser.NeedsData()) {
+    return;
+  }
+
+  mMP3FrameParser.Parse(aBuffer, aLength, aOffset);
+
+  int64_t duration = mMP3FrameParser.GetDuration();
+  if (duration != mLastParserDuration && mUseParserDuration) {
+    ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
+    mLastParserDuration = duration;
+    mDecoder->UpdateEstimatedMediaDuration(mLastParserDuration);
+  }
+}
+
 } // namespace mozilla
 
--- a/content/media/gstreamer/GStreamerReader.h
+++ b/content/media/gstreamer/GStreamerReader.h
@@ -1,29 +1,32 @@
 /* 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/. */
 
 #if !defined(GStreamerReader_h_)
 #define GStreamerReader_h_
 
+#include <map>
+
 #include <gst/gst.h>
 #include <gst/app/gstappsrc.h>
 #include <gst/app/gstappsink.h>
 // This include trips -Wreserved-user-defined-literal on clang. Ignoring it
 // trips -Wpragmas on GCC (unknown warning), but ignoring that trips
 // -Wunknown-pragmas on clang (unknown pragma).
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wunknown-pragmas"
 #pragma GCC diagnostic ignored "-Wpragmas"
 #pragma GCC diagnostic ignored "-Wreserved-user-defined-literal"
 #include <gst/video/video.h>
 #pragma GCC diagnostic pop
-#include <map>
+
 #include "MediaDecoderReader.h"
+#include "MP3FrameParser.h"
 #include "nsRect.h"
 
 namespace mozilla {
 
 namespace dom {
 class TimeRanges;
 }
 
@@ -47,16 +50,20 @@ public:
   virtual nsresult ReadMetadata(MediaInfo* aInfo,
                                 MetadataTags** aTags);
   virtual nsresult Seek(int64_t aTime,
                         int64_t aStartTime,
                         int64_t aEndTime,
                         int64_t aCurrentTime);
   virtual nsresult GetBuffered(dom::TimeRanges* aBuffered, int64_t aStartTime);
 
+  virtual void NotifyDataArrived(const char *aBuffer,
+                                 uint32_t aLength,
+                                 int64_t aOffset) MOZ_OVERRIDE;
+
   virtual bool HasAudio() {
     return mInfo.HasAudio();
   }
 
   virtual bool HasVideo() {
     return mInfo.HasVideo();
   }
 
@@ -124,16 +131,30 @@ private:
   static GstFlowReturn NewBufferCb(GstAppSink* aSink, gpointer aUserData);
   void NewVideoBuffer();
   void NewAudioBuffer();
 
   /* Called at end of stream, when decoding has finished */
   static void EosCb(GstAppSink* aSink, gpointer aUserData);
   void Eos();
 
+  // Try to find MP3 headers in this stream using our MP3 frame parser.
+  nsresult ParseMP3Headers();
+
+  // Use our own MP3 parser here, largely for consistency with other platforms.
+  MP3FrameParser mMP3FrameParser;
+
+  // We want to be able to decide in |ReadMetadata| whether or not we use the
+  // duration from the MP3 frame parser, as this backend supports more than just
+  // MP3. But |NotifyDataArrived| can update the duration and is often called
+  // _before_ |ReadMetadata|. This flag stops the former from using the parser
+  // duration until we are sure we want to.
+  bool mUseParserDuration;
+  int64_t mLastParserDuration;
+
   GstElement* mPlayBin;
   GstBus* mBus;
   GstAppSrc* mSource;
   /* video sink bin */
   GstElement* mVideoSink;
   /* the actual video app sink */
   GstAppSink* mVideoAppSink;
   /* audio sink bin */
--- a/content/media/ogg/OggCodecState.cpp
+++ b/content/media/ogg/OggCodecState.cpp
@@ -2,16 +2,17 @@
 /* vim:set ts=2 sw=2 sts=2 et cindent: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include <string.h>
 
 #include "mozilla/DebugOnly.h"
+#include "mozilla/Endian.h"
 #include <stdint.h>
 
 #include "nsDebug.h"
 #include "MediaDecoderReader.h"
 #include "OggCodecState.h"
 #include "OggDecoder.h"
 #include "nsTraceRefcnt.h"
 #include "VideoUtils.h"
@@ -33,45 +34,16 @@ namespace mozilla {
 
 #ifdef PR_LOGGING
 extern PRLogModuleInfo* gMediaDecoderLog;
 #define LOG(type, msg) PR_LOG(gMediaDecoderLog, type, msg)
 #else
 #define LOG(type, msg)
 #endif
 
-// Reads a little-endian encoded unsigned 32bit integer at p.
-static uint32_t LEUint32(const unsigned char* p)
-{
-  return p[0] +
-        (p[1] << 8) +
-        (p[2] << 16) +
-        (p[3] << 24);
-}
-
-// Reads a little-endian encoded 64bit integer at p.
-static int64_t LEInt64(const unsigned char* p)
-{
-  uint32_t lo = LEUint32(p);
-  uint32_t hi = LEUint32(p + 4);
-  return static_cast<int64_t>(lo) | (static_cast<int64_t>(hi) << 32);
-}
-
-// Reads a little-endian encoded unsigned 16bit integer at p.
-static uint16_t LEUint16(const unsigned char* p)
-{
-  return p[0] + (p[1] << 8);
-}
-
-// Reads a little-endian encoded signed 16bit integer at p.
-inline int16_t LEInt16(const unsigned char* p)
-{
-  return static_cast<int16_t>(LEUint16(p));
-}
-
 /** Decoder base class for Ogg-encapsulated streams. */
 OggCodecState*
 OggCodecState::Create(ogg_page* aPage)
 {
   NS_ASSERTION(ogg_page_bos(aPage), "Only call on BOS page!");
   nsAutoPtr<OggCodecState> codecState;
   if (aPage->body_len > 6 && memcmp(aPage->body+1, "theora", 6) == 0) {
     codecState = new TheoraState(aPage);
@@ -821,28 +793,17 @@ nsresult VorbisState::ReconstructVorbisG
   mGranulepos = last->granulepos;
 
   return NS_OK;
 }
 
 #ifdef MOZ_OPUS
 OpusState::OpusState(ogg_page* aBosPage) :
   OggCodecState(aBosPage, true),
-  mRate(0),
-  mNominalRate(0),
-  mChannels(0),
-  mPreSkip(0),
-#ifdef MOZ_SAMPLE_TYPE_FLOAT32
-  mGain(1.0f),
-#else
-  mGain_Q16(65536),
-#endif
-  mChannelMapping(0),
-  mStreams(0),
-  mCoupledStreams(0),
+  mParser(nullptr),
   mDecoder(nullptr),
   mSkip(0),
   mPrevPacketGranulepos(0),
   mPrevPageGranulepos(0)
 {
   MOZ_COUNT_CTOR(OpusState);
 }
 
@@ -864,17 +825,17 @@ nsresult OpusState::Reset()
 nsresult OpusState::Reset(bool aStart)
 {
   nsresult res = NS_OK;
 
   if (mActive && mDecoder) {
     // Reset the decoder.
     opus_multistream_decoder_ctl(mDecoder, OPUS_RESET_STATE);
     // Let the seek logic handle pre-roll if we're not seeking to the start.
-    mSkip = aStart ? mPreSkip : 0;
+    mSkip = aStart ? mParser->mPreSkip : 0;
     // This lets us distinguish the first page being the last page vs. just
     // not having processed the previous page when we encounter the last page.
     mPrevPageGranulepos = aStart ? 0 : -1;
     mPrevPacketGranulepos = aStart ? 0 : -1;
   }
 
   // Clear queued data.
   if (NS_FAILED(OggCodecState::Reset())) {
@@ -890,177 +851,56 @@ bool OpusState::Init(void)
 {
   if (!mActive)
     return false;
 
   int error;
 
   NS_ASSERTION(mDecoder == nullptr, "leaking OpusDecoder");
 
-  mDecoder = opus_multistream_decoder_create(mRate,
-                                             mChannels,
-                                             mStreams,
-                                             mCoupledStreams,
-                                             mMappingTable,
+  mDecoder = opus_multistream_decoder_create(mParser->mRate,
+                                             mParser->mChannels,
+                                             mParser->mStreams,
+                                             mParser->mCoupledStreams,
+                                             mParser->mMappingTable,
                                              &error);
 
-  mSkip = mPreSkip;
+  mSkip = mParser->mPreSkip;
 
   LOG(PR_LOG_DEBUG, ("Opus decoder init, to skip %d", mSkip));
 
   return error == OPUS_OK;
 }
 
 bool OpusState::DecodeHeader(ogg_packet* aPacket)
 {
   nsAutoRef<ogg_packet> autoRelease(aPacket);
   switch(mPacketCount++) {
     // Parse the id header.
     case 0: {
-      if (aPacket->bytes < 19 || memcmp(aPacket->packet, "OpusHead", 8)) {
-        LOG(PR_LOG_DEBUG, ("Invalid Opus file: unrecognized header"));
-        return false;
-      }
-
-      mRate = 48000; // The Opus decoder runs at 48 kHz regardless.
-
-      int version = aPacket->packet[8];
-      // Accept file format versions 0.x.
-      if ((version & 0xf0) != 0) {
-        LOG(PR_LOG_DEBUG, ("Rejecting unknown Opus file version %d", version));
-        return false;
-      }
-
-      mChannels = aPacket->packet[9];
-      if (mChannels<1) {
-        LOG(PR_LOG_DEBUG, ("Invalid Opus file: Number of channels %d", mChannels));
-        return false;
-      }
-      mPreSkip = LEUint16(aPacket->packet + 10);
-      mNominalRate = LEUint32(aPacket->packet + 12);
-      double gain_dB = LEInt16(aPacket->packet + 16) / 256.0;
-#ifdef MOZ_SAMPLE_TYPE_FLOAT32
-      mGain = static_cast<float>(pow(10,0.05*gain_dB));
-#else
-      mGain_Q16 = static_cast<int32_t>(std::min(65536*pow(10,0.05*gain_dB)+0.5,
-                                              static_cast<double>(INT32_MAX)));
-#endif
-      mChannelMapping = aPacket->packet[18];
-
-      if (mChannelMapping == 0) {
-        // Mapping family 0 only allows two channels
-        if (mChannels>2) {
-          LOG(PR_LOG_DEBUG, ("Invalid Opus file: too many channels (%d) for"
-                             " mapping family 0.", mChannels));
+        mParser = new OpusParser;
+        if(!mParser->DecodeHeader(aPacket->packet, aPacket->bytes)) {
           return false;
         }
-        mStreams = 1;
-        mCoupledStreams = mChannels - 1;
-        mMappingTable[0] = 0;
-        mMappingTable[1] = 1;
-      } else if (mChannelMapping == 1) {
-        // Currently only up to 8 channels are defined for mapping family 1
-        if (mChannels>8) {
-          LOG(PR_LOG_DEBUG, ("Invalid Opus file: too many channels (%d) for"
-                             " mapping family 1.", mChannels));
-          return false;
-        }
-        if (aPacket->bytes>20+mChannels) {
-          mStreams = aPacket->packet[19];
-          mCoupledStreams = aPacket->packet[20];
-          int i;
-          for (i=0; i<mChannels; i++)
-            mMappingTable[i] = aPacket->packet[21+i];
-        } else {
-          LOG(PR_LOG_DEBUG, ("Invalid Opus file: channel mapping %d,"
-                             " but no channel mapping table", mChannelMapping));
-          return false;
-        }
-      } else {
-        LOG(PR_LOG_DEBUG, ("Invalid Opus file: unsupported channel mapping "
-                           "family %d", mChannelMapping));
-        return false;
-      }
-      if (mStreams < 1) {
-        LOG(PR_LOG_DEBUG, ("Invalid Opus file: no streams"));
-        return false;
-      }
-      if (mCoupledStreams > mStreams) {
-        LOG(PR_LOG_DEBUG, ("Invalid Opus file: more coupled streams (%d) than "
-                           "total streams (%d)", mCoupledStreams, mStreams));
-        return false;
-      }
-
-#ifdef DEBUG
-      LOG(PR_LOG_DEBUG, ("Opus stream header:"));
-      LOG(PR_LOG_DEBUG, (" channels: %d", mChannels));
-      LOG(PR_LOG_DEBUG, ("  preskip: %d", mPreSkip));
-      LOG(PR_LOG_DEBUG, (" original: %d Hz", mNominalRate));
-      LOG(PR_LOG_DEBUG, ("     gain: %.2f dB", gain_dB));
-      LOG(PR_LOG_DEBUG, ("Channel Mapping:"));
-      LOG(PR_LOG_DEBUG, ("   family: %d", mChannelMapping));
-      LOG(PR_LOG_DEBUG, ("  streams: %d", mStreams));
+        mRate = mParser->mRate;
+        mChannels = mParser->mChannels;
+        mPreSkip = mParser->mPreSkip;
+#ifdef MOZ_SAMPLE_TYPE_FLOAT32
+        mGain = mParser->mGain;
+#else
+        mGain_Q16 = mParser->mGain_Q16;
 #endif
     }
     break;
 
     // Parse the metadata header.
     case 1: {
-      if (aPacket->bytes < 16 || memcmp(aPacket->packet, "OpusTags", 8))
-        return false;
-
-      // Copy out the raw comment lines, but only do basic validation
-      // checks against the string packing: too little data, too many
-      // comments, or comments that are too long. Rejecting these cases
-      // helps reduce the propagation of broken files.
-      // We do not ensure they are valid UTF-8 here, nor do we validate
-      // the required ASCII_TAG=value format of the user comments.
-      const unsigned char* buf = aPacket->packet + 8;
-      uint32_t bytes = aPacket->bytes - 8;
-      uint32_t len;
-      // Read the vendor string.
-      len = LEUint32(buf);
-      buf += 4;
-      bytes -= 4;
-      if (len > bytes)
-        return false;
-      mVendorString = nsCString(reinterpret_cast<const char*>(buf), len);
-      buf += len;
-      bytes -= len;
-      // Read the user comments.
-      if (bytes < 4)
-        return false;
-      uint32_t ncomments = LEUint32(buf);
-      buf += 4;
-      bytes -= 4;
-      // If there are so many comments even their length fields
-      // won't fit in the packet, stop reading now.
-      if (ncomments > (bytes>>2))
-        return false;
-      uint32_t i;
-      for (i = 0; i < ncomments; i++) {
-        if (bytes < 4)
+        if(!mParser->DecodeTags(aPacket->packet, aPacket->bytes)) {
           return false;
-        len = LEUint32(buf);
-        buf += 4;
-        bytes -= 4;
-        if (len > bytes)
-          return false;
-        mTags.AppendElement(nsCString(reinterpret_cast<const char*>(buf), len));
-        buf += len;
-        bytes -= len;
-      }
-
-#ifdef DEBUG
-      LOG(PR_LOG_DEBUG, ("Opus metadata header:"));
-      LOG(PR_LOG_DEBUG, ("  vendor: %s", mVendorString.get()));
-      for (uint32_t i = 0; i < mTags.Length(); i++) {
-        LOG(PR_LOG_DEBUG, (" %s", mTags[i].get()));
-      }
-#endif
+        }
     }
     break;
 
     // We made it to the first data packet (which includes reconstructing
     // timestamps for it in PageIn). Success!
     default: {
       mDoneReadingHeaders = true;
       // Put it back on the queue so we can decode it.
@@ -1072,30 +912,30 @@ bool OpusState::DecodeHeader(ogg_packet*
 }
 
 /* Construct and return a tags hashmap from our internal array */
 MetadataTags* OpusState::GetTags()
 {
   MetadataTags* tags;
 
   tags = new MetadataTags;
-  for (uint32_t i = 0; i < mTags.Length(); i++) {
-    AddVorbisComment(tags, mTags[i].Data(), mTags[i].Length());
+  for (uint32_t i = 0; i < mParser->mTags.Length(); i++) {
+    AddVorbisComment(tags, mParser->mTags[i].Data(), mParser->mTags[i].Length());
   }
 
   return tags;
 }
 
 /* Return the timestamp (in microseconds) equivalent to a granulepos. */
 int64_t OpusState::Time(int64_t aGranulepos)
 {
   if (!mActive)
     return -1;
 
-  return Time(mPreSkip, aGranulepos);
+  return Time(mParser->mPreSkip, aGranulepos);
 }
 
 int64_t OpusState::Time(int aPreSkip, int64_t aGranulepos)
 {
   if (aGranulepos < 0)
     return -1;
 
   // Ogg Opus always runs at a granule rate of 48 kHz.
@@ -1323,39 +1163,39 @@ static const unsigned char* ReadVariable
 bool SkeletonState::DecodeIndex(ogg_packet* aPacket)
 {
   NS_ASSERTION(aPacket->bytes >= SKELETON_4_0_MIN_INDEX_LEN,
                "Index must be at least minimum size");
   if (!mActive) {
     return false;
   }
 
-  uint32_t serialno = LEUint32(aPacket->packet + INDEX_SERIALNO_OFFSET);
-  int64_t numKeyPoints = LEInt64(aPacket->packet + INDEX_NUM_KEYPOINTS_OFFSET);
+  uint32_t serialno = LittleEndian::readUint32(aPacket->packet + INDEX_SERIALNO_OFFSET);
+  int64_t numKeyPoints = LittleEndian::readInt64(aPacket->packet + INDEX_NUM_KEYPOINTS_OFFSET);
 
   int64_t endTime = 0, startTime = 0;
   const unsigned char* p = aPacket->packet;
 
-  int64_t timeDenom = LEInt64(aPacket->packet + INDEX_TIME_DENOM_OFFSET);
+  int64_t timeDenom = LittleEndian::readInt64(aPacket->packet + INDEX_TIME_DENOM_OFFSET);
   if (timeDenom == 0) {
     LOG(PR_LOG_DEBUG, ("Ogg Skeleton Index packet for stream %u has 0 "
                        "timestamp denominator.", serialno));
     return (mActive = false);
   }
 
   // Extract the start time.
-  CheckedInt64 t = CheckedInt64(LEInt64(p + INDEX_FIRST_NUMER_OFFSET)) * USECS_PER_S;
+  CheckedInt64 t = CheckedInt64(LittleEndian::readInt64(p + INDEX_FIRST_NUMER_OFFSET)) * USECS_PER_S;
   if (!t.isValid()) {
     return (mActive = false);
   } else {
     startTime = t.value() / timeDenom;
   }
 
   // Extract the end time.
-  t = LEInt64(p + INDEX_LAST_NUMER_OFFSET) * USECS_PER_S;
+  t = LittleEndian::readInt64(p + INDEX_LAST_NUMER_OFFSET) * USECS_PER_S;
   if (!t.isValid()) {
     return (mActive = false);
   } else {
     endTime = t.value() / timeDenom;
   }
 
   // Check the numKeyPoints value read, ensure we're not going to run out of
   // memory while trying to decode the index packet.
@@ -1526,34 +1366,34 @@ nsresult SkeletonState::GetDuration(cons
   aDuration = duration.isValid() ? duration.value() : 0;
   return duration.isValid() ? NS_OK : NS_ERROR_FAILURE;
 }
 
 bool SkeletonState::DecodeHeader(ogg_packet* aPacket)
 {
   nsAutoRef<ogg_packet> autoRelease(aPacket);
   if (IsSkeletonBOS(aPacket)) {
-    uint16_t verMajor = LEUint16(aPacket->packet + SKELETON_VERSION_MAJOR_OFFSET);
-    uint16_t verMinor = LEUint16(aPacket->packet + SKELETON_VERSION_MINOR_OFFSET);
+    uint16_t verMajor = LittleEndian::readUint16(aPacket->packet + SKELETON_VERSION_MAJOR_OFFSET);
+    uint16_t verMinor = LittleEndian::readUint16(aPacket->packet + SKELETON_VERSION_MINOR_OFFSET);
 
     // Read the presentation time. We read this before the version check as the
     // presentation time exists in all versions.
-    int64_t n = LEInt64(aPacket->packet + SKELETON_PRESENTATION_TIME_NUMERATOR_OFFSET);
-    int64_t d = LEInt64(aPacket->packet + SKELETON_PRESENTATION_TIME_DENOMINATOR_OFFSET);
+    int64_t n = LittleEndian::readInt64(aPacket->packet + SKELETON_PRESENTATION_TIME_NUMERATOR_OFFSET);
+    int64_t d = LittleEndian::readInt64(aPacket->packet + SKELETON_PRESENTATION_TIME_DENOMINATOR_OFFSET);
     mPresentationTime = d == 0 ? 0 : (static_cast<float>(n) / static_cast<float>(d)) * USECS_PER_S;
 
     mVersion = SKELETON_VERSION(verMajor, verMinor);
     // We can only care to parse Skeleton version 4.0+.
     if (mVersion < SKELETON_VERSION(4,0) ||
         mVersion >= SKELETON_VERSION(5,0) ||
         aPacket->bytes < SKELETON_4_0_MIN_HEADER_LEN)
       return false;
 
     // Extract the segment length.
-    mLength = LEInt64(aPacket->packet + SKELETON_FILE_LENGTH_OFFSET);
+    mLength = LittleEndian::readInt64(aPacket->packet + SKELETON_FILE_LENGTH_OFFSET);
 
     LOG(PR_LOG_DEBUG, ("Skeleton segment length: %lld", mLength));
 
     // Initialize the serialno-to-index map.
     return true;
   } else if (IsSkeletonIndex(aPacket) && mVersion >= SKELETON_VERSION(4,0)) {
     return DecodeIndex(aPacket);
   } else if (aPacket->e_o_s) {
--- a/content/media/ogg/OggCodecState.h
+++ b/content/media/ogg/OggCodecState.h
@@ -31,16 +31,18 @@
 
 // Uncomment the following to validate that we're predicting the number
 // of Vorbis samples in each packet correctly.
 #define VALIDATE_VORBIS_SAMPLE_CALCULATION
 #ifdef  VALIDATE_VORBIS_SAMPLE_CALCULATION
 #include <map>
 #endif
 
+#include "OpusParser.h"
+
 namespace mozilla {
 
 // Deallocates a packet, used in OggPacketQueue below.
 class OggPacketDeallocator : public nsDequeFunctor {
   virtual void* operator() (void* aPacket) {
     ogg_packet* p = static_cast<ogg_packet*>(aPacket);
     delete [] p->packet;
     delete p;
@@ -336,44 +338,37 @@ public:
   bool IsHeader(ogg_packet* aPacket);
   nsresult PageIn(ogg_page* aPage);
 
   // Returns the end time that a granulepos represents.
   static int64_t Time(int aPreSkip, int64_t aGranulepos);
 
   // Various fields from the Ogg Opus header.
   int mRate;        // Sample rate the decoder uses (always 48 kHz).
-  uint32_t mNominalRate; // Original sample rate of the data (informational).
   int mChannels;    // Number of channels the stream encodes.
   uint16_t mPreSkip; // Number of samples to strip after decoder reset.
 #ifdef MOZ_SAMPLE_TYPE_FLOAT32
   float mGain;      // Gain to apply to decoder output.
 #else
   int32_t mGain_Q16; // Gain to apply to the decoder output.
 #endif
-  int mChannelMapping; // Channel mapping family.
-  int mStreams;     // Number of packed streams in each packet.
-  int mCoupledStreams; // Number of packed coupled streams in each packet.
-  unsigned char mMappingTable[255]; // Channel mapping table.
 
+  nsAutoPtr<OpusParser> mParser;
   OpusMSDecoder *mDecoder;
 
   int mSkip;        // Number of samples left to trim before playback.
   // Granule position (end sample) of the last decoded Opus packet. This is
   // used to calculate the amount we should trim from the last packet.
   int64_t mPrevPacketGranulepos;
 
   // Construct and return a table of tags from the metadata header.
   MetadataTags* GetTags();
 
 private:
 
-  nsCString mVendorString;   // Encoder vendor string from the header.
-  nsTArray<nsCString> mTags; // Unparsed comment strings from the header.
-
   // Reconstructs the granulepos of Opus packets stored in the
   // mUnstamped array. mUnstamped must be filled with consecutive packets from
   // the stream, with the last packet having a known granulepos. Using this
   // known granulepos, and the known frame numbers, we recover the granulepos
   // of all frames in the array. This enables us to determine their timestamps.
   bool ReconstructOpusGranulepos();
 
   // Granule position (end sample) of the last decoded Opus page. This is
--- a/content/media/ogg/OggReader.h
+++ b/content/media/ogg/OggReader.h
@@ -73,16 +73,22 @@ public:
     return mTheoraState != 0 && mTheoraState->mActive;
   }
 
   virtual nsresult ReadMetadata(MediaInfo* aInfo,
                                 MetadataTags** aTags);
   virtual nsresult Seek(int64_t aTime, int64_t aStartTime, int64_t aEndTime, int64_t aCurrentTime);
   virtual nsresult GetBuffered(dom::TimeRanges* aBuffered, int64_t aStartTime);
 
+  // Downmix multichannel Audio samples to Stereo.
+  // It is used from Vorbis and Opus decoders.
+  // Input are the buffer contains multichannel data,
+  // the number of channels and the number of frames.
+  static void DownmixToStereo(nsAutoArrayPtr<AudioDataValue>& buffer,
+                     uint32_t& channel, int32_t frames);
 private:
   // This monitor should be taken when reading or writing to mIsChained.
   ReentrantMonitor mMonitor;
 
   // Specialized Reset() method to signal if the seek is
   // to the start of the stream.
   nsresult ResetDecode(bool start);
 
@@ -218,22 +224,16 @@ private:
   // Decodes a packet of Vorbis data, and inserts its samples into the
   // audio queue.
   nsresult DecodeVorbis(ogg_packet* aPacket);
 
   // Decodes a packet of Opus data, and inserts its samples into the
   // audio queue.
   nsresult DecodeOpus(ogg_packet* aPacket);
 
-  // Downmix multichannel Audio samples to Stereo.
-  // It is used from Vorbis and Opus decoders.
-  // Input are the buffer contains multichannel data,
-  // the number of channels and the number of frames.
-  void DownmixToStereo(nsAutoArrayPtr<AudioDataValue>& buffer,
-                     uint32_t& channel, int32_t frames);
 
   // Decodes a packet of Theora data, and inserts its frame into the
   // video queue. May return NS_ERROR_OUT_OF_MEMORY. Caller must have obtained
   // the reader's monitor. aTimeThreshold is the current playback position
   // in media time in microseconds. Frames with an end time before this will
   // not be enqueued.
   nsresult DecodeTheora(ogg_packet* aPacket, int64_t aTimeThreshold);
 
new file mode 100644
--- /dev/null
+++ b/content/media/ogg/OpusParser.cpp
@@ -0,0 +1,197 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <string.h>
+
+#include "mozilla/DebugOnly.h"
+#include "mozilla/Endian.h"
+#include <stdint.h>
+
+#include "OpusParser.h"
+
+#include "nsDebug.h"
+#include "MediaDecoderReader.h"
+#include "VideoUtils.h"
+#include <algorithm>
+
+#include "opus/opus.h"
+extern "C" {
+#include "opus/opus_multistream.h"
+}
+
+namespace mozilla {
+
+#ifdef PR_LOGGING
+extern PRLogModuleInfo* gMediaDecoderLog;
+#define OPUS_LOG(type, msg) PR_LOG(gMediaDecoderLog, type, msg)
+#else
+#define OPUS_LOG(type, msg)
+#endif
+
+OpusParser::OpusParser():
+  mRate(0),
+  mNominalRate(0),
+  mChannels(0),
+  mPreSkip(0),
+#ifdef MOZ_SAMPLE_TYPE_FLOAT32
+  mGain(1.0f),
+#else
+  mGain_Q16(65536),
+#endif
+  mChannelMapping(0),
+  mStreams(0),
+  mCoupledStreams(0)
+{ }
+
+bool OpusParser::DecodeHeader(unsigned char* aData, size_t aLength)
+{
+    if (aLength < 19 || memcmp(aData, "OpusHead", 8)) {
+      OPUS_LOG(PR_LOG_DEBUG, ("Invalid Opus file: unrecognized header"));
+      return false;
+    }
+
+    mRate = 48000; // The Opus decoder runs at 48 kHz regardless.
+
+    int version = aData[8];
+    // Accept file format versions 0.x.
+    if ((version & 0xf0) != 0) {
+      OPUS_LOG(PR_LOG_DEBUG, ("Rejecting unknown Opus file version %d", version));
+      return false;
+    }
+
+    mChannels = aData[9];
+    if (mChannels<1) {
+      OPUS_LOG(PR_LOG_DEBUG, ("Invalid Opus file: Number of channels %d", mChannels));
+      return false;
+    }
+
+    mPreSkip = LittleEndian::readUint16(aData + 10);
+    mNominalRate = LittleEndian::readUint32(aData + 12);
+    double gain_dB = LittleEndian::readInt16(aData + 16) / 256.0;
+#ifdef MOZ_SAMPLE_TYPE_FLOAT32
+    mGain = static_cast<float>(pow(10,0.05*gain_dB));
+#else
+    mGain_Q16 = static_cast<int32_t>(std::min(65536*pow(10,0.05*gain_dB)+0.5,
+                                            static_cast<double>(INT32_MAX)));
+#endif
+    mChannelMapping = aData[18];
+
+    if (mChannelMapping == 0) {
+      // Mapping family 0 only allows two channels
+      if (mChannels>2) {
+        OPUS_LOG(PR_LOG_DEBUG, ("Invalid Opus file: too many channels (%d) for"
+                           " mapping family 0.", mChannels));
+        return false;
+      }
+      mStreams = 1;
+      mCoupledStreams = mChannels - 1;
+      mMappingTable[0] = 0;
+      mMappingTable[1] = 1;
+    } else if (mChannelMapping == 1) {
+      // Currently only up to 8 channels are defined for mapping family 1
+      if (mChannels>8) {
+        OPUS_LOG(PR_LOG_DEBUG, ("Invalid Opus file: too many channels (%d) for"
+                           " mapping family 1.", mChannels));
+        return false;
+      }
+      if (aLength>static_cast<unsigned>(20+mChannels)) {
+        mStreams = aData[19];
+        mCoupledStreams = aData[20];
+        int i;
+        for (i=0; i<mChannels; i++)
+          mMappingTable[i] = aData[21+i];
+      } else {
+        OPUS_LOG(PR_LOG_DEBUG, ("Invalid Opus file: channel mapping %d,"
+                           " but no channel mapping table", mChannelMapping));
+        return false;
+      }
+    } else {
+      OPUS_LOG(PR_LOG_DEBUG, ("Invalid Opus file: unsupported channel mapping "
+                         "family %d", mChannelMapping));
+      return false;
+    }
+    if (mStreams < 1) {
+      OPUS_LOG(PR_LOG_DEBUG, ("Invalid Opus file: no streams"));
+      return false;
+    }
+    if (mCoupledStreams > mStreams) {
+      OPUS_LOG(PR_LOG_DEBUG, ("Invalid Opus file: more coupled streams (%d) than "
+                         "total streams (%d)", mCoupledStreams, mStreams));
+      return false;
+    }
+
+#ifdef DEBUG
+    OPUS_LOG(PR_LOG_DEBUG, ("Opus stream header:"));
+    OPUS_LOG(PR_LOG_DEBUG, (" channels: %d", mChannels));
+    OPUS_LOG(PR_LOG_DEBUG, ("  preskip: %d", mPreSkip));
+    OPUS_LOG(PR_LOG_DEBUG, (" original: %d Hz", mNominalRate));
+    OPUS_LOG(PR_LOG_DEBUG, ("     gain: %.2f dB", gain_dB));
+    OPUS_LOG(PR_LOG_DEBUG, ("Channel Mapping:"));
+    OPUS_LOG(PR_LOG_DEBUG, ("   family: %d", mChannelMapping));
+    OPUS_LOG(PR_LOG_DEBUG, ("  streams: %d", mStreams));
+#endif
+  return true;
+}
+
+bool OpusParser::DecodeTags(unsigned char* aData, size_t aLength)
+{
+  if (aLength < 16 || memcmp(aData, "OpusTags", 8))
+    return false;
+
+  // Copy out the raw comment lines, but only do basic validation
+  // checks against the string packing: too little data, too many
+  // comments, or comments that are too long. Rejecting these cases
+  // helps reduce the propagation of broken files.
+  // We do not ensure they are valid UTF-8 here, nor do we validate
+  // the required ASCII_TAG=value format of the user comments.
+  const unsigned char* buf = aData + 8;
+  uint32_t bytes = aLength - 8;
+  uint32_t len;
+  // Read the vendor string.
+  len = LittleEndian::readUint32(buf);
+  buf += 4;
+  bytes -= 4;
+  if (len > bytes)
+    return false;
+  mVendorString = nsCString(reinterpret_cast<const char*>(buf), len);
+  buf += len;
+  bytes -= len;
+  // Read the user comments.
+  if (bytes < 4)
+    return false;
+  uint32_t ncomments = LittleEndian::readUint32(buf);
+  buf += 4;
+  bytes -= 4;
+  // If there are so many comments even their length fields
+  // won't fit in the packet, stop reading now.
+  if (ncomments > (bytes>>2))
+    return false;
+  uint32_t i;
+  for (i = 0; i < ncomments; i++) {
+    if (bytes < 4)
+      return false;
+    len = LittleEndian::readUint32(buf);
+    buf += 4;
+    bytes -= 4;
+    if (len > bytes)
+      return false;
+    mTags.AppendElement(nsCString(reinterpret_cast<const char*>(buf), len));
+    buf += len;
+    bytes -= len;
+  }
+
+#ifdef DEBUG
+  OPUS_LOG(PR_LOG_DEBUG, ("Opus metadata header:"));
+  OPUS_LOG(PR_LOG_DEBUG, ("  vendor: %s", mVendorString.get()));
+  for (uint32_t i = 0; i < mTags.Length(); i++) {
+    OPUS_LOG(PR_LOG_DEBUG, (" %s", mTags[i].get()));
+  }
+#endif
+  return true;
+}
+
+} // namespace mozilla
+
new file mode 100644
--- /dev/null
+++ b/content/media/ogg/OpusParser.h
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* 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/. */
+#if !defined(OpusParser_h_)
+#define OpusParser_h_
+
+#include <stdint.h>
+
+#include <opus/opus.h>
+#include "opus/opus_multistream.h"
+
+#include "nsTArray.h"
+#include "nsString.h"
+
+namespace mozilla {
+
+class OpusParser
+{
+public:
+  OpusParser();
+
+  bool DecodeHeader(unsigned char* aData, size_t aLength);
+  bool DecodeTags(unsigned char* aData, size_t aLength);
+
+  // Various fields from the Ogg Opus header.
+  int mRate;        // Sample rate the decoder uses (always 48 kHz).
+  uint32_t mNominalRate; // Original sample rate of the data (informational).
+  int mChannels;    // Number of channels the stream encodes.
+  uint16_t mPreSkip; // Number of samples to strip after decoder reset.
+#ifdef MOZ_SAMPLE_TYPE_FLOAT32
+  float mGain;      // Gain to apply to decoder output.
+#else
+  int32_t mGain_Q16; // Gain to apply to the decoder output.
+#endif
+  int mChannelMapping; // Channel mapping family.
+  int mStreams;     // Number of packed streams in each packet.
+  int mCoupledStreams; // Number of packed coupled streams in each packet.
+  unsigned char mMappingTable[255]; // Channel mapping table.
+
+  // Granule position (end sample) of the last decoded Opus packet. This is
+  // used to calculate the amount we should trim from the last packet.
+  int64_t mPrevPacketGranulepos;
+
+  nsTArray<nsCString> mTags; // Unparsed comment strings from the header.
+
+  nsCString mVendorString;   // Encoder vendor string from the header.
+
+};
+
+} // namespace mozilla
+
+#endif
--- a/content/media/ogg/moz.build
+++ b/content/media/ogg/moz.build
@@ -4,20 +4,22 @@
 # 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/.
 
 EXPORTS += [
     'OggCodecState.h',
     'OggDecoder.h',
     'OggReader.h',
     'OggWriter.h',
+    'OpusParser.h',
 ]
 
 UNIFIED_SOURCES += [
     'OggCodecState.cpp',
     'OggDecoder.cpp',
     'OggReader.cpp',
     'OggWriter.cpp',
+    'OpusParser.cpp',
 ]
 
 FAIL_ON_WARNINGS = True
 
 FINAL_LIBRARY = 'gklayout'
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..41cb93d805b15544595111da619380fc026fddb5
GIT binary patch
literal 141774
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%0A_(!Cnih0ntQC#?;!HV~JC+z7D<U4m=pH
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
--- a/content/media/test/manifest.js
+++ b/content/media/test/manifest.js
@@ -183,16 +183,26 @@ var gPlayTests = [
   { name:"small-shot.mp3", type:"audio/mpeg", duration:0.27 },
   { name:"owl.mp3", type:"audio/mpeg", duration:3.29 },
   // owl.mp3 as above, but with something funny going on in the ID3v2 tag
   // that causes DirectShow to fail.
   { name:"owl-funny-id3.mp3", type:"audio/mpeg", duration:3.29 },
   // owl.mp3 as above, but with something even funnier going on in the ID3v2 tag
   // that causes DirectShow to fail.
   { name:"owl-funnier-id3.mp3", type:"audio/mpeg", duration:3.29 },
+  // One second of silence with ~140KB of ID3 tags. Usually when the first MP3
+  // frame is at such a high offset into the file, MP3FrameParser will give up
+  // and report that the stream is not MP3. However, it does not count ID3 tags
+  // in that offset. This test case makes sure that ID3 exclusion holds.
+  { name:"huge-id3.mp3", type:"audio/mpeg", duration:1.00 },
+  // A truncated VBR MP3 with just enough frames to keep most decoders happy.
+  // The Xing header reports the length of the file to be around 10 seconds, but
+  // there is really only one second worth of data. We want MP3FrameParser to
+  // trust the header, so this should be reported as 10 seconds.
+  { name:"vbr-head.mp3", type:"audio/mpeg", duration:10.00 },
 
   // Invalid file
   { name:"bogus.duh", type:"bogus/duh", duration:Number.NaN }
 ];
 
 // A file for each type we can support.
 var gSnifferTests = [
   { name:"big.wav", type:"audio/x-wav", duration:9.278981, size:102444 },
--- a/content/media/test/mochitest.ini
+++ b/content/media/test/mochitest.ini
@@ -92,16 +92,17 @@ support-files =
   dynamic_redirect.sjs
   dynamic_resource.sjs
   file_a4_tone.ogg
   file_access_controls.html
   file_audio_event_adopt_iframe.html
   fragment_noplay.js
   fragment_play.js
   gizmo.mp4
+  huge-id3.mp3
   id3tags.mp3
   invalid-cmap-s0c0.opus
   invalid-cmap-s0c2.opus
   invalid-cmap-s1c2.opus
   invalid-cmap-short.opus
   invalid-m0c0.opus
   invalid-m0c3.opus
   invalid-m1c0.opus
@@ -159,16 +160,17 @@ support-files =
   test-6-5.1.opus
   test-7-6.1.opus
   test-8-7.1.opus
   variable-channel.ogg
   variable-channel.opus
   variable-preskip.opus
   variable-samplerate.ogg
   variable-samplerate.opus
+  vbr-head.mp3
   vbr.mp3
   VID_0001.ogg
   video-overhang.ogg
   wave_metadata.wav
   wave_metadata_bad_len.wav
   wave_metadata_bad_no_null.wav
   wave_metadata_bad_utf8.wav
   wave_metadata_unknown_tag.wav
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..35f41054915188d8de9230583320ee6eae66f075
GIT binary patch
literal 4474
zc%0pre@v8h9LGNoU+e(gouMe^Ave4<OaVJEnAme?nwP>@4T*FF>jbivAz9s=?VjDm
zW@c#X2SzQ(O>EaRgpyjUIHJ)Ujj|}lFHdV0$*>YMpX0f2-|utWG5Fpe+;jF%pFi&4
z_B_w)d4GO?vFB(9%(TMYd&<d|27nU)&b$l}k*esqYEA6I#Y>hZBqr%sCf~g#^`7)~
zS?f3O8#g^*-j<v9aDGAI&Z6SSEoDzU_4G59&sq1sC^)JPzEb_#8#T4>)*U}_(s`<}
z`Rr$(f8pxrJojz)`JUeXA@?trhet;L8oMD%gcp-z%H3>8$;zsXH2YsAPNzrlCg5u6
zd*rp&9AjSge{R?_zXMPka9;9{4uEe1hy<<;VQQig9R~Wx_^BuHR&vFk^d2!EIE;%1
zIQbguSI?(pfgDZ%?<Z~mghc^0%J+@Mq>6F!PlS`~;LK=U3E`|2N)Hnb79XL{R+CGw
z_=A&T*ghMJBJarmj89^`W9m+)(@8m7?5=FIfe6tpfbvYjafW0>hPHy_CjQRrk$s@G
zd2CqxgW>FU2$OzGh0?B&In#(y(beRWZ#j6jXPPG{=T+oNLo_h{_{_>fGffV6Js^R{
z)az0d!#U%CZ#X@TPa2fwgw7$)Zv;?90l(}80^p_nLN=0O7{7h*Fzw>Bl(Rsvgzh(}
zh^N{4PYb?jYD>go!5oaeEnTY^PQTqa8J|^xB|D7x_(DW`2uxHu8O|lNF^XGKPdHl8
z&r{9;HOOT*W+NZoT81--T&*b4J(UMx>1iWXM-oBGVDezd(XK;l+~MY1g{)>A<AFRu
zg{7^Go{RQ&Gq;>_<_qPYD$=vmO(8pq3=;(Ox*4ptvF(hWOUP7#lH|SvNnHx{^r|z_
zc=N@oed&D|Umq!H8fG~C4wo4j!mU%r7|x)>rAKL0Pn@s<{yWZ8{Ui%z*@`*7_J3P7
z>?P?i?0hpwzL~7t9aK-Ouv}?;W}(L&;rbCRk~vUrRmOomDj0ee<8Gqm+SR|C>LSlE
zd3_<m?>948(v{Y!>^8}$<_YQ0hvLVl8O~2L=XU52B+&Y~cCQU@;cicB@&Xs6ei)9j
zcmVA=0B+#d)BdJq^8lFu#nbpK1Lb)DJ`S04KhS0xWd7U&zfGCHX^%Frc@U_d2j5N_
zgG1TjaGVgWhQx_0``G<p$YJb4x)QlgEehs#z>booD)D|BF2>l?5VU?qeD$LNxnC;?
z&ZM^*s^)+SG?(A;XoK_v)DGdyAG*LDpbOk@(nl=>MwTAz?P2FOnRD}y;nvJkCupdy
z_jjt;`1B)JrmtUztcPxfpdt70&C+7B7Dxwx_5*x9_Vfvc(-+7$ouF6VuLEpZk;v*9
z4D`1Qu(T@V&`!XSI>f8Hz3+XA#eu3I`DWULQmEhV6m}`sBQL(>;DRS=h@{`yJ(27o
z@mxZ^JWmzwAv2SK>{f5F`zZ4JP47GZg#K6{1q52)MH-s(58Vfx$m;nO*;o7a#JhyD
zoX|L+5#$2B>KT31NX||q+m2xT*h|SDEMho)0X+$@B8<J)Z(2I>FuV6&K<#Nr-mk-}
zQ+I`t98Ejd)_FT^Vrp)%`IFCO(ETkg<oV-oY&YxY0_+7u5Lha{vF&&v+jn~H{`s>I
SR$9aITi~Q#@b&aMjrkXKs~zb8
--- a/content/media/webm/WebMReader.cpp
+++ b/content/media/webm/WebMReader.cpp
@@ -11,16 +11,18 @@
 #include "WebMBufferedParser.h"
 #include "mozilla/dom/TimeRanges.h"
 #include "VorbisUtils.h"
 
 #define VPX_DONT_DEFINE_STDINT_TYPES
 #include "vpx/vp8dx.h"
 #include "vpx/vpx_decoder.h"
 
+#include "OggReader.h"
+
 using mozilla::NesteggPacketHolder;
 
 template <>
 class nsAutoRefTraits<NesteggPacketHolder> : public nsPointerRefTraits<NesteggPacketHolder>
 {
 public:
   static void Release(NesteggPacketHolder* aHolder) { delete aHolder; }
 };
@@ -136,16 +138,21 @@ static void webm_log(nestegg * context,
 #endif
 }
 
 WebMReader::WebMReader(AbstractMediaDecoder* aDecoder)
   : MediaDecoderReader(aDecoder),
   mContext(nullptr),
   mPacketCount(0),
   mChannels(0),
+#ifdef MOZ_OPUS
+  mOpusParser(nullptr),
+  mOpusDecoder(nullptr),
+  mSkip(0),
+#endif
   mVideoTrack(0),
   mAudioTrack(0),
   mAudioStartUsec(-1),
   mAudioFrames(0),
   mHasVideo(false),
   mHasAudio(false)
 {
   MOZ_COUNT_CTOR(WebMReader);
@@ -172,16 +179,21 @@ WebMReader::~WebMReader()
 
   vpx_codec_destroy(&mVP8);
 
   vorbis_block_clear(&mVorbisBlock);
   vorbis_dsp_clear(&mVorbisDsp);
   vorbis_info_clear(&mVorbisInfo);
   vorbis_comment_clear(&mVorbisComment);
 
+  if (mOpusDecoder) {
+    opus_multistream_decoder_destroy(mOpusDecoder);
+    mOpusDecoder = nullptr;
+  }
+
   MOZ_COUNT_DTOR(WebMReader);
 }
 
 nsresult WebMReader::Init(MediaDecoderReader* aCloneDonor)
 {
   if (vpx_codec_dec_init(&mVP8, vpx_codec_vp8_dx(), nullptr, 0)) {
     return NS_ERROR_FAILURE;
   }
@@ -333,74 +345,125 @@ nsresult WebMReader::ReadMetadata(MediaI
       if (r == -1) {
         Cleanup();
         return NS_ERROR_FAILURE;
       }
 
       mAudioTrack = track;
       mHasAudio = true;
       mInfo.mAudio.mHasAudio = true;
+      mAudioCodec = nestegg_track_codec_id(mContext, track);
+      mCodecDelay = params.codec_delay;
 
-      // Get the Vorbis header data
-      unsigned int nheaders = 0;
-      r = nestegg_track_codec_data_count(mContext, track, &nheaders);
-      if (r == -1 || nheaders != 3) {
-        Cleanup();
-        return NS_ERROR_FAILURE;
-      }
+      if (mAudioCodec == NESTEGG_CODEC_VORBIS) {
+        // Get the Vorbis header data
+        unsigned int nheaders = 0;
+        r = nestegg_track_codec_data_count(mContext, track, &nheaders);
+        if (r == -1 || nheaders != 3) {
+          Cleanup();
+          return NS_ERROR_FAILURE;
+        }
+
+        for (uint32_t header = 0; header < nheaders; ++header) {
+          unsigned char* data = 0;
+          size_t length = 0;
+
+          r = nestegg_track_codec_data(mContext, track, header, &data, &length);
+          if (r == -1) {
+            Cleanup();
+            return NS_ERROR_FAILURE;
+          }
+          ogg_packet opacket = InitOggPacket(data, length, header == 0, false, 0);
 
-      for (uint32_t header = 0; header < nheaders; ++header) {
+          r = vorbis_synthesis_headerin(&mVorbisInfo,
+                                        &mVorbisComment,
+                                        &opacket);
+          if (r != 0) {
+            Cleanup();
+            return NS_ERROR_FAILURE;
+          }
+        }
+
+        r = vorbis_synthesis_init(&mVorbisDsp, &mVorbisInfo);
+        if (r != 0) {
+          Cleanup();
+          return NS_ERROR_FAILURE;
+        }
+
+        r = vorbis_block_init(&mVorbisDsp, &mVorbisBlock);
+        if (r != 0) {
+          Cleanup();
+          return NS_ERROR_FAILURE;
+        }
+
+        mInfo.mAudio.mRate = mVorbisDsp.vi->rate;
+        mInfo.mAudio.mChannels = mVorbisDsp.vi->channels;
+        mChannels = mInfo.mAudio.mChannels;
+#ifdef MOZ_OPUS
+      } else if (mAudioCodec == NESTEGG_CODEC_OPUS) {
         unsigned char* data = 0;
         size_t length = 0;
-
-        r = nestegg_track_codec_data(mContext, track, header, &data, &length);
+        r = nestegg_track_codec_data(mContext, track, 0, &data, &length);
         if (r == -1) {
           Cleanup();
           return NS_ERROR_FAILURE;
         }
 
-        ogg_packet opacket = InitOggPacket(data, length, header == 0, false, 0);
+        mOpusParser = new OpusParser;
+        if (!mOpusParser->DecodeHeader(data, length)) {
+          Cleanup();
+          return NS_ERROR_FAILURE;
+        }
 
-        r = vorbis_synthesis_headerin(&mVorbisInfo,
-                                      &mVorbisComment,
-                                      &opacket);
-        if (r != 0) {
+        if (!InitOpusDecoder()) {
           Cleanup();
           return NS_ERROR_FAILURE;
         }
-      }
+
+        mInfo.mAudio.mRate = mOpusParser->mRate;
 
-      r = vorbis_synthesis_init(&mVorbisDsp, &mVorbisInfo);
-      if (r != 0) {
+        mInfo.mAudio.mChannels = mOpusParser->mChannels;
+        mInfo.mAudio.mChannels = mInfo.mAudio.mChannels > 2 ? 2 : mInfo.mAudio.mChannels;
+#endif
+      } else {
         Cleanup();
         return NS_ERROR_FAILURE;
       }
-
-      r = vorbis_block_init(&mVorbisDsp, &mVorbisBlock);
-      if (r != 0) {
-        Cleanup();
-        return NS_ERROR_FAILURE;
-      }
-
-      mInfo.mAudio.mRate = mVorbisDsp.vi->rate;
-      mInfo.mAudio.mChannels = mVorbisDsp.vi->channels;
-      mChannels = mInfo.mAudio.mChannels;
     }
   }
 
   // We can't seek in buffered regions if we have no cues.
   mDecoder->SetMediaSeekable(nestegg_has_cues(mContext) == 1);
 
   *aInfo = mInfo;
 
   *aTags = nullptr;
 
   return NS_OK;
 }
 
+#ifdef MOZ_OPUS
+bool WebMReader::InitOpusDecoder()
+{
+  int r;
+
+  NS_ASSERTION(mOpusDecoder == nullptr, "leaking OpusDecoder");
+
+  mOpusDecoder = opus_multistream_decoder_create(mOpusParser->mRate,
+                                             mOpusParser->mChannels,
+                                             mOpusParser->mStreams,
+                                             mOpusParser->mCoupledStreams,
+                                             mOpusParser->mMappingTable,
+                                             &r);
+  mSkip = mOpusParser->mPreSkip;
+
+  return r == OPUS_OK;
+}
+#endif
+
 ogg_packet WebMReader::InitOggPacket(unsigned char* aData,
                                        size_t aLength,
                                        bool aBOS,
                                        bool aEOS,
                                        int64_t aGranulepos)
 {
   ogg_packet packet;
   packet.packet = aData;
@@ -424,17 +487,17 @@ bool WebMReader::DecodeAudioPacket(neste
   }
 
   uint64_t tstamp = 0;
   r = nestegg_packet_tstamp(aPacket, &tstamp);
   if (r == -1) {
     return false;
   }
 
-  const uint32_t rate = mVorbisDsp.vi->rate;
+  const uint32_t rate = mInfo.mAudio.mRate;
   uint64_t tstamp_usecs = tstamp / NS_PER_USEC;
   if (mAudioStartUsec == -1) {
     // This is the first audio chunk. Assume the start time of our decode
     // is the start of this chunk.
     mAudioStartUsec = tstamp_usecs;
   }
   // If there's a gap between the start of this audio chunk and the end of
   // the previous audio chunk, we need to increment the packet count so that
@@ -466,68 +529,200 @@ bool WebMReader::DecodeAudioPacket(neste
   int32_t total_frames = 0;
   for (uint32_t i = 0; i < count; ++i) {
     unsigned char* data;
     size_t length;
     r = nestegg_packet_data(aPacket, i, &data, &length);
     if (r == -1) {
       return false;
     }
+    if (mAudioCodec == NESTEGG_CODEC_VORBIS) {
+      ogg_packet opacket = InitOggPacket(data, length, false, false, -1);
 
-    ogg_packet opacket = InitOggPacket(data, length, false, false, -1);
+      if (vorbis_synthesis(&mVorbisBlock, &opacket) != 0) {
+        return false;
+      }
+
+      if (vorbis_synthesis_blockin(&mVorbisDsp,
+                                   &mVorbisBlock) != 0) {
+        return false;
+      }
+
+      VorbisPCMValue** pcm = 0;
+      int32_t frames = 0;
+      while ((frames = vorbis_synthesis_pcmout(&mVorbisDsp, &pcm)) > 0) {
+        nsAutoArrayPtr<AudioDataValue> buffer(new AudioDataValue[frames * mChannels]);
+        for (uint32_t j = 0; j < mChannels; ++j) {
+          VorbisPCMValue* channel = pcm[j];
+          for (uint32_t i = 0; i < uint32_t(frames); ++i) {
+            buffer[i*mChannels + j] = MOZ_CONVERT_VORBIS_SAMPLE(channel[i]);
+          }
+        }
+
+        CheckedInt64 duration = FramesToUsecs(frames, rate);
+        if (!duration.isValid()) {
+          NS_WARNING("Int overflow converting WebM audio duration");
+          return false;
+        }
+        CheckedInt64 total_duration = FramesToUsecs(total_frames, rate);
+        if (!total_duration.isValid()) {
+          NS_WARNING("Int overflow converting WebM audio total_duration");
+          return false;
+        }
 
-    if (vorbis_synthesis(&mVorbisBlock, &opacket) != 0) {
-      return false;
-    }
+        CheckedInt64 time = total_duration + tstamp_usecs;
+        if (!time.isValid()) {
+          NS_WARNING("Int overflow adding total_duration and tstamp_usecs");
+          nestegg_free_packet(aPacket);
+          return false;
+        };
+
+        total_frames += frames;
+        AudioQueue().Push(new AudioData(aOffset,
+                                       time.value(),
+                                       duration.value(),
+                                       frames,
+                                       buffer.forget(),
+                                       mChannels));
+        mAudioFrames += frames;
+        if (vorbis_synthesis_read(&mVorbisDsp, frames) != 0) {
+          return false;
+        }
+      }
+    } else if (mAudioCodec == NESTEGG_CODEC_OPUS) {
+#ifdef MOZ_OPUS
+      uint32_t channels = mOpusParser->mChannels;
+
+      // Maximum value is 63*2880, so there's no chance of overflow.
+      int32_t frames_number = opus_packet_get_nb_frames(data, length);
+
+      if (frames_number <= 0)
+        return false; // Invalid packet header.
+      int32_t samples = opus_packet_get_samples_per_frame(data,
+                                                          (opus_int32) rate);
+      int32_t frames = frames_number*samples;
+
+      // A valid Opus packet must be between 2.5 and 120 ms long.
+      if (frames < 120 || frames > 5760)
+        return false;
+      nsAutoArrayPtr<AudioDataValue> buffer(new AudioDataValue[frames * channels]);
 
-    if (vorbis_synthesis_blockin(&mVorbisDsp,
-                                 &mVorbisBlock) != 0) {
-      return false;
-    }
+      // Decode to the appropriate sample type.
+#ifdef MOZ_SAMPLE_TYPE_FLOAT32
+      int ret = opus_multistream_decode_float(mOpusDecoder,
+                                              data, length,
+                                              buffer, frames, false);
+#else
+      int ret = opus_multistream_decode(mOpusDecoder,
+                                        data, length,
+                                        buffer, frames, false);
+#endif
+      if (ret < 0)
+        return false;
+      NS_ASSERTION(ret == frames, "Opus decoded too few audio samples");
+
+      // Trim the initial frames while the decoder is settling.
+      if (mSkip > 0) {
+        int32_t skipFrames = std::min(mSkip, frames);
+        if (skipFrames == frames) {
+          // discard the whole packet
+          mSkip -= frames;
+          LOG(PR_LOG_DEBUG, ("Opus decoder skipping %d frames"
+                             " (whole packet)", frames));
+          return true;
+        }
+        int32_t keepFrames = frames - skipFrames;
+        int samples = keepFrames * channels;
+        nsAutoArrayPtr<AudioDataValue> trimBuffer(new AudioDataValue[samples]);
+        for (int i = 0; i < samples; i++)
+          trimBuffer[i] = buffer[skipFrames*channels + i];
+
+        frames = keepFrames;
+        buffer = trimBuffer;
+
+        mSkip -= skipFrames;
+        LOG(PR_LOG_DEBUG, ("Opus decoder skipping %d frames", skipFrames));
+      }
 
-    VorbisPCMValue** pcm = 0;
-    int32_t frames = 0;
-    while ((frames = vorbis_synthesis_pcmout(&mVorbisDsp, &pcm)) > 0) {
-      nsAutoArrayPtr<AudioDataValue> buffer(new AudioDataValue[frames * mChannels]);
-      for (uint32_t j = 0; j < mChannels; ++j) {
-        VorbisPCMValue* channel = pcm[j];
-        for (uint32_t i = 0; i < uint32_t(frames); ++i) {
-          buffer[i*mChannels + j] = MOZ_CONVERT_VORBIS_SAMPLE(channel[i]);
+      int64_t discardPadding = 0;
+      r = nestegg_packet_discard_padding(aPacket, &discardPadding);
+      if (discardPadding > 0) {
+        CheckedInt64 discardFrames = UsecsToFrames(discardPadding * NS_PER_USEC, rate);
+        if (!discardFrames.isValid()) {
+          NS_WARNING("Int overflow in DiscardPadding");
+          return false;
+        }
+        int32_t keepFrames = frames - discardFrames.value();
+        if (keepFrames > 0) {
+          int samples = keepFrames * channels;
+          nsAutoArrayPtr<AudioDataValue> trimBuffer(new AudioDataValue[samples]);
+          for (int i = 0; i < samples; i++)
+            trimBuffer[i] = buffer[i];
+          frames = keepFrames;
+          buffer = trimBuffer;
+        } else {
+          LOG(PR_LOG_DEBUG, ("Opus decoder discarding whole packet"
+                             " ( %d frames) as padding", frames));
+          return true;
         }
       }
 
+      // Apply the header gain if one was specified.
+#ifdef MOZ_SAMPLE_TYPE_FLOAT32
+      if (mOpusParser->mGain != 1.0f) {
+        float gain = mOpusParser->mGain;
+        int samples = frames * channels;
+        for (int i = 0; i < samples; i++) {
+          buffer[i] *= gain;
+        }
+      }
+#else
+      if (mOpusParser->mGain_Q16 != 65536) {
+        int64_t gain_Q16 = mOpusParser->mGain_Q16;
+        int samples = frames * channels;
+        for (int i = 0; i < samples; i++) {
+          int32_t val = static_cast<int32_t>((gain_Q16*buffer[i] + 32768)>>16);
+          buffer[i] = static_cast<AudioDataValue>(MOZ_CLIP_TO_15(val));
+        }
+      }
+#endif
+
+      // More than 2 decoded channels must be downmixed to stereo.
+      if (channels > 2) {
+        // Opus doesn't provide a channel mapping for more than 8 channels,
+        // so we can't downmix more than that.
+        if (channels > 8)
+          return false;
+        OggReader::DownmixToStereo(buffer, channels, frames);
+      }
+
       CheckedInt64 duration = FramesToUsecs(frames, rate);
       if (!duration.isValid()) {
         NS_WARNING("Int overflow converting WebM audio duration");
         return false;
       }
-      CheckedInt64 total_duration = FramesToUsecs(total_frames, rate);
-      if (!total_duration.isValid()) {
-        NS_WARNING("Int overflow converting WebM audio total_duration");
-        return false;
-      }
-      
-      CheckedInt64 time = total_duration + tstamp_usecs;
+
+      CheckedInt64 time = tstamp_usecs;
       if (!time.isValid()) {
         NS_WARNING("Int overflow adding total_duration and tstamp_usecs");
         nestegg_free_packet(aPacket);
         return false;
       };
 
-      total_frames += frames;
-      AudioQueue().Push(new AudioData(aOffset,
+      AudioQueue().Push(new AudioData(mDecoder->GetResource()->Tell(),
                                      time.value(),
                                      duration.value(),
                                      frames,
                                      buffer.forget(),
                                      mChannels));
+
       mAudioFrames += frames;
-      if (vorbis_synthesis_read(&mVorbisDsp, frames) != 0) {
-        return false;
-      }
+#else
+      return false;
+#endif /* MOZ_OPUS */
     }
   }
 
   return true;
 }
 
 nsReturnRef<NesteggPacketHolder> WebMReader::NextPacket(TrackType aTrackType)
 {
--- a/content/media/webm/WebMReader.h
+++ b/content/media/webm/WebMReader.h
@@ -17,16 +17,20 @@
 #include "vpx/vpx_codec.h"
 
 #ifdef MOZ_TREMOR
 #include "tremor/ivorbiscodec.h"
 #else
 #include "vorbis/codec.h"
 #endif
 
+#ifdef MOZ_OPUS
+#include "OpusParser.h"
+#endif
+
 namespace mozilla {
 
 class WebMBufferedState;
 
 // Holds a nestegg_packet, and its file offset. This is needed so we
 // know the offset in the file we've played up to, in order to calculate
 // whether it's likely we can play through to the end without needing
 // to stop to buffer, given the current download rate.
@@ -149,16 +153,21 @@ protected:
 
   // Returns an initialized ogg packet with data obtained from the WebM container.
   ogg_packet InitOggPacket(unsigned char* aData,
                            size_t aLength,
                            bool aBOS,
                            bool aEOS,
                            int64_t aGranulepos);
 
+#ifdef MOZ_OPUS
+  // Setup opus decoder
+  bool InitOpusDecoder();
+#endif
+
   // Decode a nestegg packet of audio data. Push the audio data on the
   // audio queue. Returns true when there's more audio to decode,
   // false if the audio is finished, end of file has been reached,
   // or an un-recoverable read error has occured. The reader's monitor
   // must be held during this call. This function will free the packet
   // so the caller must not use the packet after calling.
   bool DecodeAudioPacket(nestegg_packet* aPacket, int64_t aOffset);
 
@@ -177,42 +186,57 @@ private:
   // Vorbis decoder state
   vorbis_info mVorbisInfo;
   vorbis_comment mVorbisComment;
   vorbis_dsp_state mVorbisDsp;
   vorbis_block mVorbisBlock;
   uint32_t mPacketCount;
   uint32_t mChannels;
 
+
+#ifdef MOZ_OPUS
+  // Opus decoder state
+  nsAutoPtr<OpusParser> mOpusParser;
+  OpusMSDecoder *mOpusDecoder;
+  int mSkip;        // Number of samples left to trim before playback.
+#endif
+
   // Queue of video and audio packets that have been read but not decoded. These
   // must only be accessed from the state machine thread.
   WebMPacketQueue mVideoPackets;
   WebMPacketQueue mAudioPackets;
 
   // Index of video and audio track to play
   uint32_t mVideoTrack;
   uint32_t mAudioTrack;
 
   // Time in microseconds of the start of the first audio frame we've decoded.
   int64_t mAudioStartUsec;
 
   // Number of audio frames we've decoded since decoding began at mAudioStartMs.
   uint64_t mAudioFrames;
 
+  // Number of nanoseconds that must be discarded from the start of the Stream.
+  uint64_t mCodecDelay;
+
   // Parser state and computed offset-time mappings.  Shared by multiple
   // readers when decoder has been cloned.  Main thread only.
   nsRefPtr<WebMBufferedState> mBufferedState;
 
   // Size of the frame initially present in the stream. The picture region
   // is defined as a ratio relative to this.
   nsIntSize mInitialFrame;
 
   // Picture region, as relative to the initial frame size.
   nsIntRect mPicture;
 
   // Booleans to indicate if we have audio and/or video data
   bool mHasVideo;
   bool mHasAudio;
+
+  // Codec ID of audio track
+  int mAudioCodec;
+
 };
 
 } // namespace mozilla
 
 #endif
--- a/dom/apps/src/Webapps.js
+++ b/dom/apps/src/Webapps.js
@@ -338,22 +338,22 @@ WebappsApplication.prototype = {
     this._ondownloadsuccess = null;
     this._ondownloaderror = null;
     this._ondownloadavailable = null;
     this._ondownloadapplied = null;
 
     this._downloadError = null;
 
     this.initDOMRequestHelper(aWindow, [
-      "Webapps:CheckForUpdate:Return:KO",
-      "Webapps:Connect:Return:OK",
-      "Webapps:Connect:Return:KO",
-      "Webapps:FireEvent",
-      "Webapps:GetConnections:Return:OK",
-      "Webapps:UpdateState"
+      { name: "Webapps:CheckForUpdate:Return:KO", weakRef: true },
+      { name: "Webapps:Connect:Return:OK", weakRef: true },
+      { name: "Webapps:Connect:Return:KO", weakRef: true },
+      { name: "Webapps:FireEvent", weakRef: true },
+      { name: "Webapps:GetConnections:Return:OK", weakRef: true },
+      { name: "Webapps:UpdateState", weakRef: true }
     ]);
 
     cpmm.sendAsyncMessage("Webapps:RegisterForMessages", {
       messages: ["Webapps:FireEvent",
                  "Webapps:UpdateState"],
       app: {
         id: this.id,
         manifestURL: this.manifestURL,
@@ -644,24 +644,23 @@ WebappsApplication.prototype = {
                                     flags: Ci.nsIClassInfo.DOM_OBJECT,
                                     classDescription: "Webapps Application"})
 }
 
 /**
   * mozIDOMApplicationMgmt object
   */
 function WebappsApplicationMgmt(aWindow) {
-  this.initDOMRequestHelper(aWindow, [
-    { name: "Webapps:GetAll:Return:OK", strongRef: true },
-    { name: "Webapps:GetAll:Return:KO", strongRef: true },
-    { name: "Webapps:Uninstall:Return:OK", strongRef: true },
-    { name: "Webapps:Uninstall:Broadcast:Return:OK", strongRef: true },
-    { name: "Webapps:Uninstall:Return:KO", strongRef: true },
-    { name: "Webapps:Install:Return:OK", strongRef: true },
-    { name: "Webapps:GetNotInstalled:Return:OK", strongRef: true }]);
+  this.initDOMRequestHelper(aWindow, ["Webapps:GetAll:Return:OK",
+                                      "Webapps:GetAll:Return:KO",
+                                      "Webapps:Uninstall:Return:OK",
+                                      "Webapps:Uninstall:Broadcast:Return:OK",
+                                      "Webapps:Uninstall:Return:KO",
+                                      "Webapps:Install:Return:OK",
+                                      "Webapps:GetNotInstalled:Return:OK"]);
 
   cpmm.sendAsyncMessage("Webapps:RegisterForMessages",
                         {
                           messages: ["Webapps:Install:Return:OK",
                                      "Webapps:Uninstall:Return:OK",
                                      "Webapps:Uninstall:Broadcast:Return:OK"]
                         }
                        );
--- a/dom/base/DOMRequestHelper.jsm
+++ b/dom/base/DOMRequestHelper.jsm
@@ -35,43 +35,42 @@ this.DOMRequestIpcHelper = function DOMR
   // kind of listener that we added (strong or weak). It's an object of this
   // form:
   //  {
   //    "message1": true,
   //    "messagen": false
   //  }
   //
   // where each property is the name of the message and its value is a boolean
-  // that indicates if the listener is strong or not.
+  // that indicates if the listener is weak or not.
   this._listeners = null;
   this._requests = null;
   this._window = null;
 }
 
 DOMRequestIpcHelper.prototype = {
   /**
-   * An object which "inherits" from DOMRequestIpcHelper, declares its own
-   * queryInterface method and adds at least one weak listener to the Message
-   * Manager MUST implement Ci.nsISupportsWeakReference.
+   * An object which "inherits" from DOMRequestIpcHelper and declares its own
+   * queryInterface method MUST implement Ci.nsISupportsWeakReference.
    */
   QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference,
                                          Ci.nsIObserver]),
 
    /**
    *  'aMessages' is expected to be an array of either:
    *  - objects of this form:
    *    {
    *      name: "messageName",
-   *      strongRef: false
+   *      weakRef: false
    *    }
-   *    where 'name' is the message identifier and 'strongRef' a boolean
-   *    indicating if the listener should be a strong referred one or not.
+   *    where 'name' is the message identifier and 'weakRef' a boolean
+   *    indicating if the listener should be a weak referred one or not.
    *
    *  - or only strings containing the message name, in which case the listener
-   *    will be added as a weak reference by default.
+   *    will be added as a strong reference by default.
    */
   addMessageListeners: function(aMessages) {
     if (!aMessages) {
       return;
     }
 
     if (!this._listeners) {
       this._listeners = {};
@@ -81,26 +80,26 @@ DOMRequestIpcHelper.prototype = {
       aMessages = [aMessages];
     }
 
     aMessages.forEach((aMsg) => {
       let name = aMsg.name || aMsg;
       // If the listener is already set and it is of the same type we just
       // bail out. If it is not of the same type, we throw an exception.
       if (this._listeners[name] != undefined) {
-        if (!!aMsg.strongRef == this._listeners[name]) {
+        if (!!aMsg.weakRef == this._listeners[name]) {
           return;
         } else {
           throw Cr.NS_ERROR_FAILURE;
         }
       }
 
-      aMsg.strongRef ? cpmm.addMessageListener(name, this)
-                     : cpmm.addWeakMessageListener(name, this);
-      this._listeners[name] = !!aMsg.strongRef;
+      aMsg.weakRef ? cpmm.addWeakMessageListener(name, this)
+                   : cpmm.addMessageListener(name, this);
+      this._listeners[name] = !!aMsg.weakRef;
     });
   },
 
   /**
    * 'aMessages' is expected to be a string or an array of strings containing
    * the message names of the listeners to be removed.
    */
   removeMessageListeners: function(aMessages) {
@@ -112,38 +111,38 @@ DOMRequestIpcHelper.prototype = {
       aMessages = [aMessages];
     }
 
     aMessages.forEach((aName) => {
       if (this._listeners[aName] == undefined) {
         return;
       }
 
-      this._listeners[aName] ? cpmm.removeMessageListener(aName, this)
-                             : cpmm.removeWeakMessageListener(aName, this);
+      this._listeners[aName] ? cpmm.removeWeakMessageListener(aName, this)
+                             : cpmm.removeMessageListener(aName, this);
       delete this._listeners[aName];
     });
   },
 
   /**
    * Initialize the helper adding the corresponding listeners to the messages
    * provided as the second parameter.
    *
    * 'aMessages' is expected to be an array of either:
    *
    *  - objects of this form:
    *    {
    *      name: 'messageName',
-   *      strongRef: false
+   *      weakRef: false
    *    }
-   *    where 'name' is the message identifier and 'strongRef' a boolean
-   *    indicating if the listener should be a strong referred one or not.
+   *    where 'name' is the message identifier and 'weakRef' a boolean
+   *    indicating if the listener should be a weak referred one or not.
    *
    *  - or only strings containing the message name, in which case the listener
-   *    will be added as a weak referred one by default.
+   *    will be added as a strong referred one by default.
    */
   initDOMRequestHelper: function(aWindow, aMessages) {
     // Query our required interfaces to force a fast fail if they are not
     // provided. These calls will throw if the interface is not available.
     this.QueryInterface(Ci.nsISupportsWeakReference);
     this.QueryInterface(Ci.nsIObserver);
 
     if (aMessages) {
@@ -172,18 +171,18 @@ DOMRequestIpcHelper.prototype = {
     }
 
     this._destroyed = true;
 
     Services.obs.removeObserver(this, "inner-window-destroyed");
 
     if (this._listeners) {
       Object.keys(this._listeners).forEach((aName) => {
-        this._listeners[aName] ? cpmm.removeMessageListener(aName, this)
-                               : cpmm.removeWeakMessageListener(aName, this);
+        this._listeners[aName] ? cpmm.removeWeakMessageListener(aName, this)
+                               : cpmm.removeMessageListener(aName, this);
         delete this._listeners[aName];
       });
     }
 
     this._listeners = null;
     this._requests = null;
 
     // Objects inheriting from DOMRequestIPCHelper may have an uninit function.
--- a/dom/base/test/test_domrequesthelper.xul
+++ b/dom/base/test/test_domrequesthelper.xul
@@ -196,20 +196,20 @@
         ok(true, "== DestroyDOMRequestHelper");
         destroyDOMRequestHelperTest();
         next();
       },
       function() {
         ok(true, "== InitDOMRequestHelper with objects array");
         initDOMRequestHelperTest([{
           name: "name1",
-          strongRef: false
+          weakRef: false
         }, {
           name: "nameN",
-          strongRef: true
+          weakRef: true
         }]);
         checkMessageListeners({"name1": false, "nameN": true}, 2);
         next();
       },
       function() {
         ok(true, "== AddMessageListeners empty array");
         addMessageListenersTest([], {"name1": false, "nameN": true}, 2);
         next();
@@ -238,20 +238,20 @@
           "nameN": true
         }, 5);
         next();
       },
       function() {
         ok(true, "== AddMessageListeners new listeners, objects array");
         addMessageListenersTest([{
           name: "name5",
-          strongRef: true
+          weakRef: true
         }, {
           name: "name6",
-          strongRef: false
+          weakRef: false
         }], {
           "name1": false,
           "name2": false,
           "name3": false,
           "name4": false,
           "name5": true,
           "name6": false,
           "nameN": true
@@ -315,17 +315,17 @@
           next();
         } catch (ex) {
           ok(false, "Unexpected exception " + ex);
         }
       },
       function() {
         ok(true, "== AddMessageListeners, same message, different kind");
         try {
-          addMessageListenersTest({name: "name4", strongRef: true}, {
+          addMessageListenersTest({name: "name4", weakRef: true}, {
             "name4": true,
             "name5": true,
             "name6": false,
             "nameN": true
           }, 4);
           ok(false, "Should have thrown an exception");
         } catch (ex) {
           ok(true, "Expected exception");
@@ -430,41 +430,41 @@
         ok(true, "== Test window destroyed without messages and with GC");
         checkWindowDestruction({ gc: true }, function(uninitCalled) {
           ok(!uninitCalled, "uninit() should NOT have been called");
           next();
         });
       },
       function() {
         ok(true, "== Test window destroyed with weak messages and without GC");
-        checkWindowDestruction({ messages: [{ name: "foo", strongRef: false }],
+        checkWindowDestruction({ messages: [{ name: "foo", weakRef: true }],
                                  gc: false }, function(uninitCalled) {
           ok(uninitCalled, "uninit() should have been called");
           next();
         });
       },
       function() {
         ok(true, "== Test window destroyed with weak messages and with GC");
-        checkWindowDestruction({ messages: [{ name: "foo", strongRef: false }],
+        checkWindowDestruction({ messages: [{ name: "foo", weakRef: true }],
                                  gc: true }, function(uninitCalled) {
           ok(!uninitCalled, "uninit() should NOT have been called");
           next();
         });
       },
       function() {
         ok(true, "== Test window destroyed with strong messages and without GC");
-        checkWindowDestruction({ messages: [{ name: "foo", strongRef: true }],
+        checkWindowDestruction({ messages: [{ name: "foo", weakRef: false }],
                                  gc: false }, function(uninitCalled) {
           ok(uninitCalled, "uninit() should have been called");
           next();
         });
       },
       function() {
         ok(true, "== Test window destroyed with strong messages and with GC");
-        checkWindowDestruction({ messages: [{ name: "foo", strongRef: true }],
+        checkWindowDestruction({ messages: [{ name: "foo", weakRef: false }],
                                  gc: true }, function(uninitCalled) {
           ok(uninitCalled, "uninit() should have been called");
           next();
         });
       }
     ];
 
     function next() {
--- a/dom/browser-element/mochitest/Makefile.in
+++ b/dom/browser-element/mochitest/Makefile.in
@@ -213,17 +213,16 @@ MOCHITEST_FILES += \
 		test_browserElement_oop_AlertInFrame.html \
 		test_browserElement_oop_TargetTop.html \
 		test_browserElement_oop_ForwardName.html \
 		test_browserElement_oop_TargetBlank.html \
 		test_browserElement_oop_PromptCheck.html \
 		test_browserElement_oop_PromptConfirm.html \
 		test_browserElement_oop_CookiesNotThirdParty.html \
 		test_browserElement_oop_Close.html \
-		test_browserElement_oop_CloseApp.html \
 		test_browserElement_oop_OpenWindow.html \
 		test_browserElement_oop_OpenWindowInFrame.html \
 		test_browserElement_oop_OpenWindowRejected.html \
 		test_browserElement_oop_OpenWindowDifferentOrigin.html \
 		test_browserElement_oop_OpenNamed.html \
 		test_browserElement_oop_SecurityChange.html \
 		test_browserElement_oop_BackForward.html \
 		test_browserElement_oop_Reload.html \
@@ -246,9 +245,12 @@ MOCHITEST_FILES += \
 #		test_browserElement_oop_ContextmenuEvents.html \
 
 # Disabled until bug 924771 makes it stop timing out
 # 		test_browserElement_oop_CloseFromOpener.html \
 
 # Disabled until we fix bug 906096.
 #		test_browserElement_oop_SetInputMethodActive.html \
 
+# Disabled until we fix bug 925200
+#		test_browserElement_oop_CloseApp.html \
+
 endif #}
--- a/dom/imptests/Makefile.in
+++ b/dom/imptests/Makefile.in
@@ -1,16 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
 # You can obtain one at http://mozilla.org/MPL/2.0/.
 
-include $(topsrcdir)/config/rules.mk
-
-_SUPPORT_FILES = \
+SUPPORT_FILES = \
   testharness.js \
   testharnessreport.js \
   testharness.css \
   idlharness.js \
   WebIDLParser.js \
   $(NULL)
 
-libs:: $(_SUPPORT_FILES)
-	$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/resources
+SUPPORT_DEST = $(DEPTH)/_tests/testing/mochitest/resources
+INSTALL_TARGETS += SUPPORT
deleted file mode 100644
--- a/editor/libeditor/html/tests/Makefile.in
+++ /dev/null
@@ -1,20 +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/.
-
-_DATA_FILES = \
-		data/cfhtml-chromium.txt \
-		data/cfhtml-firefox.txt \
-		data/cfhtml-ie.txt \
-		data/cfhtml-ooo.txt \
-		data/cfhtml-nocontext.txt \
-		$(NULL)
-
-include $(topsrcdir)/config/rules.mk
-
-libs::
-	(cd $(srcdir) && tar $(TAR_CREATE_FLAGS) - browserscope 2> /dev/null) | (cd $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir) && tar -xf -)
-
-libs:: $(_DATA_FILES)
-	$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)/data
--- a/editor/libeditor/html/tests/mochitest.ini
+++ b/editor/libeditor/html/tests/mochitest.ini
@@ -1,10 +1,68 @@
 [DEFAULT]
 support-files =
+  browserscope/test_richtext2.html
+  browserscope/test_richtext.html
+  browserscope/lib/richtext2/current_revision
+  browserscope/lib/richtext2/richtext2/common.py
+  browserscope/lib/richtext2/richtext2/unittestexample.html
+  browserscope/lib/richtext2/richtext2/static/editable-dM.html
+  browserscope/lib/richtext2/richtext2/static/editable.css
+  browserscope/lib/richtext2/richtext2/static/editable-body.html
+  browserscope/lib/richtext2/richtext2/static/editable-div.html
+  browserscope/lib/richtext2/richtext2/static/js/variables.js
+  browserscope/lib/richtext2/richtext2/static/js/range-bootstrap.js
+  browserscope/lib/richtext2/richtext2/static/js/range.js
+  browserscope/lib/richtext2/richtext2/static/js/output.js
+  browserscope/lib/richtext2/richtext2/static/js/compare.js
+  browserscope/lib/richtext2/richtext2/static/js/canonicalize.js
+  browserscope/lib/richtext2/richtext2/static/js/pad.js
+  browserscope/lib/richtext2/richtext2/static/js/run.js
+  browserscope/lib/richtext2/richtext2/static/js/units.js
+  browserscope/lib/richtext2/richtext2/static/common.css
+  browserscope/lib/richtext2/richtext2/__init__.py
+  browserscope/lib/richtext2/richtext2/handlers.py
+  browserscope/lib/richtext2/richtext2/templates/output.html
+  browserscope/lib/richtext2/richtext2/templates/richtext2.html
+  browserscope/lib/richtext2/richtext2/tests/forwarddelete.py
+  browserscope/lib/richtext2/richtext2/tests/selection.py
+  browserscope/lib/richtext2/richtext2/tests/queryIndeterm.py
+  browserscope/lib/richtext2/richtext2/tests/unapplyCSS.py
+  browserscope/lib/richtext2/richtext2/tests/apply.py
+  browserscope/lib/richtext2/richtext2/tests/unapply.py
+  browserscope/lib/richtext2/richtext2/tests/change.py
+  browserscope/lib/richtext2/richtext2/tests/queryState.py
+  browserscope/lib/richtext2/richtext2/tests/queryValue.py
+  browserscope/lib/richtext2/richtext2/tests/__init__.py
+  browserscope/lib/richtext2/richtext2/tests/insert.py
+  browserscope/lib/richtext2/richtext2/tests/queryEnabled.py
+  browserscope/lib/richtext2/richtext2/tests/applyCSS.py
+  browserscope/lib/richtext2/richtext2/tests/changeCSS.py
+  browserscope/lib/richtext2/richtext2/tests/delete.py
+  browserscope/lib/richtext2/richtext2/tests/querySupported.py
+  browserscope/lib/richtext2/README
+  browserscope/lib/richtext2/update_from_upstream
+  browserscope/lib/richtext2/LICENSE
+  browserscope/lib/richtext2/README.Mozilla
+  browserscope/lib/richtext2/currentStatus.js
+  browserscope/lib/richtext/current_revision
+  browserscope/lib/richtext/README
+  browserscope/lib/richtext/update_from_upstream
+  browserscope/lib/richtext/LICENSE
+  browserscope/lib/richtext/README.Mozilla
+  browserscope/lib/richtext/richtext/editable.html
+  browserscope/lib/richtext/richtext/richtext.html
+  browserscope/lib/richtext/richtext/js/range.js
+  browserscope/lib/richtext/currentStatus.js
+  data/cfhtml-chromium.txt
+  data/cfhtml-firefox.txt
+  data/cfhtml-ie.txt
+  data/cfhtml-ooo.txt
+  data/cfhtml-nocontext.txt
   file_bug549262.html
   file_bug674770-1.html
   file_select_all_without_body.html
   green.png
 
 [test_CF_HTML_clipboard.html]
 [test_bug200416.html]
 [test_bug290026.html]
--- a/gfx/angle/Makefile.in
+++ b/gfx/angle/Makefile.in
@@ -17,17 +17,17 @@ VPATH += $(srcdir)/src/third_party/murmu
 
 # Target: 'translator_glsl'
 #   Requires: 'translator_common'
 # src/compiler:
 ifdef MOZ_ANGLE_RENDERER
 
 libs::
 ifdef MOZ_D3DCOMPILER_CAB
-	expand "$(MOZ_D3DCOMPILER_CAB)" -F:$(MOZ_D3DCOMPILER_DLL) "$(DIST)/bin"
+	expand '$(MOZ_D3DCOMPILER_CAB)' -F:$(MOZ_D3DCOMPILER_DLL) '$(DIST)/bin'
 endif
 
 endif
 
 include $(topsrcdir)/config/rules.mk
 
 # We have to filter out -pedantic, because of
 # comma-at-end-of-enumerator list failures.  We can try to get this fixed
--- a/gfx/angle/src/libEGL/Makefile.in
+++ b/gfx/angle/src/libEGL/Makefile.in
@@ -23,24 +23,24 @@ OS_COMPILE_CXXFLAGS = $(OS_CPPFLAGS)
 VPATH += $(srcdir)/../common
 # src/libEGL:
 VPATH += $(srcdir)/../libEGL
 DEFFILE = $(srcdir)/libEGL.def
 RCFILE  = $(srcdir)/libEGL.rc
 
 include $(topsrcdir)/config/rules.mk
 
-CXXFLAGS += -I"$(MOZ_DIRECTX_SDK_PATH)/include"
+CXXFLAGS += -I'$(MOZ_DIRECTX_SDK_PATH)/include'
 
 #OS_LIBS += $(call EXPAND_LIBNAME,dwmapi)
 
 ifdef GNU_CC
 
 OS_CXXFLAGS := $(filter-out -fno-exceptions,$(OS_CXXFLAGS)) -fexceptions
 OS_LIBS += -ld3d9 -llibGLESv2
 
 else
 
-EXTRA_DSO_LDOPTS = "$(MOZ_DIRECTX_SDK_PATH)/lib/$(MOZ_DIRECTX_SDK_CPU_SUFFIX)/d3d9.lib" \
-                   "$(DIST)/lib/libGLESv2.lib" \
+EXTRA_DSO_LDOPTS = '$(MOZ_DIRECTX_SDK_PATH)/lib/$(MOZ_DIRECTX_SDK_CPU_SUFFIX)/d3d9.lib' \
+                   '$(DIST)/lib/libGLESv2.lib' \
                    delayimp.lib
 
 endif
--- a/gfx/angle/src/libGLESv2/Makefile.in
+++ b/gfx/angle/src/libGLESv2/Makefile.in
@@ -39,24 +39,24 @@ VPATH += $(srcdir)/../common
 # src/common:
 DEFFILE = $(srcdir)/libGLESv2.def
 RCFILE  = $(srcdir)/libGLESv2.rc
 
 # End build_angle.gypi transcription.
 
 include $(topsrcdir)/config/rules.mk
 
-CXXFLAGS += -I"$(MOZ_DIRECTX_SDK_PATH)/include"
+CXXFLAGS += -I'$(MOZ_DIRECTX_SDK_PATH)/include'
 
 ifdef GNU_CC
 
 TextureSSE2.$(OBJ_SUFFIX): CXXFLAGS+=-msse2
 
 OS_CXXFLAGS := $(filter-out -fno-exceptions,$(OS_CXXFLAGS)) -fexceptions
 OS_LIBS += -ld3d9 -ldxguid
 
 else
 
-EXTRA_DSO_LDOPTS = "$(MOZ_DIRECTX_SDK_PATH)/lib/$(MOZ_DIRECTX_SDK_CPU_SUFFIX)/d3d9.lib" \
-                   "$(MOZ_DIRECTX_SDK_PATH)/lib/$(MOZ_DIRECTX_SDK_CPU_SUFFIX)/dxguid.lib" \
+EXTRA_DSO_LDOPTS = '$(MOZ_DIRECTX_SDK_PATH)/lib/$(MOZ_DIRECTX_SDK_CPU_SUFFIX)/d3d9.lib' \
+                   '$(MOZ_DIRECTX_SDK_PATH)/lib/$(MOZ_DIRECTX_SDK_CPU_SUFFIX)/dxguid.lib' \
                    delayimp.lib
 
 endif
--- a/gfx/layers/ipc/SharedRGBImage.cpp
+++ b/gfx/layers/ipc/SharedRGBImage.cpp
@@ -4,16 +4,17 @@
 
 #include "SharedRGBImage.h"
 #include "ImageTypes.h"                 // for ImageFormat::SHARED_RGB, etc
 #include "Shmem.h"                      // for Shmem
 #include "gfx2DGlue.h"                  // for ImageFormatToSurfaceFormat, etc
 #include "gfxPlatform.h"                // for gfxPlatform, gfxImageFormat
 #include "mozilla/layers/ISurfaceAllocator.h"  // for ISurfaceAllocator, etc
 #include "mozilla/layers/ImageClient.h"  // for ImageClient
+#include "mozilla/layers/ImageDataSerializer.h"  // for ImageDataSerializer
 #include "mozilla/layers/LayersSurfaces.h"  // for SurfaceDescriptor, etc
 #include "mozilla/layers/TextureClient.h"  // for BufferTextureClient, etc
 #include "mozilla/layers/ImageBridgeChild.h"  // for ImageBridgeChild
 #include "mozilla/mozalloc.h"           // for operator delete, etc
 #include "nsAutoPtr.h"                  // for nsRefPtr
 #include "nsDebug.h"                    // for NS_WARNING, NS_ASSERTION
 #include "nsISupportsImpl.h"            // for Image::AddRef, etc
 #include "nsRect.h"                     // for nsIntRect
@@ -198,18 +199,22 @@ SharedRGBImage::Allocate(gfx::IntSize aS
   mSize = aSize;
   mTextureClient = mCompositable->CreateBufferTextureClient(aFormat);
   return mTextureClient->AllocateForSurface(aSize);
 }
 
 uint8_t*
 SharedRGBImage::GetBuffer()
 {
-  return mTextureClient ? mTextureClient->GetBuffer()
-                        : nullptr;
+  if (!mTextureClient) {
+    return nullptr;
+  }
+
+  ImageDataSerializer serializer(mTextureClient->GetBuffer());
+  return serializer.GetData();
 }
 
 gfxIntSize
 SharedRGBImage::GetSize()
 {
   return ThebesIntSize(mSize);
 }
 
--- a/gfx/thebes/gfxFont.h
+++ b/gfx/thebes/gfxFont.h
@@ -24,16 +24,17 @@
 #include "gfxFontFeatures.h"
 #include "mozilla/MemoryReporting.h"
 #include "mozilla/Attributes.h"
 #include <algorithm>
 #include "DrawMode.h"
 #include "nsUnicodeScriptCodes.h"
 #include "nsDataHashtable.h"
 #include "harfbuzz/hb.h"
+#include "mozilla/gfx/2D.h"
 
 typedef struct _cairo_scaled_font cairo_scaled_font_t;
 typedef struct gr_face            gr_face;
 
 #ifdef DEBUG
 #include <stdio.h>
 #endif
 
--- a/ipc/app/Makefile.in
+++ b/ipc/app/Makefile.in
@@ -77,16 +77,16 @@ ifndef GNU_CC #{
 LDFLAGS += /HEAP:0x40000
 endif #}
 endif #}
 
 ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) #{
 
 libs::
 	$(NSINSTALL) -D $(DIST)/bin/$(PROGRAM).app
-	rsync -a -C --exclude "*.in" $(srcdir)/macbuild/Contents $(DIST)/bin/$(PROGRAM).app 
-	sed -e "s/%PROGRAM%/$(PROGRAM)/" $(srcdir)/macbuild/Contents/Info.plist.in > $(DIST)/bin/$(PROGRAM).app/Contents/Info.plist
-	sed -e "s/%APP_NAME%/$(MOZ_APP_DISPLAYNAME)/" $(srcdir)/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | \
+	rsync -a -C --exclude '*.in' $(srcdir)/macbuild/Contents $(DIST)/bin/$(PROGRAM).app 
+	sed -e 's/%PROGRAM%/$(PROGRAM)/' $(srcdir)/macbuild/Contents/Info.plist.in > $(DIST)/bin/$(PROGRAM).app/Contents/Info.plist
+	sed -e 's/%APP_NAME%/$(MOZ_APP_DISPLAYNAME)/' $(srcdir)/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | \
 	  iconv -f UTF-8 -t UTF-16 > $(DIST)/bin/$(PROGRAM).app/Contents/Resources/English.lproj/InfoPlist.strings
 	$(NSINSTALL) -D $(DIST)/bin/$(PROGRAM).app/Contents/MacOS
 	$(NSINSTALL) $(PROGRAM) $(DIST)/bin/$(PROGRAM).app/Contents/MacOS
 	$(RM) $(DIST)/bin/$(PROGRAM)
 endif #}
--- a/ipc/chromium/Makefile.in
+++ b/ipc/chromium/Makefile.in
@@ -65,11 +65,11 @@ include $(topsrcdir)/config/rules.mk
 
 ifdef MOZ_NATIVE_LIBEVENT # {
 
 export-preqs = \
   $(call mkdir_deps,$(DIST)/third_party/libevent) \
   $(NULL)
 
 export:: $(export-preqs)
-	echo "#include <event.h>" > $(DIST)/third_party/libevent/event.h
+	echo '#include <event.h>' > $(DIST)/third_party/libevent/event.h
 
 endif # }
--- a/js/public/Anchor.h
+++ b/js/public/Anchor.h
@@ -88,24 +88,41 @@ template<> class AnchorPermitted<JSScrip
 
 template<typename T>
 class Anchor : AnchorPermitted<T>
 {
   public:
     Anchor() { }
     explicit Anchor(T t) { hold = t; }
     inline ~Anchor();
-    T &get() { return hold; }
-    const T &get() const { return hold; }
-    void set(const T &t) { hold = t; }
-    void operator=(const T &t) { hold = t; }
-    void clear() { hold = 0; }
 
   private:
     T hold;
+
+    /*
+     * Rooting analysis considers use of operator= to be a use of an anchor.
+     * For simplicity, Anchor is treated as if it contained a GC thing, from
+     * construction. Thus if we had
+     *
+     *   void operator=(const T &t) { hold = t; }
+     *
+     * and this code
+     *
+     *   JS::Anchor<JSString*> anchor;
+     *   stuff that could GC, producing |str|;
+     *   anchor = str;
+     *
+     * the last line would be seen as a hazard, because the final = would "use"
+     * |anchor| that is a GC thing -- which could have been moved around by the
+     * GC. The workaround is to structure your code so that JS::Anchor is
+     * always constructed, living for however long the corresponding value must
+     * live.
+     */
+    void operator=(const T &t) MOZ_DELETE;
+
     Anchor(const Anchor &other) MOZ_DELETE;
     void operator=(const Anchor &other) MOZ_DELETE;
 };
 
 template<typename T>
 inline Anchor<T>::~Anchor()
 {
 #ifdef __GNUC__
--- a/js/public/Value.h
+++ b/js/public/Value.h
@@ -949,20 +949,16 @@ class Value
         return data.asDouble;
     }
 
     void setString(JSString *str) {
         MOZ_ASSERT(!IsPoisonedPtr(str));
         data = STRING_TO_JSVAL_IMPL(str);
     }
 
-    void setString(const JS::Anchor<JSString *> &str) {
-        setString(str.get());
-    }
-
     void setObject(JSObject &obj) {
         MOZ_ASSERT(!IsPoisonedPtr(&obj));
         data = OBJECT_TO_JSVAL_IMPL(&obj);
     }
 
     void setBoolean(bool b) {
         data = BOOLEAN_TO_JSVAL_IMPL(b);
     }
@@ -1587,17 +1583,16 @@ class MutableValueOperations : public Va
     void setInt32(int32_t i) { value()->setInt32(i); }
     void setDouble(double d) { value()->setDouble(d); }
     void setNaN() { setDouble(JS::GenericNaN()); }
     void setBoolean(bool b) { value()->setBoolean(b); }
     void setMagic(JSWhyMagic why) { value()->setMagic(why); }
     bool setNumber(uint32_t ui) { return value()->setNumber(ui); }
     bool setNumber(double d) { return value()->setNumber(d); }
     void setString(JSString *str) { this->value()->setString(str); }
-    void setString(const JS::Anchor<JSString *> &str) { this->value()->setString(str); }
     void setObject(JSObject &obj) { this->value()->setObject(obj); }
     void setObjectOrNull(JSObject *arg) { this->value()->setObjectOrNull(arg); }
 };
 
 /*
  * Augment the generic Heap<T> interface when T = Value with
  * type-querying, value-extracting, and mutating operations.
  */
@@ -1618,17 +1613,16 @@ class HeapBase<JS::Value> : public Value
     void setNull() { setBarriered(JS::NullValue()); }
     void setUndefined() { setBarriered(JS::UndefinedValue()); }
     void setInt32(int32_t i) { setBarriered(JS::Int32Value(i)); }
     void setDouble(double d) { setBarriered(JS::DoubleValue(d)); }
     void setNaN() { setDouble(JS::GenericNaN()); }
     void setBoolean(bool b) { setBarriered(JS::BooleanValue(b)); }
     void setMagic(JSWhyMagic why) { setBarriered(JS::MagicValue(why)); }
     void setString(JSString *str) { setBarriered(JS::StringValue(str)); }
-    void setString(const JS::Anchor<JSString *> &str) { setBarriered(JS::StringValue(str.get())); }
     void setObject(JSObject &obj) { setBarriered(JS::ObjectValue(obj)); }
 
     bool setNumber(uint32_t ui) {
         if (ui > JSVAL_INT_MAX) {
             setDouble((double)ui);
             return false;
         } else {
             setInt32((int32_t)ui);
--- a/js/src/Makefile.in
+++ b/js/src/Makefile.in
@@ -11,17 +11,17 @@ endif
 make_min_ver := 3.81
 ifneq ($(make_min_ver),$(firstword $(sort $(make_min_ver) $(MAKE_VERSION))))
 $(error GNU Make $(make_min_ver) or higher is required)
 endif
 endif
 
 TOPLEVEL_BUILD := 1
 
-run_for_side_effects := $(shell echo "MAKE: $(MAKE)")
+run_for_side_effects := $(shell echo 'MAKE: $(MAKE)')
 STATIC_LIBRARY_NAME = js_static
 LIBS		= $(NSPR_LIBS)
 
 DIST_INSTALL = 1
 
 VPATH		+= \
 		$(srcdir) \
 		$(srcdir)/builtin \
@@ -136,17 +136,17 @@ USE_HOST_CXX = 1
 ifdef HAVE_DTRACE
 ifneq ($(OS_ARCH),Darwin)
 DTRACE_PROBE_OBJ = $(LIBRARY_NAME)-dtrace.$(OBJ_SUFFIX)
 endif
 MOZILLA_DTRACE_SRC = $(srcdir)/devtools/javascript-trace.d
 endif
 
 backend.RecursiveMakeBackend:
-	@echo "Build configuration changed. Regenerating backend."
+	@echo 'Build configuration changed. Regenerating backend.'
 	$(PYTHON) config.status
 
 Makefile: backend.RecursiveMakeBackend
 	@$(TOUCH) $@
 
 include backend.RecursiveMakeBackend.pp
 
 default:: backend.RecursiveMakeBackend
@@ -167,17 +167,17 @@ endif
 
 # Ensure symbol versions of shared library on Linux do not conflict
 # with those in libxul.
 ifeq (Linux,$(OS_TARGET))
 EXTRA_DSO_LDOPTS += -Wl,-version-script,symverscript
 
 symverscript: symverscript.in
 	$(call py_action,preprocessor, \
-		-DVERSION="$(subst -,_,$(LIBRARY_NAME))" $< -o $@)
+		-DVERSION='$(subst -,_,$(LIBRARY_NAME))' $< -o $@)
 
 EXTRA_DEPS += symverscript
 endif
 
 export_files = js-config.h
 ifdef HAVE_DTRACE
 export_files += $(CURDIR)/javascript-trace.h
 endif
@@ -314,17 +314,17 @@ check-jit-test::
 check:: check-style check-jit-test
 
 # jstests doesn't have a --jitflags option, so we need to loop, updating the
 # exit code (RC) after each invocation.
 # FIXME: MethodJIT doesn't work for 1 test case (bug 644393), so
 # --no-extensions is set to skip that test. Remove as soon as possible.
 check-jstests:
 	RC=0; \
-	for f in `echo "$(JITFLAGS)" | tr ',' '\n'`; \
+	for f in `echo '$(JITFLAGS)' | tr ',' '\n'`; \
 		do \
 			$(wildcard $(RUN_TEST_PROGRAM)) $(PYTHON) -u $(srcdir)/tests/jstests.py \
 				--tinderbox --no-progress \
 				--no-extensions \
 				--timeout 300 \
 				--args="`echo $$f | sed 's/\(.\)/ -\1/g'`" \
 				$(DIST)/bin/$(JS_SHELL_NAME)$(BIN_SUFFIX); \
 			RC=$$(( $$RC || $$?)); \
@@ -473,30 +473,30 @@ endif
 # All this information needs to go into the js-config script.  To
 # avoid trying to re-compute all that in the configure script, we just
 # have the configure script generate this Makefile, and then invoke
 # this rule.
 
 # Set the various definitions that will be substituted for js-config
 # and for the pck-config .pc file.
 JS_CONFIG_SUBSTITUTIONS=\
-	-Dprefix="$(prefix)" \
-	-Dexec_prefix="$(exec_prefix)" \
-	-Dincludedir="$(includedir)" \
-	-Dlibdir="$(libdir)" \
-	-DMOZILLA_VERSION="$(MOZILLA_VERSION)" \
-	-DLIBRARY_NAME="$(LIBRARY_NAME)" \
-	-DJS_CONFIG_LIBS="$(JS_CONFIG_LIBS)" \
-	-DJS_CONFIG_MOZ_JS_LIBS="$(JS_CONFIG_MOZ_JS_LIBS)" \
-	-DMOZJS_MAJOR_VERSION="$(MOZJS_MAJOR_VERSION)" \
-	-DMOZJS_MINOR_VERSION="$(MOZJS_MINOR_VERSION)" \
-	-DMOZJS_PATCH_VERSION="$(MOZJS_PATCH_VERSION)" \
-	-DMOZJS_ALPHA="$(MOZJS_ALPHA)" \
-	-DNSPR_CFLAGS="$(NSPR_CFLAGS)" \
-	-DNSPR_PKGCONF_CHECK="$(NSPR_PKGCONF_CHECK)" \
+	-Dprefix='$(prefix)' \
+	-Dexec_prefix='$(exec_prefix)' \
+	-Dincludedir='$(includedir)' \
+	-Dlibdir='$(libdir)' \
+	-DMOZILLA_VERSION='$(MOZILLA_VERSION)' \
+	-DLIBRARY_NAME='$(LIBRARY_NAME)' \
+	-DJS_CONFIG_LIBS='$(JS_CONFIG_LIBS)' \
+	-DJS_CONFIG_MOZ_JS_LIBS='$(JS_CONFIG_MOZ_JS_LIBS)' \
+	-DMOZJS_MAJOR_VERSION='$(MOZJS_MAJOR_VERSION)' \
+	-DMOZJS_MINOR_VERSION='$(MOZJS_MINOR_VERSION)' \
+	-DMOZJS_PATCH_VERSION='$(MOZJS_PATCH_VERSION)' \
+	-DMOZJS_ALPHA='$(MOZJS_ALPHA)' \
+	-DNSPR_CFLAGS='$(NSPR_CFLAGS)' \
+	-DNSPR_PKGCONF_CHECK='$(NSPR_PKGCONF_CHECK)' \
 	$(NULL)
 
 $(JS_CONFIG_NAME): js-config.in Makefile $(DEPTH)/config/autoconf.mk $(topsrcdir)/config/config.mk $(topsrcdir)/config/rules.mk
 	$(RM) $@.tmp
 	$(call py_action,preprocessor,--marker % $(JS_CONFIG_SUBSTITUTIONS) $< -o $@.tmp)
 	mv $@.tmp $@ && chmod +x $@
 
 SCRIPTS = $(JS_CONFIG_NAME)
@@ -568,17 +568,17 @@ endif
 # Force auto-header generation before compiling any source that may use them
 $(OBJS): $(CURDIR)/jsautokw.h $(CURDIR)/jsautooplen.h
 
 ifdef MOZ_ETW
 ETWProvider.h ETWProvider.rc ETWProvider.mof: ETWProvider.man
 	$(MC) -um -mof $^
 
 ETWProvider.res: ETWProvider.rc
-	$(RC) -r -i "$(SDKDIR)Include" $^
+	$(RC) -r -i '$(SDKDIR)Include' $^
 
 export:: ETWProvider.res
 
 install:: ETWProvider.mof ETWProvider.man
 	$(SYSINSTALL) $^ $(DESTDIR)$(bindir)
 
 endif
 
--- a/js/src/config/config.mk
+++ b/js/src/config/config.mk
@@ -806,17 +806,17 @@ MERGE_FILE = $(firstword \
   $(wildcard $(LOCALE_SRCDIR)/$(1)) \
   $(srcdir)/en-US/$(1) )
 else
 MERGE_FILE = $(LOCALE_SRCDIR)/$(1)
 endif
 MERGE_FILES = $(foreach f,$(1),$(call MERGE_FILE,$(f)))
 
 ifeq (OS2,$(OS_ARCH))
-RUN_TEST_PROGRAM = $(topsrcdir)/build/os2/test_os2.cmd "$(LIBXUL_DIST)"
+RUN_TEST_PROGRAM = $(topsrcdir)/build/os2/test_os2.cmd '$(LIBXUL_DIST)'
 else
 ifneq (WINNT,$(OS_ARCH))
 RUN_TEST_PROGRAM = $(LIBXUL_DIST)/bin/run-mozilla.sh
 endif # ! WINNT
 endif # ! OS2
 
 #
 # Java macros
@@ -843,17 +843,17 @@ EXPAND_LD = $(EXPAND_LIBS_EXEC) --uselis
 EXPAND_MKSHLIB_ARGS = --uselist
 ifdef SYMBOL_ORDER
 EXPAND_MKSHLIB_ARGS += --symbol-order $(SYMBOL_ORDER)
 endif
 EXPAND_MKSHLIB = $(EXPAND_LIBS_EXEC) $(EXPAND_MKSHLIB_ARGS) -- $(MKSHLIB)
 
 ifneq (,$(MOZ_LIBSTDCXX_TARGET_VERSION)$(MOZ_LIBSTDCXX_HOST_VERSION))
 ifneq ($(OS_ARCH),Darwin)
-CHECK_STDCXX = objdump -p $(1) | grep -e 'GLIBCXX_3\.4\.\(9\|[1-9][0-9]\)' > /dev/null && echo "TEST-UNEXPECTED-FAIL | | We don't want these libstdc++ symbols to be used:" && objdump -T $(1) | grep -e 'GLIBCXX_3\.4\.\(9\|[1-9][0-9]\)' && exit 1 || exit 0
+CHECK_STDCXX = objdump -p $(1) | grep -e 'GLIBCXX_3\.4\.\(9\|[1-9][0-9]\)' > /dev/null && echo 'TEST-UNEXPECTED-FAIL | | We do not want these libstdc++ symbols to be used:' && objdump -T $(1) | grep -e 'GLIBCXX_3\.4\.\(9\|[1-9][0-9]\)' && exit 1 || exit 0
 endif
 
 ifdef MOZ_LIBSTDCXX_TARGET_VERSION
 EXTRA_LIBS += $(call EXPAND_LIBNAME_PATH,stdc++compat,$(DEPTH)/build/unix/stdc++compat)
 endif
 ifdef MOZ_LIBSTDCXX_HOST_VERSION
 HOST_EXTRA_LIBS += $(call EXPAND_LIBNAME_PATH,host_stdc++compat,$(DEPTH)/build/unix/stdc++compat)
 endif
--- a/js/src/config/makefiles/autotargets.mk
+++ b/js/src/config/makefiles/autotargets.mk
@@ -51,28 +51,28 @@ mkdir_stem =$(foreach val,$(getargv),$(s
 ## Generate timestamp file for threadsafe directory creation
 mkdir_deps =$(foreach dir,$(getargv),$(call slash_strip,$(dir)/.mkdir.done))
 
 #######################
 ##---]  TARGETS  [---##
 #######################
 
 %/.mkdir.done: # mkdir -p -p => mkdir -p
-	$(subst $(space)-p,$(null),$(MKDIR)) -p "$(dir $@)"
+	$(subst $(space)-p,$(null),$(MKDIR)) -p '$(dir $@)'
 # Make the timestamp old enough for not being a problem with symbolic links
 # targets depending on it. Use Jan 3, 1980 to accomodate any timezone where
 # 198001010000 would translate to something older than FAT epoch.
-	@$(TOUCH) -t 198001030000 "$@"
+	@$(TOUCH) -t 198001030000 '$@'
 
 # A handful of makefiles are attempting "mkdir dot".
 # tbpl/valgrind builds are using this target
 # https://bugzilla.mozilla.org/show_bug.cgi?id=837754
 .mkdir.done:
-	@echo "WARNING: $(MKDIR) -dot- requested by $(MAKE) -C $(CURDIR) $(MAKECMDGOALS)"
-	@$(TOUCH) -t 198001030000 "$@"
+	@echo 'WARNING: $(MKDIR) -dot- requested by $(MAKE) -C $(CURDIR) $(MAKECMDGOALS)'
+	@$(TOUCH) -t 198001030000 '$@'
 
 INCLUDED_AUTOTARGETS_MK = 1
 endif #}
 
 
 ## Accumulate deps and cleanup
 ifneq (,$(GENERATED_DIRS))
   GENERATED_DIRS := $(strip $(sort $(GENERATED_DIRS)))
--- a/js/src/config/makefiles/target_binaries.mk
+++ b/js/src/config/makefiles/target_binaries.mk
@@ -20,18 +20,18 @@ endif # EXPORT_LIBRARY
 
 binaries libs:: $(SUBMAKEFILES) $(TARGETS)
 ifndef NO_DIST_INSTALL
 ifdef SHARED_LIBRARY
 ifdef IS_COMPONENT
 	$(INSTALL) $(IFLAGS2) $(SHARED_LIBRARY) $(FINAL_TARGET)/components
 	$(ELF_DYNSTR_GC) $(FINAL_TARGET)/components/$(SHARED_LIBRARY)
 ifndef NO_COMPONENTS_MANIFEST
-	$(call py_action,buildlist,$(FINAL_TARGET)/chrome.manifest "manifest components/components.manifest")
-	$(call py_action,buildlist,$(FINAL_TARGET)/components/components.manifest "binary-component $(SHARED_LIBRARY)")
+	$(call py_action,buildlist,$(FINAL_TARGET)/chrome.manifest 'manifest components/components.manifest')
+	$(call py_action,buildlist,$(FINAL_TARGET)/components/components.manifest 'binary-component $(SHARED_LIBRARY)')
 endif
 endif # IS_COMPONENT
 endif # SHARED_LIBRARY
 endif # !NO_DIST_INSTALL
 
 ifndef NO_DIST_INSTALL
 
 ifneq (,$(strip $(PROGRAM)$(SIMPLE_PROGRAMS)))
@@ -104,20 +104,20 @@ endif # !NO_DIST_INSTALL
 ifdef MOZ_PSEUDO_DERECURSE
 BINARIES_INSTALL_TARGETS := $(foreach category,$(INSTALL_TARGETS),$(if $(filter binaries,$($(category)_TARGET)),$(category)))
 
 # Fill a dependency file with all the binaries installed somewhere in $(DIST)
 # and with dependencies on the relevant backend files.
 BINARIES_PP := $(MDDEPDIR)/binaries.pp
 
 $(BINARIES_PP): Makefile $(wildcard backend.mk) $(call mkdir_deps,$(MDDEPDIR))
-	@echo "$(strip $(foreach category,$(BINARIES_INSTALL_TARGETS),\
+	@echo '$(strip $(foreach category,$(BINARIES_INSTALL_TARGETS),\
 		$(foreach file,$($(category)_FILES) $($(category)_EXECUTABLES),\
 			$($(category)_DEST)/$(notdir $(file)): $(file)%\
 		)\
-	))binaries: Makefile $(wildcard backend.mk)" | tr % '\n' > $@
+	))binaries: Makefile $(wildcard backend.mk)' | tr % '\n' > $@
 
 else
 binaries::
 	$(error The binaries target is not supported without MOZ_PSEUDO_DERECURSE)
 endif
 
 # EOF
--- a/js/src/config/recurse.mk
+++ b/js/src/config/recurse.mk
@@ -124,17 +124,17 @@ ifneq (,$(filter libs binaries,$(CURRENT
 # A few things that are not traversed by a "binaries" build, but should, in an ideal
 # world, are nspr, nss, icu and ffi.
 recurse_$(CURRENT_TIER):
 	@$(MAKE) binaries-deps
 
 # Creating binaries-deps.mk directly would make us build it twice: once when beginning
 # the build because of the include, and once at the end because of the stamps.
 binaries-deps: $(addsuffix /binaries,$(CURRENT_DIRS))
-	@$(call py_action,link_deps,-o $@.mk --group-by-depfile --topsrcdir $(topsrcdir) --topobjdir $(DEPTH) --dist $(DIST) --guard $(addprefix ",$(addsuffix ",$^)))
+	@$(call py_action,link_deps,-o $@.mk --group-by-depfile --topsrcdir $(topsrcdir) --topobjdir $(DEPTH) --dist $(DIST) --guard $(addprefix ',$(addsuffix ',$^)))
 	@$(TOUCH) $@
 
 ifeq (recurse_binaries,$(MAKECMDGOALS))
 $(call include_deps,binaries-deps.mk)
 endif
 
 endif
 
--- a/js/src/config/rules.mk
+++ b/js/src/config/rules.mk
@@ -124,25 +124,25 @@ libs:: $(CPP_UNIT_TEST_BINS) $(call mkdi
 	$(NSINSTALL) $(CPP_UNIT_TEST_BINS) $(DIST)/cppunittests
 endif
 
 check::
 	@$(PYTHON) $(topsrcdir)/testing/runcppunittests.py --xre-path=$(DIST)/bin --symbols-path=$(DIST)/crashreporter-symbols $(subst .cpp,$(BIN_SUFFIX),$(CPP_UNIT_TESTS))
 
 cppunittests-remote: DM_TRANS?=adb
 cppunittests-remote:
-	@if [ "${TEST_DEVICE}" != "" -o "$(DM_TRANS)" = "adb" ]; then \
+	@if [ '${TEST_DEVICE}' != '' -o '$(DM_TRANS)' = 'adb' ]; then \
 		$(PYTHON) -u $(topsrcdir)/testing/remotecppunittests.py \
 			--xre-path=$(DEPTH)/dist/bin \
 			--localLib=$(DEPTH)/dist/$(MOZ_APP_NAME) \
 			--dm_trans=$(DM_TRANS) \
 			--deviceIP=${TEST_DEVICE} \
 			$(subst .cpp,$(BIN_SUFFIX),$(CPP_UNIT_TESTS)) $(EXTRA_TEST_ARGS); \
 	else \
-		echo "please prepare your host with environment variables for TEST_DEVICE"; \
+		echo 'please prepare your host with environment variables for TEST_DEVICE'; \
 	fi
 
 endif # COMPILE_ENVIRONMENT
 endif # CPP_UNIT_TESTS
 
 .PHONY: check
 
 ifdef PYTHON_UNIT_TESTS
@@ -359,23 +359,23 @@ endif
 ifeq ($(SOLARIS_SUNPRO_CXX),1)
 GARBAGE_DIRS += SunWS_cache
 endif
 
 ifdef MOZ_UPDATE_XTERM
 # Its good not to have a newline at the end of the titlebar string because it
 # makes the make -s output easier to read.  Echo -n does not work on all
 # platforms, but we can trick printf into doing it.
-UPDATE_TITLE = printf "\033]0;%s in %s\007" $(1) $(relativesrcdir)/$(2) ;
+UPDATE_TITLE = printf '\033]0;%s in %s\007' $(1) $(relativesrcdir)/$(2) ;
 endif
 
 ifdef MACH
 ifndef NO_BUILDSTATUS_MESSAGES
 define BUILDSTATUS
-@echo "BUILDSTATUS $1"
+@echo 'BUILDSTATUS $1'
 
 endef
 endif
 endif
 
 define SUBMAKE # $(call SUBMAKE,target,directory,static)
 +@$(UPDATE_TITLE)
 +$(MAKE) $(if $(2),-C $(2)) $(1)
@@ -738,32 +738,32 @@ alltags:
 #
 $(PROGRAM): $(PROGOBJS) $(EXTRA_DEPS) $(EXE_DEF_FILE) $(RESFILE) $(GLOBAL_DEPS)
 	$(REPORT_BUILD)
 	@$(RM) $@.manifest
 ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
 	$(EXPAND_LD) -NOLOGO -OUT:$@ -PDB:$(LINK_PDBFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(MOZ_GLUE_PROGRAM_LDFLAGS) $(PROGOBJS) $(RESFILE) $(LIBS) $(EXTRA_LIBS) $(OS_LIBS)
 ifdef MSMANIFEST_TOOL
 	@if test -f $@.manifest; then \
-		if test -f "$(srcdir)/$@.manifest"; then \
-			echo "Embedding manifest from $(srcdir)/$@.manifest and $@.manifest"; \
-			mt.exe -NOLOGO -MANIFEST "$(win_srcdir)/$@.manifest" $@.manifest -OUTPUTRESOURCE:$@\;1; \
+		if test -f '$(srcdir)/$@.manifest'; then \
+			echo 'Embedding manifest from $(srcdir)/$@.manifest and $@.manifest'; \
+			mt.exe -NOLOGO -MANIFEST '$(win_srcdir)/$@.manifest' $@.manifest -OUTPUTRESOURCE:$@\;1; \
 		else \
-			echo "Embedding manifest from $@.manifest"; \
+			echo 'Embedding manifest from $@.manifest'; \
 			mt.exe -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \
 		fi; \
-	elif test -f "$(srcdir)/$@.manifest"; then \
-		echo "Embedding manifest from $(srcdir)/$@.manifest"; \
-		mt.exe -NOLOGO -MANIFEST "$(win_srcdir)/$@.manifest" -OUTPUTRESOURCE:$@\;1; \
+	elif test -f '$(srcdir)/$@.manifest'; then \
+		echo 'Embedding manifest from $(srcdir)/$@.manifest'; \
+		mt.exe -NOLOGO -MANIFEST '$(win_srcdir)/$@.manifest' -OUTPUTRESOURCE:$@\;1; \
 	fi
 endif	# MSVC with manifest tool
 ifdef MOZ_PROFILE_GENERATE
 # touch it a few seconds into the future to work around FAT's
 # 2-second granularity
-	touch -t `date +%Y%m%d%H%M.%S -d "now+5seconds"` pgo.relink
+	touch -t `date +%Y%m%d%H%M.%S -d 'now+5seconds'` pgo.relink
 endif
 else # !WINNT || GNU_CC
 	$(EXPAND_CCC) -o $@ $(CXXFLAGS) $(PROGOBJS) $(RESFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(WRAP_LDFLAGS) $(LIBS_DIR) $(LIBS) $(MOZ_GLUE_PROGRAM_LDFLAGS) $(OS_LIBS) $(EXTRA_LIBS) $(BIN_FLAGS) $(EXE_DEF_FILE) $(STLPORT_LIBS)
 	@$(call CHECK_STDCXX,$@)
 endif # WINNT && !GNU_CC
 
 ifdef ENABLE_STRIP
 	$(STRIP) $(STRIP_FLAGS) $@
@@ -773,26 +773,26 @@ ifdef MOZ_POST_PROGRAM_COMMAND
 endif
 
 $(HOST_PROGRAM): $(HOST_PROGOBJS) $(HOST_LIBS_DEPS) $(HOST_EXTRA_DEPS) $(GLOBAL_DEPS)
 	$(REPORT_BUILD)
 ifeq (_WINNT,$(GNU_CC)_$(HOST_OS_ARCH))
 	$(EXPAND_LIBS_EXEC) -- $(HOST_LD) -NOLOGO -OUT:$@ -PDB:$(HOST_PDBFILE) $(HOST_OBJS) $(WIN32_EXE_LDFLAGS) $(HOST_LDFLAGS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
 ifdef MSMANIFEST_TOOL
 	@if test -f $@.manifest; then \
-		if test -f "$(srcdir)/$@.manifest"; then \
-			echo "Embedding manifest from $(srcdir)/$@.manifest and $@.manifest"; \
-			mt.exe -NOLOGO -MANIFEST "$(win_srcdir)/$@.manifest" $@.manifest -OUTPUTRESOURCE:$@\;1; \
+		if test -f '$(srcdir)/$@.manifest'; then \
+			echo 'Embedding manifest from $(srcdir)/$@.manifest and $@.manifest'; \
+			mt.exe -NOLOGO -MANIFEST '$(win_srcdir)/$@.manifest' $@.manifest -OUTPUTRESOURCE:$@\;1; \
 		else \
-			echo "Embedding manifest from $@.manifest"; \
+			echo 'Embedding manifest from $@.manifest'; \
 			mt.exe -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \
 		fi; \
-	elif test -f "$(srcdir)/$@.manifest"; then \
-		echo "Embedding manifest from $(srcdir)/$@.manifest"; \
-		mt.exe -NOLOGO -MANIFEST "$(win_srcdir)/$@.manifest" -OUTPUTRESOURCE:$@\;1; \
+	elif test -f '$(srcdir)/$@.manifest'; then \
+		echo 'Embedding manifest from $(srcdir)/$@.manifest'; \
+		mt.exe -NOLOGO -MANIFEST '$(win_srcdir)/$@.manifest' -OUTPUTRESOURCE:$@\;1; \
 	fi
 endif	# MSVC with manifest tool
 else
 ifeq ($(HOST_CPP_PROG_LINK),1)
 	$(EXPAND_LIBS_EXEC) -- $(HOST_CXX) -o $@ $(HOST_CXXFLAGS) $(HOST_LDFLAGS) $(HOST_PROGOBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
 else
 	$(EXPAND_LIBS_EXEC) -- $(HOST_CC) -o $@ $(HOST_CFLAGS) $(HOST_LDFLAGS) $(HOST_PROGOBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
 endif # HOST_CPP_PROG_LINK
@@ -927,41 +927,41 @@ ifdef MSMANIFEST_TOOL
 ifdef EMBED_MANIFEST_AT
 	@if test -f $@.manifest; then \
 		mt.exe -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;$(EMBED_MANIFEST_AT); \
 		rm -f $@.manifest; \
 	fi
 endif   # EMBED_MANIFEST_AT
 endif	# MSVC with manifest tool
 ifdef MOZ_PROFILE_GENERATE
-	touch -t `date +%Y%m%d%H%M.%S -d "now+5seconds"` pgo.relink
+	touch -t `date +%Y%m%d%H%M.%S -d 'now+5seconds'` pgo.relink
 endif
 endif	# WINNT && !GCC
 	@$(RM) foodummyfilefoo $(DELETE_AFTER_LINK)
 	chmod +x $@
 ifdef ENABLE_STRIP
 	$(STRIP) $(STRIP_FLAGS) $@
 endif
 ifdef MOZ_POST_DSO_LIB_COMMAND
 	$(MOZ_POST_DSO_LIB_COMMAND) $@
 endif
 
 ifeq ($(SOLARIS_SUNPRO_CC),1)
 _MDDEPFILE = $(MDDEPDIR)/$(@F).pp
 
 define MAKE_DEPS_AUTO_CC
 if test -d $(@D); then \
-	echo "Building deps for $< using Sun Studio cc"; \
+	echo 'Building deps for $< using Sun Studio cc'; \
 	$(CC) $(COMPILE_CFLAGS) -xM  $< >$(_MDDEPFILE) ; \
 	$(PYTHON) $(topsrcdir)/build/unix/add_phony_targets.py $(_MDDEPFILE) ; \
 fi
 endef
 define MAKE_DEPS_AUTO_CXX
 if test -d $(@D); then \
-	echo "Building deps for $< using Sun Studio CC"; \
+	echo 'Building deps for $< using Sun Studio CC'; \
 	$(CXX) $(COMPILE_CXXFLAGS) -xM $< >$(_MDDEPFILE) ; \
 	$(PYTHON) $(topsrcdir)/build/unix/add_phony_targets.py $(_MDDEPFILE) ; \
 fi
 endef
 endif # Sun Studio on Solaris
 
 # The object file is in the current directory, and the source file can be any
 # relative path. This macro adds the dependency obj: src for each source file.
@@ -1098,18 +1098,18 @@ SPACE := $(EMPTY) $(EMPTY)
 # MSYS has its own special path form, but javac expects the source and class
 # paths to be in the DOS form (i.e. e:/builds/...).  This function does the
 # appropriate conversion on Windows, but is a noop on other systems.
 ifeq ($(HOST_OS_ARCH),WINNT)
 #  We use 'pwd -W' to get DOS form of the path.  However, since the given path
 #  could be a file or a non-existent path, we cannot call 'pwd -W' directly
 #  on the path.  Instead, we extract the root path (i.e. "c:/"), call 'pwd -W'
 #  on it, then merge with the rest of the path.
-root-path = $(shell echo $(1) | sed -e "s|\(/[^/]*\)/\?\(.*\)|\1|")
-non-root-path = $(shell echo $(1) | sed -e "s|\(/[^/]*\)/\?\(.*\)|\2|")
+root-path = $(shell echo $(1) | sed -e 's|\(/[^/]*\)/\?\(.*\)|\1|')
+non-root-path = $(shell echo $(1) | sed -e 's|\(/[^/]*\)/\?\(.*\)|\2|')
 normalizepath = $(foreach p,$(1),$(if $(filter /%,$(1)),$(patsubst %/,%,$(shell cd $(call root-path,$(1)) && pwd -W))/$(call non-root-path,$(1)),$(1)))
 else
 normalizepath = $(1)
 endif
 
 ###############################################################################
 # Java rules
 ###############################################################################
@@ -1173,18 +1173,18 @@ ifdef XPT_NAME #{
 
 ifndef NO_DIST_INSTALL
 _XPT_NAME_FILES := $(DEPTH)/config/makefiles/xpidl/xpt/$(XPT_NAME)
 _XPT_NAME_DEST := $(FINAL_TARGET)/components
 INSTALL_TARGETS += _XPT_NAME
 
 ifndef NO_INTERFACES_MANIFEST
 libs:: $(call mkdir_deps,$(FINAL_TARGET)/components)
-	$(call py_action,buildlist,$(FINAL_TARGET)/components/interfaces.manifest "interfaces $(XPT_NAME)")
-	$(call py_action,buildlist,$(FINAL_TARGET)/chrome.manifest "manifest components/interfaces.manifest")
+	$(call py_action,buildlist,$(FINAL_TARGET)/components/interfaces.manifest 'interfaces $(XPT_NAME)')
+	$(call py_action,buildlist,$(FINAL_TARGET)/chrome.manifest 'manifest components/interfaces.manifest')
 endif
 endif
 
 endif #} XPT_NAME
 
 ################################################################################
 # Copy each element of EXTRA_COMPONENTS to $(FINAL_TARGET)/components
 ifneq (,$(filter %.js,$(EXTRA_COMPONENTS) $(EXTRA_PP_COMPONENTS)))
@@ -1210,17 +1210,17 @@ ifndef NO_DIST_INSTALL
 EXTRA_PP_COMPONENTS_PATH := $(FINAL_TARGET)/components
 PP_TARGETS += EXTRA_PP_COMPONENTS
 endif
 endif
 
 EXTRA_MANIFESTS = $(filter %.manifest,$(EXTRA_COMPONENTS) $(EXTRA_PP_COMPONENTS))
 ifneq (,$(EXTRA_MANIFESTS))
 libs:: $(call mkdir_deps,$(FINAL_TARGET))
-	$(call py_action,buildlist,$(FINAL_TARGET)/chrome.manifest $(patsubst %,"manifest components/%",$(notdir $(EXTRA_MANIFESTS))))
+	$(call py_action,buildlist,$(FINAL_TARGET)/chrome.manifest $(patsubst %,'manifest components/%',$(notdir $(EXTRA_MANIFESTS))))
 endif
 
 ################################################################################
 # Copy each element of EXTRA_JS_MODULES to
 # $(FINAL_TARGET)/$(JS_MODULES_PATH). JS_MODULES_PATH defaults to "modules"
 # if it is undefined.
 JS_MODULES_PATH ?= modules
 FINAL_JS_MODULES_PATH := $(FINAL_TARGET)/$(JS_MODULES_PATH)
@@ -1297,17 +1297,17 @@ chrome::
 ifneq (,$(wildcard $(JAR_MANIFEST)))
 ifndef NO_DIST_INSTALL
 
 ifdef XPI_NAME
 ifdef XPI_ROOT_APPID
 # For add-on packaging we may specify that an application
 # sub-dir should be added to the root chrome manifest with
 # a specific application id.
-MAKE_JARS_FLAGS += --root-manifest-entry-appid="$(XPI_ROOT_APPID)"
+MAKE_JARS_FLAGS += --root-manifest-entry-appid='$(XPI_ROOT_APPID)'
 endif
 
 # if DIST_SUBDIR is defined but XPI_ROOT_APPID is not there's
 # no way langpacks will get packaged right, so error out.
 ifneq (,$(DIST_SUBDIR))
 ifndef XPI_ROOT_APPID
 $(error XPI_ROOT_APPID is not defined - langpacks will break.)
 endif
@@ -1334,55 +1334,55 @@ DIST_CHROME_FILES_PATH := $(FINAL_TARGET
 DIST_CHROME_FILES_FLAGS := $(XULAPP_DEFINES)
 PP_TARGETS += DIST_CHROME_FILES
 endif
 
 ifneq ($(XPI_PKGNAME),)
 tools realchrome::
 ifdef STRIP_XPI
 ifndef MOZ_DEBUG
-	@echo "Stripping $(XPI_PKGNAME) package directory..."
+	@echo 'Stripping $(XPI_PKGNAME) package directory...'
 	@echo $(FINAL_TARGET)
 	@cd $(FINAL_TARGET) && find . ! -type d \
-			! -name "*.js" \
-			! -name "*.xpt" \
-			! -name "*.gif" \
-			! -name "*.jpg" \
-			! -name "*.png" \
-			! -name "*.xpm" \
-			! -name "*.txt" \
-			! -name "*.rdf" \
-			! -name "*.sh" \
-			! -name "*.properties" \
-			! -name "*.dtd" \
-			! -name "*.html" \
-			! -name "*.xul" \
-			! -name "*.css" \
-			! -name "*.xml" \
-			! -name "*.jar" \
-			! -name "*.dat" \
-			! -name "*.tbl" \
-			! -name "*.src" \
-			! -name "*.reg" \
+			! -name '*.js' \
+			! -name '*.xpt' \
+			! -name '*.gif' \
+			! -name '*.jpg' \
+			! -name '*.png' \
+			! -name '*.xpm' \
+			! -name '*.txt' \
+			! -name '*.rdf' \
+			! -name '*.sh' \
+			! -name '*.properties' \
+			! -name '*.dtd' \
+			! -name '*.html' \
+			! -name '*.xul' \
+			! -name '*.css' \
+			! -name '*.xml' \
+			! -name '*.jar' \
+			! -name '*.dat' \
+			! -name '*.tbl' \
+			! -name '*.src' \
+			! -name '*.reg' \
 			$(PLATFORM_EXCLUDE_LIST) \
 			-exec $(STRIP) $(STRIP_FLAGS) {} >/dev/null 2>&1 \;
 endif
 endif
-	@echo "Packaging $(XPI_PKGNAME).xpi..."
+	@echo 'Packaging $(XPI_PKGNAME).xpi...'
 	cd $(FINAL_TARGET) && $(ZIP) -qr ../$(XPI_PKGNAME).xpi *
 endif
 
 ifdef INSTALL_EXTENSION_ID
 ifndef XPI_NAME
 $(error XPI_NAME must be set for INSTALL_EXTENSION_ID)
 endif
 
 tools::
-	$(RM) -r "$(DIST)/bin$(DIST_SUBDIR:%=/%)/extensions/$(INSTALL_EXTENSION_ID)"
-	$(NSINSTALL) -D "$(DIST)/bin$(DIST_SUBDIR:%=/%)/extensions/$(INSTALL_EXTENSION_ID)"
+	$(RM) -r '$(DIST)/bin$(DIST_SUBDIR:%=/%)/extensions/$(INSTALL_EXTENSION_ID)'
+	$(NSINSTALL) -D '$(DIST)/bin$(DIST_SUBDIR:%=/%)/extensions/$(INSTALL_EXTENSION_ID)'
 	$(call copy_dir,$(FINAL_TARGET),$(DIST)/bin$(DIST_SUBDIR:%=/%)/extensions/$(INSTALL_EXTENSION_ID))
 
 endif
 
 #############################################################################
 # MDDEPDIR is the subdirectory where all the dependency files are placed.
 #   This uses a make rule (instead of a macro) to support parallel
 #   builds (-jN). If this were done in the LOOP_OVER_DIRS macro, two
@@ -1494,21 +1494,21 @@ endef
 $(foreach tier,$(INSTALL_TARGETS_TIERS), \
   $(eval $(tier):: $(INSTALL_TARGETS_FILES_$(tier)) $(INSTALL_TARGETS_EXECUTABLES_$(tier))) \
 )
 
 install_targets_sanity = $(if $(filter-out $(notdir $@),$(notdir $(<))),$(error Looks like $@ has an unexpected dependency on $< which breaks INSTALL_TARGETS))
 
 $(sort $(foreach tier,$(INSTALL_TARGETS_TIERS),$(INSTALL_TARGETS_FILES_$(tier)))):
 	$(install_targets_sanity)
-	$(call install_cmd,$(IFLAGS1) "$<" "$(@D)")
+	$(call install_cmd,$(IFLAGS1) '$<' '$(@D)')
 
 $(sort $(foreach tier,$(INSTALL_TARGETS_TIERS),$(INSTALL_TARGETS_EXECUTABLES_$(tier)))):
 	$(install_targets_sanity)
-	$(call install_cmd,$(IFLAGS2) "$<" "$(@D)")
+	$(call install_cmd,$(IFLAGS2) '$<' '$(@D)')
 
 ################################################################################
 # Preprocessing rules
 #
 # The PP_TARGETS variable contains a list of all preprocessing target
 # categories. Each category has associated variables listing input files, the
 # output directory, extra preprocessor flags, and so on. For example:
 #
@@ -1559,18 +1559,18 @@ pp_target_results = $(foreach file,$($(1
 
 $(foreach tier,$(PP_TARGETS_TIERS), \
   $(eval $(tier):: $(PP_TARGETS_RESULTS_$(tier))) \
 )
 
 PP_TARGETS_ALL_RESULTS := $(sort $(foreach tier,$(PP_TARGETS_TIERS),$(PP_TARGETS_RESULTS_$(tier))))
 $(PP_TARGETS_ALL_RESULTS):
 	$(if $(filter-out $(notdir $@),$(notdir $(<:.in=))),$(error Looks like $@ has an unexpected dependency on $< which breaks PP_TARGETS))
-	$(RM) "$@"
-	$(call py_action,preprocessor,--depend $(MDDEPDIR)/$(@F).pp $(PP_TARGET_FLAGS) $(DEFINES) $(ACDEFINES) $(XULPPFLAGS) "$<" -o "$@")
+	$(RM) '$@'
+	$(call py_action,preprocessor,--depend $(MDDEPDIR)/$(@F).pp $(PP_TARGET_FLAGS) $(DEFINES) $(ACDEFINES) $(XULPPFLAGS) '$<' -o '$@')
 
 # The depfile is based on the filename, and we don't want conflicts. So check
 # there's only one occurrence of any given filename in PP_TARGETS_ALL_RESULTS.
 PP_TARGETS_ALL_RESULT_NAMES := $(notdir $(PP_TARGETS_ALL_RESULTS))
 $(foreach file,$(sort $(PP_TARGETS_ALL_RESULT_NAMES)), \
   $(if $(filter-out 1,$(words $(filter $(file),$(PP_TARGETS_ALL_RESULT_NAMES)))), \
     $(error Multiple preprocessing rules are creating a $(file) file) \
   ) \
--- a/js/src/config/system-headers
+++ b/js/src/config/system-headers
@@ -408,16 +408,29 @@ freetype/ftoutln.h
 freetype/ttnameid.h
 freetype/tttables.h
 freetype/t1tables.h
 freetype/ftlcdfil.h
 freetype/ftsizes.h
 freetype/ftadvanc.h
 freetype/ftbitmap.h
 freetype/ftxf86.h
+freetype.h
+ftcache.h
+ftglyph.h
+ftsynth.h
+ftoutln.h
+ttnameid.h
+tttables.h
+t1tables.h
+ftlcdfil.h
+ftsizes.h
+ftadvanc.h
+ftbitmap.h
+ftxf86.h
 fribidi/fribidi.h
 FSp_fopen.h
 fstream
 fstream.h
 ft2build.h
 fts.h
 gconf/gconf-client.h
 Gdiplus.h
--- a/js/src/configure.in
+++ b/js/src/configure.in
@@ -1315,17 +1315,17 @@ MOZ_ARG_ENABLE_BOOL(profiling,
 
 dnl ========================================================
 dnl System overrides of the defaults for host
 dnl ========================================================
 case "$host" in
 *mingw*)
     if test -n "$_WIN32_MSVC"; then
         HOST_AR=lib
-        HOST_AR_FLAGS='-NOLOGO -OUT:"$@"'
+        HOST_AR_FLAGS='-NOLOGO -OUT:$@'
         HOST_CFLAGS="$HOST_CFLAGS -TC -nologo -Fd\$(HOST_PDBFILE)"
         HOST_RANLIB='echo ranlib'
     else
         HOST_CFLAGS="$HOST_CFLAGS -mwindows"
     fi
     HOST_CFLAGS="$HOST_CFLAGS -DXP_WIN32 -DXP_WIN -DWIN32 -D_WIN32 -DNO_X11 -D_CRT_SECURE_NO_WARNINGS"
     HOST_NSPR_MDCPUCFG='\"md/_winnt.cfg\"'
     HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O2}"
@@ -1614,17 +1614,17 @@ ia64*-hpux*)
         TARGET_COMPILER_ABI=msvc
         HOST_CC='$(CC)'
         HOST_CXX='$(CXX)'
         HOST_LD='$(LD)'
         if test "$AS_BIN"; then
             AS="$(basename "$AS_BIN")"
         fi
         AR='lib'
-        AR_FLAGS='-NOLOGO -OUT:"$@"'
+        AR_FLAGS='-NOLOGO -OUT:$@'
         AR_EXTRACT=
         RANLIB='echo not_ranlib'
         STRIP='echo not_strip'
         PKG_SKIP_STRIP=1
         XARGS=xargs
         DOXYGEN=:
         ASM_SUFFIX=asm
         OBJ_SUFFIX=obj
--- a/js/src/ctypes/libffi/Makefile.in
+++ b/js/src/ctypes/libffi/Makefile.in
@@ -428,49 +428,49 @@ EXTRA_DIST = LICENSE ChangeLog.v1 Change
 	m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4
 
 info_TEXINFOS = doc/libffi.texi
 
 # Work around what appears to be a GNU make bug handling MAKEFLAGS
 # values defined in terms of make variables, as is the case for CC and
 # friends when we are called from the top level Makefile.
 AM_MAKEFLAGS = \
-	"AR_FLAGS=$(AR_FLAGS)" \
-	"CC_FOR_BUILD=$(CC_FOR_BUILD)" \
-	"CFLAGS=$(CFLAGS)" \
-	"CXXFLAGS=$(CXXFLAGS)" \
-	"CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
-	"CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
-	"INSTALL=$(INSTALL)" \
-	"INSTALL_DATA=$(INSTALL_DATA)" \
-	"INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
-	"INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
-	"JC1FLAGS=$(JC1FLAGS)" \
-	"LDFLAGS=$(LDFLAGS)" \
-	"LIBCFLAGS=$(LIBCFLAGS)" \
-	"LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
-	"MAKE=$(MAKE)" \
-	"MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
-	"PICFLAG=$(PICFLAG)" \
-	"PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
-	"RUNTESTFLAGS=$(RUNTESTFLAGS)" \
-	"SHELL=$(SHELL)" \
-	"exec_prefix=$(exec_prefix)" \
-	"infodir=$(infodir)" \
-	"libdir=$(libdir)" \
-	"mandir=$(mandir)" \
-	"prefix=$(prefix)" \
-	"AR=$(AR)" \
-	"AS=$(AS)" \
-	"CC=$(CC)" \
-	"CXX=$(CXX)" \
-	"LD=$(LD)" \
-	"NM=$(NM)" \
-	"RANLIB=$(RANLIB)" \
-	"DESTDIR=$(DESTDIR)"
+	'AR_FLAGS=$(AR_FLAGS)' \
+	'CC_FOR_BUILD=$(CC_FOR_BUILD)' \
+	'CFLAGS=$(CFLAGS)' \
+	'CXXFLAGS=$(CXXFLAGS)' \
+	'CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)' \
+	'CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)' \
+	'INSTALL=$(INSTALL)' \
+	'INSTALL_DATA=$(INSTALL_DATA)' \
+	'INSTALL_PROGRAM=$(INSTALL_PROGRAM)' \
+	'INSTALL_SCRIPT=$(INSTALL_SCRIPT)' \
+	'JC1FLAGS=$(JC1FLAGS)' \
+	'LDFLAGS=$(LDFLAGS)' \
+	'LIBCFLAGS=$(LIBCFLAGS)' \
+	'LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)' \
+	'MAKE=$(MAKE)' \
+	'MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)' \
+	'PICFLAG=$(PICFLAG)' \
+	'PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)' \
+	'RUNTESTFLAGS=$(RUNTESTFLAGS)' \
+	'SHELL=$(SHELL)' \
+	'exec_prefix=$(exec_prefix)' \
+	'infodir=$(infodir)' \
+	'libdir=$(libdir)' \
+	'mandir=$(mandir)' \
+	'prefix=$(prefix)' \
+	'AR=$(AR)' \
+	'AS=$(AS)' \
+	'CC=$(CC)' \
+	'CXX=$(CXX)' \
+	'LD=$(LD)' \
+	'NM=$(NM)' \
+	'RANLIB=$(RANLIB)' \
+	'DESTDIR=$(DESTDIR)'
 
 MAKEOVERRIDES = 
 ACLOCAL_AMFLAGS = $(ACLOCAL_AMFLAGS) -I m4
 lib_LTLIBRARIES = libffi.la
 noinst_LTLIBRARIES = libffi_convenience.la
 libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c \
 		src/raw_api.c src/java_raw_api.c src/closures.c
 
--- a/js/src/devtools/rootAnalysis/Makefile.in
+++ b/js/src/devtools/rootAnalysis/Makefile.in
@@ -71,11 +71,11 @@ gcTypes.txt: src_comp.xdb computeGCTypes
 allFunctions.txt: src_body.xdb
 	@echo Started computation of $@ at $$(date)
 	time $(SIXGILL)/bin/xdbkeys $^ > $@.tmp
 	mv $@.tmp $@
 	@echo Finished computation of $@ at $$(date)
 
 rootingHazards.txt: gcFunctions.lst suppressedFunctions.lst gcTypes.txt analyzeRoots.js annotations.js gen-hazards.sh
 	@echo Started computation of $@ at $$(date)
-	time env JS=$(JS) ANALYZE="$(ANALYSIS_SCRIPT_DIR)/analyzeRoots.js" SIXGILL="$(SIXGILL)" "$(ANALYSIS_SCRIPT_DIR)/gen-hazards.sh" $(JOBS) > $@.tmp
+	time env JS=$(JS) ANALYZE='$(ANALYSIS_SCRIPT_DIR)/analyzeRoots.js' SIXGILL='$(SIXGILL)' '$(ANALYSIS_SCRIPT_DIR)/gen-hazards.sh' $(JOBS) > $@.tmp
 	mv $@.tmp $@
 	@echo Finished computation of $@ at $$(date)
deleted file mode 100644
--- a/js/src/jit-test/tests/ion/bug715460.js
+++ /dev/null
@@ -1,13 +0,0 @@
-function f(x) {
-    var a = x;
-    return a / 10;
-}
-for (var i=0; i<100; i++)
-    assertEq(f(i * 10), i);
-
-function g(x) {
-    var y = x + 1;
-    return y / y;
-}
-for (var i=0; i<100; i++)
-    assertEq(g(i), 1);
deleted file mode 100644
--- a/js/src/jit-test/tests/ion/bug900437.js
+++ /dev/null
@@ -1,6 +0,0 @@
-function test() {
-    var x = 0.0;
-    for (var i = 0; i < 100; i++)
-        -("") >> (x / x);
-}
-test();
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/ion/divmodself.js
@@ -0,0 +1,652 @@
+// |jit-test| ion-eager
+
+// bug 944963
+function bug944963(x, y) {
+    (+(xy))(y % y)
+}
+for (var i = 0; i < 10; i++) {
+    try {
+        (function() {
+            bug944963(0, (~Math.fround(-8)))
+        })()
+    } catch (e) {}
+}
+
+// bug 900437
+function bug900437() {
+    var x = 0.0;
+    for (var i = 0; i < 10; i++)
+        -("") >> (x / x);
+}
+bug900437();
+bug900437();
+
+// bug 715460
+function f(x) {
+    var a = x;
+    return a / 10;
+}
+function g(x) {
+    var y = x + 1;
+    return y / y;
+}
+for (var i=0; i<10; i++)
+    assertEq(f(i * 10), i);
+for (var i=0; i<10; i++)
+    assertEq(g(i), 1);
+
+// bug 939893
+function bug939893() {
+    bug_g();
+}
+function bug_g() {
+    bug_h(undefined >>> 0, +undefined);
+}
+function bug_h(x) {
+    Math.max(x ? ((x / x) | 0) : 0);
+}
+for (var a = 0; a < 2; ++a) {
+  bug939893();
+}
+
+// Assorted tests.
+
+function sdiv_truncate(y) {
+  return (y / y)|0;
+}
+assertEq(sdiv_truncate(5), 1);
+assertEq(sdiv_truncate(1), 1);
+assertEq(sdiv_truncate(-1), 1);
+assertEq(sdiv_truncate(0), 0);
+assertEq(sdiv_truncate(-0), 0);
+assertEq(sdiv_truncate(1.1), 1);
+assertEq(sdiv_truncate(-1.1), 1);
+assertEq(sdiv_truncate(Infinity), 0);
+assertEq(sdiv_truncate(NaN), 0);
+assertEq(sdiv_truncate(undefined), 0);
+assertEq(sdiv_truncate(null), 0);
+
+function sdiv(y) {
+  return y / y;
+}
+assertEq(sdiv(5), 1);
+assertEq(sdiv(1), 1);
+assertEq(sdiv(-1), 1);
+assertEq(sdiv(0), NaN);
+assertEq(sdiv(-0), NaN);
+assertEq(sdiv(1.1), 1);
+assertEq(sdiv(-1.1), 1);
+assertEq(sdiv(Infinity), NaN);
+assertEq(sdiv(NaN), NaN);
+assertEq(sdiv(undefined), NaN);
+assertEq(sdiv(null), NaN);
+
+function udiv_truncate(y) {
+  var yu = y>>>0;
+  return (yu / yu)|0;
+}
+assertEq(udiv_truncate(5), 1);
+assertEq(udiv_truncate(1), 1);
+assertEq(udiv_truncate(-1), 1);
+assertEq(udiv_truncate(0), 0);
+assertEq(udiv_truncate(-0), 0);
+assertEq(udiv_truncate(1.1), 1);
+assertEq(udiv_truncate(-1.1), 1);
+assertEq(udiv_truncate(Infinity), 0);
+assertEq(udiv_truncate(NaN), 0);
+assertEq(udiv_truncate(undefined), 0);
+assertEq(udiv_truncate(null), 0);
+
+function shifted_udiv_truncate(y) {
+  var yu = y>>>1;
+  return (yu / yu)|0;
+}
+assertEq(shifted_udiv_truncate(5), 1);
+assertEq(shifted_udiv_truncate(2), 1);
+assertEq(shifted_udiv_truncate(1), 0);
+assertEq(shifted_udiv_truncate(-1), 1);
+assertEq(shifted_udiv_truncate(0), 0);
+assertEq(shifted_udiv_truncate(-0), 0);
+assertEq(shifted_udiv_truncate(1.1), 0);
+assertEq(shifted_udiv_truncate(-1.1), 1);
+assertEq(shifted_udiv_truncate(Infinity), 0);
+assertEq(shifted_udiv_truncate(NaN), 0);
+assertEq(shifted_udiv_truncate(undefined), 0);
+assertEq(shifted_udiv_truncate(null), 0);
+
+function udiv(y) {
+  var yu = y>>>0;
+  return yu / yu;
+}
+assertEq(udiv(5), 1);
+assertEq(udiv(1), 1);
+assertEq(udiv(-1), 1);
+assertEq(udiv(0), NaN);
+assertEq(udiv(-0), NaN);
+assertEq(udiv(1.1), 1);
+assertEq(udiv(-1.1), 1);
+assertEq(udiv(Infinity), NaN);
+assertEq(udiv(NaN), NaN);
+assertEq(udiv(undefined), NaN);
+assertEq(udiv(null), NaN);
+
+function shifted_udiv(y) {
+  var yu = y>>>1;
+  return yu / yu;
+}
+assertEq(shifted_udiv(5), 1);
+assertEq(shifted_udiv(2), 1);
+assertEq(shifted_udiv(1), NaN);
+assertEq(shifted_udiv(-1), 1);
+assertEq(shifted_udiv(0), NaN);
+assertEq(shifted_udiv(-0), NaN);
+assertEq(shifted_udiv(1.1), NaN);
+assertEq(shifted_udiv(-1.1), 1);
+assertEq(shifted_udiv(Infinity), NaN);
+assertEq(shifted_udiv(NaN), NaN);
+assertEq(shifted_udiv(undefined), NaN);
+assertEq(shifted_udiv(null), NaN);
+
+function smod_truncate(y) {
+  return (y % y)|0;
+}
+assertEq(smod_truncate(5), 0);
+assertEq(smod_truncate(1), 0);
+assertEq(smod_truncate(-1), 0);
+assertEq(smod_truncate(0), 0);
+assertEq(smod_truncate(-0), 0);
+assertEq(smod_truncate(1.1), 0);
+assertEq(smod_truncate(-1.1), 0);
+assertEq(smod_truncate(Infinity), 0);
+assertEq(smod_truncate(NaN), 0);
+assertEq(smod_truncate(undefined), 0);
+assertEq(smod_truncate(null), 0);
+
+function smod(y) {
+  return y % y;
+}
+assertEq(smod(5), 0);
+assertEq(smod(1), 0);
+assertEq(smod(-1), -0);
+assertEq(smod(0), NaN);
+assertEq(smod(-0), NaN);
+assertEq(smod(1.1), 0);
+assertEq(smod(-1.1), -0);
+assertEq(smod(Infinity), NaN);
+assertEq(smod(NaN), NaN);
+assertEq(smod(undefined), NaN);
+assertEq(smod(null), NaN);
+
+function umod_truncate(y) {
+  var yu = y>>>0;
+  return (yu % yu)|0;
+}
+assertEq(umod_truncate(5), 0);
+assertEq(umod_truncate(1), 0);
+assertEq(umod_truncate(-1), 0);
+assertEq(umod_truncate(0), 0);
+assertEq(umod_truncate(-0), 0);
+assertEq(umod_truncate(1.1), 0);
+assertEq(umod_truncate(-1.1), 0);
+assertEq(umod_truncate(Infinity), 0);
+assertEq(umod_truncate(NaN), 0);
+assertEq(umod_truncate(undefined), 0);
+assertEq(umod_truncate(null), 0);
+
+function shifted_umod_truncate(y) {
+  var yu = y>>>1;
+  return (yu % yu)|0;
+}
+assertEq(shifted_umod_truncate(5), 0);
+assertEq(shifted_umod_truncate(2), 0);
+assertEq(shifted_umod_truncate(1), 0);
+assertEq(shifted_umod_truncate(-1), 0);
+assertEq(shifted_umod_truncate(0), 0);
+assertEq(shifted_umod_truncate(-0), 0);
+assertEq(shifted_umod_truncate(1.1), 0);
+assertEq(shifted_umod_truncate(-1.1), 0);
+assertEq(shifted_umod_truncate(Infinity), 0);
+assertEq(shifted_umod_truncate(NaN), 0);
+assertEq(shifted_umod_truncate(undefined), 0);
+assertEq(shifted_umod_truncate(null), 0);
+
+function umod(y) {
+  var yu = y>>>0;
+  return yu % yu;
+}
+assertEq(umod(5), 0);
+assertEq(umod(1), 0);
+assertEq(umod(-1), 0);
+assertEq(umod(0), NaN);
+assertEq(umod(-0), NaN);
+assertEq(umod(1.1), 0);
+assertEq(umod(-1.1), 0);
+assertEq(umod(Infinity), NaN);
+assertEq(umod(NaN), NaN);
+assertEq(umod(undefined), NaN);
+assertEq(umod(null), NaN);
+
+function shifted_umod(y) {
+  var yu = y>>>1;
+  return yu % yu;
+}
+assertEq(shifted_umod(5), 0);
+assertEq(shifted_umod(2), 0);
+assertEq(shifted_umod(1), NaN);
+assertEq(shifted_umod(-1), 0);
+assertEq(shifted_umod(0), NaN);
+assertEq(shifted_umod(-0), NaN);
+assertEq(shifted_umod(1.1), NaN);
+assertEq(shifted_umod(-1.1), 0);
+assertEq(shifted_umod(Infinity), NaN);
+assertEq(shifted_umod(NaN), NaN);
+assertEq(shifted_umod(undefined), NaN);
+assertEq(shifted_umod(null), NaN);
+
+function sdiv_truncate_nonzero(y) {
+  if (y == 0) return -202;
+  return (y / y)|0;
+}
+assertEq(sdiv_truncate_nonzero(5), 1);
+assertEq(sdiv_truncate_nonzero(1), 1);
+assertEq(sdiv_truncate_nonzero(-1), 1);
+assertEq(sdiv_truncate_nonzero(0), -202);
+assertEq(sdiv_truncate_nonzero(-0), -202);
+assertEq(sdiv_truncate_nonzero(1.1), 1);
+assertEq(sdiv_truncate_nonzero(-1.1), 1);
+assertEq(sdiv_truncate_nonzero(Infinity), 0);
+assertEq(sdiv_truncate_nonzero(NaN), 0);
+assertEq(sdiv_truncate_nonzero(undefined), 0);
+assertEq(sdiv_truncate_nonzero(null), 0);
+
+function sdiv_nonzero(y) {
+  if (y == 0) return -202;
+  return y / y;
+}
+assertEq(sdiv_nonzero(5), 1);
+assertEq(sdiv_nonzero(1), 1);
+assertEq(sdiv_nonzero(-1), 1);
+assertEq(sdiv_nonzero(0), -202);
+assertEq(sdiv_nonzero(-0), -202);
+assertEq(sdiv_nonzero(1.1), 1);
+assertEq(sdiv_nonzero(-1.1), 1);
+assertEq(sdiv_nonzero(Infinity), NaN);
+assertEq(sdiv_nonzero(NaN), NaN);
+assertEq(sdiv_nonzero(undefined), NaN);
+assertEq(sdiv_nonzero(null), NaN);
+
+function udiv_truncate_nonzero(y) {
+  var yu = y>>>0;
+  if (yu == 0) return -202;
+  return (yu / yu)|0;
+}
+assertEq(udiv_truncate_nonzero(5), 1);
+assertEq(udiv_truncate_nonzero(1), 1);
+assertEq(udiv_truncate_nonzero(-1), 1);
+assertEq(udiv_truncate_nonzero(0), -202);
+assertEq(udiv_truncate_nonzero(-0), -202);
+assertEq(udiv_truncate_nonzero(1.1), 1);
+assertEq(udiv_truncate_nonzero(-1.1), 1);
+assertEq(udiv_truncate_nonzero(Infinity), -202);
+assertEq(udiv_truncate_nonzero(NaN), -202);
+assertEq(udiv_truncate_nonzero(undefined), -202);
+assertEq(udiv_truncate_nonzero(null), -202);
+
+function shifted_udiv_truncate_nonzero(y) {
+  var yu = y>>>1;
+  if (yu == 0) return -202;
+  return (yu / yu)|0;
+}
+assertEq(shifted_udiv_truncate_nonzero(5), 1);
+assertEq(shifted_udiv_truncate_nonzero(2), 1);
+assertEq(shifted_udiv_truncate_nonzero(1), -202);
+assertEq(shifted_udiv_truncate_nonzero(-1), 1);
+assertEq(shifted_udiv_truncate_nonzero(0), -202);
+assertEq(shifted_udiv_truncate_nonzero(-0), -202);
+assertEq(shifted_udiv_truncate_nonzero(1.1), -202);
+assertEq(shifted_udiv_truncate_nonzero(-1.1), 1);
+assertEq(shifted_udiv_truncate_nonzero(Infinity), -202);
+assertEq(shifted_udiv_truncate_nonzero(NaN), -202);
+assertEq(shifted_udiv_truncate_nonzero(undefined), -202);
+assertEq(shifted_udiv_truncate_nonzero(null), -202);
+
+function udiv_nonzero(y) {
+  var yu = y>>>0;
+  if (yu == 0) return -202;
+  return yu / yu;
+}
+assertEq(udiv_nonzero(5), 1);
+assertEq(udiv_nonzero(1), 1);
+assertEq(udiv_nonzero(-1), 1);
+assertEq(udiv_nonzero(0), -202);
+assertEq(udiv_nonzero(-0), -202);
+assertEq(udiv_nonzero(1.1), 1);
+assertEq(udiv_nonzero(-1.1), 1);
+assertEq(udiv_nonzero(Infinity), -202);
+assertEq(udiv_nonzero(NaN), -202);
+assertEq(udiv_nonzero(undefined), -202);
+assertEq(udiv_nonzero(null), -202);
+
+function shifted_udiv_nonzero(y) {
+  var yu = y>>>1;
+  if (yu == 0) return -202;
+  return yu / yu;
+}
+assertEq(shifted_udiv_nonzero(5), 1);
+assertEq(shifted_udiv_nonzero(2), 1);
+assertEq(shifted_udiv_nonzero(1), -202);
+assertEq(shifted_udiv_nonzero(-1), 1);
+assertEq(shifted_udiv_nonzero(0), -202);
+assertEq(shifted_udiv_nonzero(-0), -202);
+assertEq(shifted_udiv_nonzero(1.1), -202);
+assertEq(shifted_udiv_nonzero(-1.1), 1);
+assertEq(shifted_udiv_nonzero(Infinity), -202);
+assertEq(shifted_udiv_nonzero(NaN), -202);
+assertEq(shifted_udiv_nonzero(undefined), -202);
+assertEq(shifted_udiv_nonzero(null), -202);
+
+function smod_truncate_nonzero(y) {
+  if (y == 0) return -202;
+  return (y % y)|0;
+}
+assertEq(smod_truncate_nonzero(5), 0);
+assertEq(smod_truncate_nonzero(1), 0);
+assertEq(smod_truncate_nonzero(-1), 0);
+assertEq(smod_truncate_nonzero(0), -202);
+assertEq(smod_truncate_nonzero(-0), -202);
+assertEq(smod_truncate_nonzero(1.1), 0);
+assertEq(smod_truncate_nonzero(-1.1), 0);
+assertEq(smod_truncate_nonzero(Infinity), 0);
+assertEq(smod_truncate_nonzero(NaN), 0);
+assertEq(smod_truncate_nonzero(undefined), 0);
+assertEq(smod_truncate_nonzero(null), 0);
+
+function smod_nonzero(y) {
+  if (y == 0) return -202;
+  return y % y;
+}
+assertEq(smod_nonzero(5), 0);
+assertEq(smod_nonzero(1), 0);
+assertEq(smod_nonzero(-1), -0);
+assertEq(smod_nonzero(0), -202);
+assertEq(smod_nonzero(-0), -202);
+assertEq(smod_nonzero(1.1), 0);
+assertEq(smod_nonzero(-1.1), -0);
+assertEq(smod_nonzero(Infinity), NaN);
+assertEq(smod_nonzero(NaN), NaN);
+assertEq(smod_nonzero(undefined), NaN);
+assertEq(smod_nonzero(null), NaN);
+
+function umod_truncate_nonzero(y) {
+  var yu = y>>>0;
+  if (yu == 0) return -202;
+  return (yu % yu)|0;
+}
+assertEq(umod_truncate_nonzero(5), 0);
+assertEq(umod_truncate_nonzero(1), 0);
+assertEq(umod_truncate_nonzero(-1), 0);
+assertEq(umod_truncate_nonzero(0), -202);
+assertEq(umod_truncate_nonzero(-0), -202);
+assertEq(umod_truncate_nonzero(1.1), 0);
+assertEq(umod_truncate_nonzero(-1.1), 0);
+assertEq(umod_truncate_nonzero(Infinity), -202);
+assertEq(umod_truncate_nonzero(NaN), -202);
+assertEq(umod_truncate_nonzero(undefined), -202);
+assertEq(umod_truncate_nonzero(null), -202);
+
+function shifted_umod_truncate_nonzero(y) {
+  var yu = y>>>1;
+  if (yu == 0) return -202;
+  return (yu % yu)|0;
+}
+assertEq(shifted_umod_truncate_nonzero(5), 0);
+assertEq(shifted_umod_truncate_nonzero(2), 0);
+assertEq(shifted_umod_truncate_nonzero(1), -202);
+assertEq(shifted_umod_truncate_nonzero(-1), 0);
+assertEq(shifted_umod_truncate_nonzero(0), -202);
+assertEq(shifted_umod_truncate_nonzero(-0), -202);
+assertEq(shifted_umod_truncate_nonzero(1.1), -202);
+assertEq(shifted_umod_truncate_nonzero(-1.1), 0);
+assertEq(shifted_umod_truncate_nonzero(Infinity), -202);
+assertEq(shifted_umod_truncate_nonzero(NaN), -202);
+assertEq(shifted_umod_truncate_nonzero(undefined), -202);
+assertEq(shifted_umod_truncate_nonzero(null), -202);
+
+function umod_nonzero(y) {
+  var yu = y>>>0;
+  if (yu == 0) return -202;
+  return yu % yu;
+}
+assertEq(umod_nonzero(5), 0);
+assertEq(umod_nonzero(1), 0);
+assertEq(umod_nonzero(-1), 0);
+assertEq(umod_nonzero(0), -202);
+assertEq(umod_nonzero(-0), -202);
+assertEq(umod_nonzero(1.1), 0);
+assertEq(umod_nonzero(-1.1), 0);
+assertEq(umod_nonzero(Infinity), -202);
+assertEq(umod_nonzero(NaN), -202);
+assertEq(umod_nonzero(undefined), -202);
+assertEq(umod_nonzero(null), -202);
+
+function shifted_umod_nonzero(y) {
+  var yu = y>>>1;
+  if (yu == 0) return -202;
+  return yu % yu;
+}
+assertEq(shifted_umod_nonzero(5), 0);
+assertEq(shifted_umod_nonzero(2), 0);
+assertEq(shifted_umod_nonzero(1), -202);
+assertEq(shifted_umod_nonzero(-1), 0);
+assertEq(shifted_umod_nonzero(0), -202);
+assertEq(shifted_umod_nonzero(-0), -202);
+assertEq(shifted_umod_nonzero(1.1), -202);
+assertEq(shifted_umod_nonzero(-1.1), 0);
+assertEq(shifted_umod_nonzero(Infinity), -202);
+assertEq(shifted_umod_nonzero(NaN), -202);
+assertEq(shifted_umod_nonzero(undefined), -202);
+assertEq(shifted_umod_nonzero(null), -202);
+
+function sdiv_truncate_positive(y) {
+  if (y <= 0) return -202;
+  return (y / y)|0;
+}
+assertEq(sdiv_truncate_positive(5), 1);
+assertEq(sdiv_truncate_positive(1), 1);
+assertEq(sdiv_truncate_positive(-1), -202);
+assertEq(sdiv_truncate_positive(0), -202);
+assertEq(sdiv_truncate_positive(-0), -202);
+assertEq(sdiv_truncate_positive(1.1), 1);
+assertEq(sdiv_truncate_positive(-1.1), -202);
+assertEq(sdiv_truncate_positive(Infinity), 0);
+assertEq(sdiv_truncate_positive(NaN), 0);
+assertEq(sdiv_truncate_positive(undefined), 0);
+assertEq(sdiv_truncate_positive(null), -202);
+
+function sdiv_positive(y) {
+  if (y <= 0) return -202;
+  return y / y;
+}
+assertEq(sdiv_positive(5), 1);
+assertEq(sdiv_positive(1), 1);
+assertEq(sdiv_positive(-1), -202);
+assertEq(sdiv_positive(0), -202);
+assertEq(sdiv_positive(-0), -202);
+assertEq(sdiv_positive(1.1), 1);
+assertEq(sdiv_positive(-1.1), -202);
+assertEq(sdiv_positive(Infinity), NaN);
+assertEq(sdiv_positive(NaN), NaN);
+assertEq(sdiv_positive(undefined), NaN);
+assertEq(sdiv_positive(null), -202);
+
+function udiv_truncate_positive(y) {
+  var yu = y>>>0;
+  if (yu <= 0) return -202;
+  return (yu / yu)|0;
+}
+assertEq(udiv_truncate_positive(5), 1);
+assertEq(udiv_truncate_positive(1), 1);
+assertEq(udiv_truncate_positive(-1), 1);
+assertEq(udiv_truncate_positive(0), -202);
+assertEq(udiv_truncate_positive(-0), -202);
+assertEq(udiv_truncate_positive(1.1), 1);
+assertEq(udiv_truncate_positive(-1.1), 1);
+assertEq(udiv_truncate_positive(Infinity), -202);
+assertEq(udiv_truncate_positive(NaN), -202);
+assertEq(udiv_truncate_positive(undefined), -202);
+assertEq(udiv_truncate_positive(null), -202);
+
+function shifted_udiv_truncate_positive(y) {
+  var yu = y>>>1;
+  if (yu <= 0) return -202;
+  return (yu / yu)|0;
+}
+assertEq(shifted_udiv_truncate_positive(5), 1);
+assertEq(shifted_udiv_truncate_positive(2), 1);
+assertEq(shifted_udiv_truncate_positive(1), -202);
+assertEq(shifted_udiv_truncate_positive(-1), 1);
+assertEq(shifted_udiv_truncate_positive(0), -202);
+assertEq(shifted_udiv_truncate_positive(-0), -202);
+assertEq(shifted_udiv_truncate_positive(1.1), -202);
+assertEq(shifted_udiv_truncate_positive(-1.1), 1);
+assertEq(shifted_udiv_truncate_positive(Infinity), -202);
+assertEq(shifted_udiv_truncate_positive(NaN), -202);
+assertEq(shifted_udiv_truncate_positive(undefined), -202);
+assertEq(shifted_udiv_truncate_positive(null), -202);
+
+function udiv_positive(y) {
+  var yu = y>>>0;
+  if (yu <= 0) return -202;
+  return yu / yu;
+}
+assertEq(udiv_positive(5), 1);
+assertEq(udiv_positive(1), 1);
+assertEq(udiv_positive(-1), 1);
+assertEq(udiv_positive(0), -202);
+assertEq(udiv_positive(-0), -202);
+assertEq(udiv_positive(1.1), 1);
+assertEq(udiv_positive(-1.1), 1);
+assertEq(udiv_positive(Infinity), -202);
+assertEq(udiv_positive(NaN), -202);
+assertEq(udiv_positive(undefined), -202);
+assertEq(udiv_positive(null), -202);
+
+function shifted_udiv_positive(y) {
+  var yu = y>>>1;
+  if (yu <= 0) return -202;
+  return yu / yu;
+}
+assertEq(shifted_udiv_positive(5), 1);
+assertEq(shifted_udiv_positive(2), 1);
+assertEq(shifted_udiv_positive(1), -202);
+assertEq(shifted_udiv_positive(-1), 1);
+assertEq(shifted_udiv_positive(0), -202);
+assertEq(shifted_udiv_positive(-0), -202);
+assertEq(shifted_udiv_positive(1.1), -202);
+assertEq(shifted_udiv_positive(-1.1), 1);
+assertEq(shifted_udiv_positive(Infinity), -202);
+assertEq(shifted_udiv_positive(NaN), -202);
+assertEq(shifted_udiv_positive(undefined), -202);
+assertEq(shifted_udiv_positive(null), -202);
+
+function smod_truncate_positive(y) {
+  if (y <= 0) return -202;
+  return (y % y)|0;
+}
+assertEq(smod_truncate_positive(5), 0);
+assertEq(smod_truncate_positive(1), 0);
+assertEq(smod_truncate_positive(-1), -202);
+assertEq(smod_truncate_positive(0), -202);
+assertEq(smod_truncate_positive(-0), -202);
+assertEq(smod_truncate_positive(1.1), 0);
+assertEq(smod_truncate_positive(-1.1), -202);
+assertEq(smod_truncate_positive(Infinity), 0);
+assertEq(smod_truncate_positive(NaN), 0);
+assertEq(smod_truncate_positive(undefined), 0);
+assertEq(smod_truncate_positive(null), -202);
+
+function smod_positive(y) {
+  if (y <= 0) return -202;
+  return y % y;
+}
+assertEq(smod_positive(5), 0);
+assertEq(smod_positive(1), 0);
+assertEq(smod_positive(-1), -202);
+assertEq(smod_positive(0), -202);
+assertEq(smod_positive(-0), -202);
+assertEq(smod_positive(1.1), 0);
+assertEq(smod_positive(-1.1), -202);
+assertEq(smod_positive(Infinity), NaN);
+assertEq(smod_positive(NaN), NaN);
+assertEq(smod_positive(undefined), NaN);
+assertEq(smod_positive(null), -202);
+
+function umod_truncate_positive(y) {
+  var yu = y>>>0;
+  if (yu <= 0) return -202;
+  return (yu % yu)|0;
+}
+assertEq(umod_truncate_positive(5), 0);
+assertEq(umod_truncate_positive(1), 0);
+assertEq(umod_truncate_positive(-1), 0);
+assertEq(umod_truncate_positive(0), -202);
+assertEq(umod_truncate_positive(-0), -202);
+assertEq(umod_truncate_positive(1.1), 0);
+assertEq(umod_truncate_positive(-1.1), 0);
+assertEq(umod_truncate_positive(Infinity), -202);
+assertEq(umod_truncate_positive(NaN), -202);
+assertEq(umod_truncate_positive(undefined), -202);
+assertEq(umod_truncate_positive(null), -202);
+
+function shifted_umod_truncate_positive(y) {
+  var yu = y>>>1;
+  if (yu <= 0) return -202;
+  return (yu % yu)|0;
+}
+assertEq(shifted_umod_truncate_positive(5), 0);
+assertEq(shifted_umod_truncate_positive(2), 0);
+assertEq(shifted_umod_truncate_positive(1), -202);
+assertEq(shifted_umod_truncate_positive(-1), 0);
+assertEq(shifted_umod_truncate_positive(0), -202);
+assertEq(shifted_umod_truncate_positive(-0), -202);
+assertEq(shifted_umod_truncate_positive(1.1), -202);
+assertEq(shifted_umod_truncate_positive(-1.1), 0);
+assertEq(shifted_umod_truncate_positive(Infinity), -202);
+assertEq(shifted_umod_truncate_positive(NaN), -202);
+assertEq(shifted_umod_truncate_positive(undefined), -202);
+assertEq(shifted_umod_truncate_positive(null), -202);
+
+function umod_positive(y) {
+  var yu = y>>>0;
+  if (yu <= 0) return -202;
+  return yu % yu;
+}
+assertEq(umod_positive(5), 0);
+assertEq(umod_positive(1), 0);
+assertEq(umod_positive(-1), 0);
+assertEq(umod_positive(0), -202);
+assertEq(umod_positive(-0), -202);
+assertEq(umod_positive(1.1), 0);
+assertEq(umod_positive(-1.1), 0);
+assertEq(umod_positive(Infinity), -202);
+assertEq(umod_positive(NaN), -202);
+assertEq(umod_positive(undefined), -202);
+assertEq(umod_positive(null), -202);
+
+function shifted_umod_positive(y) {
+  var yu = y>>>1;
+  if (yu <= 0) return -202;
+  return yu % yu;
+}
+assertEq(shifted_umod_positive(5), 0);
+assertEq(shifted_umod_positive(2), 0);
+assertEq(shifted_umod_positive(1), -202);
+assertEq(shifted_umod_positive(-1), 0);
+assertEq(shifted_umod_positive(0), -202);
+assertEq(shifted_umod_positive(-0), -202);
+assertEq(shifted_umod_positive(1.1), -202);
+assertEq(shifted_umod_positive(-1.1), 0);
+assertEq(shifted_umod_positive(Infinity), -202);
+assertEq(shifted_umod_positive(NaN), -202);
+assertEq(shifted_umod_positive(undefined), -202);
+assertEq(shifted_umod_positive(null), -202);
--- a/js/src/jit/BacktrackingAllocator.cpp
+++ b/js/src/jit/BacktrackingAllocator.cpp
@@ -385,16 +385,72 @@ BacktrackingAllocator::groupAndQueueRegi
     }
 
     return true;
 }
 
 static const size_t MAX_ATTEMPTS = 2;
 
 bool
+BacktrackingAllocator::tryAllocateFixed(LiveInterval *interval, bool *success,
+                                        bool *pfixed, LiveInterval **pconflicting)
+{
+    // Spill intervals which are required to be in a certain stack slot.
+    if (!interval->requirement()->allocation().isRegister()) {
+        IonSpew(IonSpew_RegAlloc, "stack allocation requirement");
+        interval->setAllocation(interval->requirement()->allocation());
+        *success = true;
+        return true;
+    }
+
+    AnyRegister reg = interval->requirement()->allocation().toRegister();
+    return tryAllocateRegister(registers[reg.code()], interval, success, pfixed, pconflicting);
+}
+
+bool
+BacktrackingAllocator::tryAllocateNonFixed(LiveInterval *interval, bool *success,
+                                           bool *pfixed, LiveInterval **pconflicting)
+{
+    // If we want, but do not require an interval to be in a specific
+    // register, only look at that register for allocating and evict
+    // or spill if it is not available. Picking a separate register may
+    // be even worse than spilling, as it will still necessitate moves
+    // and will tie up more registers than if we spilled.
+    if (interval->hint()->kind() == Requirement::FIXED) {
+        AnyRegister reg = interval->hint()->allocation().toRegister();
+        if (!tryAllocateRegister(registers[reg.code()], interval, success, pfixed, pconflicting))
+            return false;
+        if (*success)
+            return true;
+    }
+
+    // Spill intervals which have no hint or register requirement.
+    if (interval->requirement()->kind() == Requirement::NONE) {
+        spill(interval);
+        *success = true;
+        return true;
+    }
+
+    if (!*pconflicting || minimalInterval(interval)) {
+        // Search for any available register which the interval can be
+        // allocated to.
+        for (size_t i = 0; i < AnyRegister::Total; i++) {
+            if (!tryAllocateRegister(registers[i], interval, success, pfixed, pconflicting))
+                return false;
+            if (*success)
+                return true;
+        }
+    }
+
+    // We failed to allocate this interval.
+    JS_ASSERT(!*success);
+    return true;
+}
+
+bool
 BacktrackingAllocator::processInterval(LiveInterval *interval)
 {
     if (IonSpewEnabled(IonSpew_RegAlloc)) {
         IonSpew(IonSpew_RegAlloc, "Allocating v%u [priority %lu] [weight %lu]: %s",
                 interval->vreg(), computePriority(interval), computeSpillWeight(interval),
                 interval->rangesToString());
     }
 
@@ -421,61 +477,35 @@ BacktrackingAllocator::processInterval(L
     // allocation for higher weight intervals.
 
     bool canAllocate = setIntervalRequirement(interval);
 
     bool fixed;
     LiveInterval *conflict;
     for (size_t attempt = 0;; attempt++) {
         if (canAllocate) {
-            // Spill intervals which are required to be in a certain stack slot.
-            if (interval->requirement()->kind() == Requirement::FIXED &&
-                !interval->requirement()->allocation().isRegister())
-            {
-                IonSpew(IonSpew_RegAlloc, "stack allocation requirement");
-                interval->setAllocation(interval->requirement()->allocation());
-                return true;
-            }
-
+            bool success = false;
             fixed = false;
             conflict = nullptr;
 
-            // If we want, but do not require an interval to be in a specific
-            // register, only look at that register for allocating and evict
-            // or spill if it is not available. Picking a separate register may
-            // be even worse than spilling, as it will still necessitate moves
-            // and will tie up more registers than if we spilled.
-            if (interval->hint()->kind() == Requirement::FIXED) {
-                AnyRegister reg = interval->hint()->allocation().toRegister();
-                bool success;
-                if (!tryAllocateRegister(registers[reg.code()], interval, &success, &fixed, &conflict))
+            // Ok, let's try allocating for this interval.
+            if (interval->requirement()->kind() == Requirement::FIXED) {
+                if (!tryAllocateFixed(interval, &success, &fixed, &conflict))
                     return false;
-                if (success)
-                    return true;
+            } else {
+                if (!tryAllocateNonFixed(interval, &success, &fixed, &conflict))
+                    return false;
             }
 
-            // Spill intervals which have no hint or register requirement.
-            if (interval->requirement()->kind() == Requirement::NONE) {
-                spill(interval);
+            // If that worked, we're done!
+            if (success)
                 return true;
-            }
 
-            if (!conflict || minimalInterval(interval)) {
-                // Search for any available register which the interval can be
-                // allocated to.
-                for (size_t i = 0; i < AnyRegister::Total; i++) {
-                    bool success;
-                    if (!tryAllocateRegister(registers[i], interval, &success, &fixed, &conflict))
-                        return false;
-                    if (success)
-                        return true;
-                }
-            }
-
-            // Failed to allocate a register for this interval.
+            // If that didn't work, but we have a non-fixed LiveInterval known
+            // to be conflicting, maybe we can evict it and try again.
             if (attempt < MAX_ATTEMPTS &&
                 !fixed &&
                 conflict &&
                 computeSpillWeight(conflict) < computeSpillWeight(interval))
             {
                 if (!evictInterval(conflict))
                     return false;
                 continue;
@@ -654,22 +684,18 @@ BacktrackingAllocator::tryAllocateRegist
 
     if (!r.allocatable)
         return true;
 
     BacktrackingVirtualRegister *reg = &vregs[interval->vreg()];
     if (reg->isDouble() != r.reg.isFloat())
         return true;
 
-    if (interval->requirement()->kind() == Requirement::FIXED) {
-        if (interval->requirement()->allocation() != LAllocation(r.reg)) {
-            IonSpew(IonSpew_RegAlloc, "%s does not match fixed requirement", r.reg.name());
-            return true;
-        }
-    }
+    JS_ASSERT_IF(interval->requirement()->kind() == Requirement::FIXED,
+                 interval->requirement()->allocation() == LAllocation(r.reg));
 
     for (size_t i = 0; i < interval->numRanges(); i++) {
         AllocatedRange range(interval, interval->getRange(i)), existing;
         if (r.allocations.contains(range, &existing)) {
             if (existing.interval->hasVreg()) {
                 if (IonSpewEnabled(IonSpew_RegAlloc)) {
                     IonSpew(IonSpew_RegAlloc, "%s collides with v%u [%u,%u> [weight %lu]",
                             r.reg.name(), existing.interval->vreg(),
--- a/js/src/jit/BacktrackingAllocator.h
+++ b/js/src/jit/BacktrackingAllocator.h
@@ -187,16 +187,18 @@ class BacktrackingAllocator
 
     typedef Vector<LiveInterval *, 4, SystemAllocPolicy> LiveIntervalVector;
 
     bool init();
     bool canAddToGroup(VirtualRegisterGroup *group, BacktrackingVirtualRegister *reg);
     bool tryGroupRegisters(uint32_t vreg0, uint32_t vreg1);
     bool tryGroupReusedRegister(uint32_t def, uint32_t use);
     bool groupAndQueueRegisters();
+    bool tryAllocateFixed(LiveInterval *interval, bool *success, bool *pfixed, LiveInterval **pconflicting);
+    bool tryAllocateNonFixed(LiveInterval *interval, bool *success, bool *pfixed, LiveInterval **pconflicting);
     bool processInterval(LiveInterval *interval);
     bool processGroup(VirtualRegisterGroup *group);
     bool setIntervalRequirement(LiveInterval *interval);
     bool tryAllocateRegister(PhysicalRegister &r, LiveInterval *interval,
                              bool *success, bool *pfixed, LiveInterval **pconflicting);
     bool tryAllocateGroupRegister(PhysicalRegister &r, VirtualRegisterGroup *group,
                                   bool *psuccess, bool *pfixed, LiveInterval **pconflicting);
     bool evictInterval(LiveInterval *interval);
--- a/js/src/jit/MIR.cpp
+++ b/js/src/jit/MIR.cpp
@@ -1415,17 +1415,18 @@ MMod::foldsTo(TempAllocator &alloc, bool
         return folded;
 
     return this;
 }
 
 bool
 MMod::fallible() const
 {
-    return !isTruncated();
+    return !isTruncated() &&
+           (isUnsigned() || canBeDivideByZero() || canBeNegativeDividend());
 }
 
 void
 MMathFunction::trySpecializeFloat32(TempAllocator &alloc)
 {
     if (!input()->canProduceFloat32() || !CheckUsesAreFloat32Consumers(this)) {
         if (input()->type() == MIRType_Float32)
             ConvertDefinitionToDouble<0>(alloc, input(), this);
--- a/js/src/jit/shared/CodeGenerator-x86-shared.cpp
+++ b/js/src/jit/shared/CodeGenerator-x86-shared.cpp
@@ -889,16 +889,17 @@ CodeGeneratorX86Shared::visitDivPowTwoI(
 
 bool
 CodeGeneratorX86Shared::visitDivSelfI(LDivSelfI *ins)
 {
     Register op = ToRegister(ins->op());
     Register output = ToRegister(ins->output());
     MDiv *mir = ins->mir();
 
+    // If we can't divide by zero, lowering should have just used a constant one.
     JS_ASSERT(mir->canBeDivideByZero());
 
     masm.testl(op, op);
     if (mir->isTruncated()) {
         masm.emitSet(Assembler::NonZero, output);
     } else {
        if (!bailoutIf(Assembler::Zero, ins->snapshot()))
            return false;
@@ -987,16 +988,49 @@ CodeGeneratorX86Shared::visitDivI(LDivI 
             return false;
         masm.bind(ool->rejoin());
     }
 
     return true;
 }
 
 bool
+CodeGeneratorX86Shared::visitModSelfI(LModSelfI *ins)
+{
+    Register op = ToRegister(ins->op());
+    Register output = ToRegister(ins->output());
+    MMod *mir = ins->mir();
+
+    // If we're not fallible, lowering should have just used a constant zero.
+    JS_ASSERT(mir->fallible());
+    JS_ASSERT(mir->canBeDivideByZero() || (!mir->isUnsigned() && mir->canBeNegativeDividend()));
+
+    masm.testl(op, op);
+
+    // For a negative operand, we need to return negative zero. We can't
+    // represent that as an int32, so bail if that happens.
+    if (!mir->isUnsigned() && mir->canBeNegativeDividend()) {
+        if (!bailoutIf(Assembler::Signed, ins->snapshot()))
+             return false;
+    }
+
+    // For a zero operand, we need to return NaN. We can't
+    // represent that as an int32, so bail if that happens.
+    if (mir->canBeDivideByZero()) {
+        if (!bailoutIf(Assembler::Zero, ins->snapshot()))
+            return false;
+    }
+
+    // For any other value, return 0.
+    masm.mov(ImmWord(0), output);
+
+    return true;
+}
+
+bool
 CodeGeneratorX86Shared::visitModPowTwoI(LModPowTwoI *ins)
 {
     Register lhs = ToRegister(ins->getOperand(0));
     int32_t shift = ins->shift();
 
     Label negative, done;
     // Switch based on sign of the lhs.
     // Positive numbers are just a bitmask
@@ -1063,26 +1097,21 @@ CodeGeneratorX86Shared::visitModOverflow
 }
 
 bool
 CodeGeneratorX86Shared::visitModI(LModI *ins)
 {
     Register remainder = ToRegister(ins->remainder());
     Register lhs = ToRegister(ins->lhs());
     Register rhs = ToRegister(ins->rhs());
-    Register temp = ToRegister(ins->getTemp(0));
 
     // Required to use idiv.
+    JS_ASSERT(lhs == eax);
     JS_ASSERT(remainder == edx);
-    JS_ASSERT(temp == eax);
-
-    if (lhs != temp) {
-        masm.mov(lhs, temp);
-        lhs = temp;
-    }
+    JS_ASSERT(ToRegister(ins->getTemp(0)) == eax);
 
     Label done;
     ReturnZero *ool = nullptr;
     ModOverflowCheck *overflow = nullptr;
 
     // Prevent divide by zero.
     if (ins->mir()->canBeDivideByZero()) {
         masm.testl(rhs, rhs);
--- a/js/src/jit/shared/CodeGenerator-x86-shared.h
+++ b/js/src/jit/shared/CodeGenerator-x86-shared.h
@@ -89,16 +89,17 @@ class CodeGeneratorX86Shared : public Co
     virtual bool visitAddI(LAddI *ins);
     virtual bool visitSubI(LSubI *ins);
     virtual bool visitMulI(LMulI *ins);
     virtual bool visitDivI(LDivI *ins);
     virtual bool visitDivPowTwoI(LDivPowTwoI *ins);
     virtual bool visitDivSelfI(LDivSelfI *ins);
     virtual bool visitModI(LModI *ins);
     virtual bool visitModPowTwoI(LModPowTwoI *ins);
+    virtual bool visitModSelfI(LModSelfI *ins);
     virtual bool visitBitNotI(LBitNotI *ins);
     virtual bool visitBitOpI(LBitOpI *ins);
     virtual bool visitShiftI(LShiftI *ins);
     virtual bool visitUrshD(LUrshD *ins);
     virtual bool visitTestIAndBranch(LTestIAndBranch *test);
     virtual bool visitTestDAndBranch(LTestDAndBranch *test);
     virtual bool visitTestFAndBranch(LTestFAndBranch *test);
     virtual bool visitCompare(LCompare *comp);
--- a/js/src/jit/shared/LIR-x86-shared.h
+++ b/js/src/jit/shared/LIR-x86-shared.h
@@ -109,16 +109,35 @@ class LModI : public LBinaryMath<1>
     const LDefinition *remainder() {
         return getDef(0);
     }
     MMod *mir() const {
         return mir_->toMod();
     }
 };
 
+// Modulo of a number by itself. Returns 0 unless the number is zero.
+class LModSelfI : public LInstructionHelper<1, 1, 0>
+{
+  public:
+    LIR_HEADER(ModSelfI)
+
+    LModSelfI(const LAllocation &op) {
+        setOperand(0, op);
+    }
+
+    const LAllocation *op() {
+        return getOperand(0);
+    }
+
+    MMod *mir() const {
+        return mir_->toMod();
+    }
+};
+
 // This class performs a simple x86 'div', yielding either a quotient or remainder depending on
 // whether this instruction is defined to output eax (quotient) or edx (remainder).
 class LUDivOrMod : public LBinaryMath<1>
 {
   public:
     LIR_HEADER(UDivOrMod);
 
     LUDivOrMod(const LAllocation &lhs, const LAllocation &rhs, const LDefinition &temp) {
--- a/js/src/jit/shared/Lowering-x86-shared.cpp
+++ b/js/src/jit/shared/Lowering-x86-shared.cpp
@@ -185,17 +185,33 @@ LIRGeneratorX86Shared::lowerModI(MMod *m
         int32_t shift = FloorLog2(rhs);
         if (rhs > 0 && 1 << shift == rhs) {
             LModPowTwoI *lir = new LModPowTwoI(useRegisterAtStart(mod->lhs()), shift);
             if (mod->fallible() && !assignSnapshot(lir, Bailout_BaselineInfo))
                 return false;
             return defineReuseInput(lir, mod, 0);
         }
     }
-    LModI *lir = new LModI(useRegister(mod->lhs()), useRegister(mod->rhs()), tempFixed(eax));
+
+    // Optimize x%x. The comments in lowerDivI apply here as well, except
+    // that we return 0 for all cases except when x is 0 and we're not
+    // truncated.
+    if (mod->rhs() == mod->lhs()) {
+        if (mod->isTruncated())
+            return define(new LInteger(0), mod);
+
+        LModSelfI *lir = new LModSelfI(useRegisterAtStart(mod->lhs()));
+        if (mod->fallible() && !assignSnapshot(lir, Bailout_BaselineInfo))
+            return false;
+        return define(lir, mod);
+    }
+
+    LModI *lir = new LModI(useFixedAtStart(mod->lhs(), eax),
+                           useRegister(mod->rhs()),
+                           tempFixed(eax));
     if (mod->fallible() && !assignSnapshot(lir, Bailout_BaselineInfo))
         return false;
     return defineFixed(lir, mod, LAllocation(AnyRegister(edx)));
 }
 
 bool
 LIRGeneratorX86Shared::visitAsmJSNeg(MAsmJSNeg *ins)
 {
@@ -205,39 +221,50 @@ LIRGeneratorX86Shared::visitAsmJSNeg(MAs
     JS_ASSERT(ins->type() == MIRType_Double);
     return defineReuseInput(new LNegD(useRegisterAtStart(ins->input())), ins, 0);
 }
 
 bool
 LIRGeneratorX86Shared::lowerUDiv(MDiv *div)
 {
     // Optimize x/x. The comments in lowerDivI apply here as well.
-    if (div->getOperand(0) == div->getOperand(1)) {
+    if (div->lhs() == div->rhs()) {
         if (!div->canBeDivideByZero())
             return define(new LInteger(1), div);
 
-        LDivSelfI *lir = new LDivSelfI(useRegisterAtStart(div->getOperand(0)));
+        LDivSelfI *lir = new LDivSelfI(useRegisterAtStart(div->lhs()));
         if (div->fallible() && !assignSnapshot(lir, Bailout_BaselineInfo))
             return false;
         return define(lir, div);
     }
 
-    LUDivOrMod *lir = new LUDivOrMod(useFixedAtStart(div->getOperand(0), eax),
-                                     useRegister(div->getOperand(1)),
+    LUDivOrMod *lir = new LUDivOrMod(useFixedAtStart(div->lhs(), eax),
+                                     useRegister(div->rhs()),
                                      tempFixed(edx));
     if (div->fallible() && !assignSnapshot(lir, Bailout_BaselineInfo))
         return false;
     return defineFixed(lir, div, LAllocation(AnyRegister(eax)));
 }
 
 bool
 LIRGeneratorX86Shared::lowerUMod(MMod *mod)
 {
-    LUDivOrMod *lir = new LUDivOrMod(useFixedAtStart(mod->getOperand(0), eax),
-                                     useRegister(mod->getOperand(1)),
+    // Optimize x%x. The comments in lowerModI apply here as well.
+    if (mod->lhs() == mod->rhs()) {
+        if (mod->isTruncated())
+            return define(new LInteger(0), mod);
+
+        LModSelfI *lir = new LModSelfI(useRegisterAtStart(mod->lhs()));
+        if (mod->fallible() && !assignSnapshot(lir, Bailout_BaselineInfo))
+            return false;
+        return define(lir, mod);
+    }
+
+    LUDivOrMod *lir = new LUDivOrMod(useFixedAtStart(mod->lhs(), eax),
+                                     useRegister(mod->rhs()),
                                      tempFixed(eax));
     if (mod->fallible() && !assignSnapshot(lir, Bailout_BaselineInfo))
         return false;
     return defineFixed(lir, mod, LAllocation(AnyRegister(edx)));
 }
 
 bool
 LIRGeneratorX86Shared::lowerUrshD(MUrsh *mir)
--- a/js/src/jit/x64/LOpcodes-x64.h
+++ b/js/src/jit/x64/LOpcodes-x64.h
@@ -11,15 +11,16 @@
     _(Box)                          \
     _(Unbox)                        \
     _(UnboxFloatingPoint)           \
     _(DivI)                         \
     _(DivPowTwoI)                   \
     _(DivSelfI)                     \
     _(ModI)                         \
     _(ModPowTwoI)                   \
+    _(ModSelfI)                     \
     _(PowHalfD)                     \
     _(AsmJSUInt32ToDouble)          \
     _(AsmJSUInt32ToFloat32)         \
     _(AsmJSLoadFuncPtr)             \
     _(UDivOrMod)
 
 #endif /* jit_x64_LOpcodes_x64_h */
--- a/js/src/jit/x86/LOpcodes-x86.h
+++ b/js/src/jit/x86/LOpcodes-x86.h
@@ -12,15 +12,16 @@
     _(UnboxFloatingPoint)       \
     _(Box)                      \
     _(BoxFloatingPoint)         \
     _(DivI)                     \
     _(DivPowTwoI)               \
     _(DivSelfI)                 \
     _(ModI)                     \
     _(ModPowTwoI)               \
+    _(ModSelfI)                 \
     _(PowHalfD)                 \
     _(AsmJSUInt32ToDouble)      \
     _(AsmJSUInt32ToFloat32)     \
     _(AsmJSLoadFuncPtr)         \
     _(UDivOrMod)
 
 #endif /* jit_x86_LOpcodes_x86_h */
--- a/js/src/jsapi.cpp
+++ b/js/src/jsapi.cpp
@@ -1664,21 +1664,16 @@ JS_RemoveObjectRootRT(JSRuntime *rt, JSO
 }
 
 JS_PUBLIC_API(void)
 JS_RemoveScriptRootRT(JSRuntime *rt, JSScript **rp)
 {
     RemoveRoot(rt, (void *)rp);
 }
 
-JS_NEVER_INLINE JS_PUBLIC_API(void)
-JS_AnchorPtr(void *p)
-{
-}
-
 JS_PUBLIC_API(bool)
 JS_AddExtraGCRootsTracer(JSRuntime *rt, JSTraceDataOp traceOp, void *data)
 {
     AssertHeapIsIdle(rt);
     return !!rt->gcBlackRootTracers.append(JSRuntime::ExtraTracer(traceOp, data));
 }
 
 JS_PUBLIC_API(void)
--- a/js/src/jsapi.h
+++ b/js/src/jsapi.h
@@ -1983,23 +1983,16 @@ JS_RemoveStringRootRT(JSRuntime *rt, JSS
 
 extern JS_PUBLIC_API(void)
 JS_RemoveObjectRootRT(JSRuntime *rt, JSObject **rp);
 
 extern JS_PUBLIC_API(void)
 JS_RemoveScriptRootRT(JSRuntime *rt, JSScript **rp);
 
 /*
- * C-compatible version of the Anchor class. It should be called after the last
- * use of the variable it protects.
- */
-extern JS_NEVER_INLINE JS_PUBLIC_API(void)
-JS_AnchorPtr(void *p);
-
-/*
  * Register externally maintained GC roots.
  *
  * traceOp: the trace operation. For each root the implementation should call
  *          JS_CallTracer whenever the root contains a traceable thing.
  * data:    the data argument to pass to each invocation of traceOp.
  */
 extern JS_PUBLIC_API(bool)
 JS_AddExtraGCRootsTracer(JSRuntime *rt, JSTraceDataOp traceOp, void *data);
--- a/js/src/jsarray.cpp
+++ b/js/src/jsarray.cpp
@@ -1090,21 +1090,24 @@ ArrayJoin(JSContext *cx, CallArgs &args)
         sepstr = ToString<CanGC>(cx, args[0]);
         if (!sepstr)
             return false;
         sepchars = sepstr->getChars(cx);
         if (!sepchars)
             return false;
         seplen = sepstr->length();
     } else {
-        static const jschar comma = ',';
-        sepchars = &comma;
-        seplen = 1;
+        HandlePropertyName comma = cx->names().comma;
+        sepstr = comma;
+        sepchars = comma->chars();
+        seplen = comma->length();
     }
 
+    JS::Anchor<JSString*> anchor(sepstr);
+
     // Step 6 is implicit in the loops below
 
     StringBuffer sb(cx);
 
     // The separator will be added |length - 1| times, reserve space for that
     // so that we don't have to unnecessarily grow the buffer.
     if (length > 0 && !sb.reserve(seplen * (length - 1)))
         return false;
@@ -1119,19 +1122,16 @@ ArrayJoin(JSContext *cx, CallArgs &args)
         if (!ArrayJoinKernel<Locale>(cx, op, obj, length, sb))
             return false;
     } else {
         StringSeparatorOp op(sepchars, seplen);
         if (!ArrayJoinKernel<Locale>(cx, op, obj, length, sb))
             return false;
     }
 
-    // Ensure that sepstr stays alive longer than sepchars.
-    JS_AnchorPtr(sepstr);
-
     // Step 11
     JSString *str = sb.finishString();
     if (!str)
         return false;
     args.rval().setString(str);
     return true;
 }
 
--- a/js/src/jsfriendapi.cpp
+++ b/js/src/jsfriendapi.cpp
@@ -559,17 +559,18 @@ js::GetObjectProto(JSContext *cx, JS::Ha
     proto.set(reinterpret_cast<const shadow::Object*>(obj.get())->type->proto);
     return true;
 }
 
 JS_FRIEND_API(bool)
 js::GetOriginalEval(JSContext *cx, HandleObject scope, MutableHandleObject eval)
 {
     assertSameCompartment(cx, scope);
-    return scope->global().getOrCreateEval(cx, eval);
+    Rooted<GlobalObject *> global(cx, &scope->global());
+    return GlobalObject::getOrCreateEval(cx, global, eval);
 }
 
 JS_FRIEND_API(void)
 js::SetReservedSlotWithBarrier(JSObject *obj, size_t slot, const js::Value &value)
 {
     obj->setSlot(slot, value);
 }
 
--- a/js/src/vm/CommonPropertyNames.h
+++ b/js/src/vm/CommonPropertyNames.h
@@ -28,16 +28,17 @@
     macro(call, call, "call") \
     macro(callee, callee, "callee") \
     macro(caller, caller, "caller") \
     macro(callFunction, callFunction, "callFunction") \
     macro(caseFirst, caseFirst, "caseFirst") \
     macro(Collator, Collator, "Collator") \
     macro(CollatorCompareGet, CollatorCompareGet, "Intl_Collator_compare_get") \
     macro(columnNumber, columnNumber, "columnNumber") \
+    macro(comma, comma, ",") \
     macro(compare, compare, "compare") \
     macro(configurable, configurable, "configurable") \
     macro(construct, construct, "construct") \
     macro(constructor, constructor, "constructor") \
     macro(ConvertAndCopyTo, ConvertAndCopyTo, "ConvertAndCopyTo") \
     macro(currency, currency, "currency") \
     macro(currencyDisplay, currencyDisplay, "currencyDisplay") \
     macro(std_iterator, std_iterator, "@@iterator") \
--- a/js/src/vm/Debugger.cpp
+++ b/js/src/vm/Debugger.cpp
@@ -94,27 +94,27 @@ ReportMoreArgsNeeded(JSContext *cx, cons
     s[0] = '0' + (required - 1);
     s[1] = '\0';
     JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_MORE_ARGS_NEEDED,
                          name, s, required == 2 ? "" : "s");
     return false;
 }
 
 static inline bool
-EnsureFunctionHasScript(JSContext *cx, JSFunction *fun)
+EnsureFunctionHasScript(JSContext *cx, HandleFunction fun)
 {
     if (fun->isInterpretedLazy()) {
         AutoCompartment ac(cx, fun);
         return !!fun->getOrCreateScript(cx);
     }
     return true;
 }
 
 static inline JSScript *
-GetOrCreateFunctionScript(JSContext *cx, JSFunction *fun)
+GetOrCreateFunctionScript(JSContext *cx, HandleFunction fun)
 {
     MOZ_ASSERT(fun->isInterpreted());
     if (!EnsureFunctionHasScript(cx, fun))
         return nullptr;
     return fun->nonLazyScript();
 }
 
 #define REQUIRE_ARGC(name, n)                                                 \
@@ -702,18 +702,21 @@ Debugger::wrapEnvironment(JSContext *cx,
 bool
 Debugger::wrapDebuggeeValue(JSContext *cx, MutableHandleValue vp)
 {
     assertSameCompartment(cx, object.get());
 
     if (vp.isObject()) {
         RootedObject obj(cx, &vp.toObject());
 
-        if (obj->is<JSFunction>() && !EnsureFunctionHasScript(cx, &obj->as<JSFunction>()))
-            return false;
+        if (obj->is<JSFunction>()) {
+            RootedFunction fun(cx, &obj->as<JSFunction>());
+            if (!EnsureFunctionHasScript(cx, fun))
+                return false;
+        }
 
         DependentAddPtr<ObjectWeakMap> p(cx, objects, obj);
         if (p) {
             vp.setObject(*p->value);
         } else {
             /* Create a new Debugger.Object for obj. */
             JSObject *proto = &object->getReservedSlot(JSSLOT_DEBUG_OBJECT_PROTO).toObject();
             JSObject *dobj =
--- a/js/src/vm/GlobalObject.cpp
+++ b/js/src/vm/GlobalObject.cpp
@@ -448,22 +448,23 @@ GlobalObject::create(JSContext *cx, cons
     JSObject *res = RegExpStatics::create(cx, global);
     if (!res)
         return nullptr;
 
     global->initSlot(REGEXP_STATICS, ObjectValue(*res));
     return global;
 }
 
-bool
-GlobalObject::getOrCreateEval(JSContext *cx, MutableHandleObject eval)
+/* static */ bool
+GlobalObject::getOrCreateEval(JSContext *cx, Handle<GlobalObject*> global,
+                              MutableHandleObject eval)
 {
-    if (!getOrCreateObjectPrototype(cx))
+    if (!global->getOrCreateObjectPrototype(cx))
         return false;
-    eval.set(&getSlotRefForCompilation(EVAL).toObject());
+    eval.set(&global->getSlotRefForCompilation(EVAL).toObject());
     return true;
 }
 
 bool
 GlobalObject::valueIsEval(Value val)
 {
     HeapSlot &eval = getSlotRef(EVAL);
     return eval.isObject() && eval.get() == val;
--- a/js/src/vm/GlobalObject.h
+++ b/js/src/vm/GlobalObject.h
@@ -585,17 +585,18 @@ class GlobalObject : public JSObject
     }
 
     static bool isRuntimeCodeGenEnabled(JSContext *cx, Handle<GlobalObject*> global);
 
     // Warn about use of the deprecated watch/unwatch functions in the global
     // in which |obj| was created, if no prior warning was given.
     static bool warnOnceAboutWatch(JSContext *cx, HandleObject obj);
 
-    bool getOrCreateEval(JSContext *cx, MutableHandleObject eval);
+    static bool getOrCreateEval(JSContext *cx, Handle<GlobalObject*> global,
+                                MutableHandleObject eval);
 
     // Infallibly test whether the given value is the eval function for this global.
     bool valueIsEval(Value val);
 
     // Implemented in jsiter.cpp.
     static bool initIteratorClasses(JSContext *cx, Handle<GlobalObject*> global);
 
     // Implemented in builtin/MapObject.cpp.
--- a/js/xpconnect/src/XPCWrappedNative.cpp
+++ b/js/xpconnect/src/XPCWrappedNative.cpp
@@ -36,16 +36,20 @@ xpc_OkToHandOutWrapper(nsWrapperCache *c
                "Must have XPCWrappedNative wrapper");
     return !XPCWrappedNative::Get(cache->GetWrapper())->NeedsSOW();
 }
 
 /***************************************************************************/
 
 NS_IMPL_CYCLE_COLLECTION_CLASS(XPCWrappedNative)
 
+// No need to unlink the JS objects: if the XPCWrappedNative is cycle
+// collected then its mFlatJSObject will be cycle collected too and
+// finalization of the mFlatJSObject will unlink the JS objects (see
+// XPC_WN_NoHelper_Finalize and FlatJSObjectFinalized).
 NS_IMETHODIMP_(void)
 NS_CYCLE_COLLECTION_CLASSNAME(XPCWrappedNative)::Unlink(void *p)
 {
     XPCWrappedNative *tmp = static_cast<XPCWrappedNative*>(p);
     tmp->ExpireWrapper();
 }
 
 NS_IMETHODIMP
@@ -595,32 +599,36 @@ XPCWrappedNative::GetUsedOnly(nsISupport
 
 // This ctor is used if this object will have a proto.
 XPCWrappedNative::XPCWrappedNative(already_AddRefed<nsISupports> aIdentity,
                                    XPCWrappedNativeProto* aProto)
     : mMaybeProto(aProto),
       mSet(aProto->GetSet()),
       mScriptableInfo(nullptr)
 {
+    MOZ_ASSERT(NS_IsMainThread());
+
     mIdentity = aIdentity.get();
     mFlatJSObject.setFlags(FLAT_JS_OBJECT_VALID);
 
     MOZ_ASSERT(mMaybeProto, "bad ctor param");
     MOZ_ASSERT(mSet, "bad ctor param");
 }
 
 // This ctor is used if this object will NOT have a proto.
 XPCWrappedNative::XPCWrappedNative(already_AddRefed<nsISupports> aIdentity,
                                    XPCWrappedNativeScope* aScope,
                                    XPCNativeSet* aSet)
 
     : mMaybeScope(TagScope(aScope)),
       mSet(aSet),
       mScriptableInfo(nullptr)
 {
+    MOZ_ASSERT(NS_IsMainThread());
+
     mIdentity = aIdentity.get();
     mFlatJSObject.setFlags(FLAT_JS_OBJECT_VALID);
 
     MOZ_ASSERT(aScope, "bad ctor param");
     MOZ_ASSERT(aSet, "bad ctor param");
 }
 
 XPCWrappedNative::~XPCWrappedNative()
@@ -900,20 +908,24 @@ XPCWrappedNative::FinishInit()
     return true;
 }
 
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(XPCWrappedNative)
   NS_INTERFACE_MAP_ENTRY(nsIXPConnectWrappedNative)
   NS_INTERFACE_MAP_ENTRY(nsIXPConnectJSObjectHolder)
   NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIXPConnectWrappedNative)
-NS_INTERFACE_MAP_END_THREADSAFE
-
-NS_IMPL_ADDREF(XPCWrappedNative)
-NS_IMPL_RELEASE(XPCWrappedNative)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(XPCWrappedNative)
+
+// Release calls Destroy() immediately when the refcount drops to 0 to
+// clear the weak references nsXPConnect has to XPCWNs and to ensure there
+// are no pointers to dying protos.
+NS_IMPL_CYCLE_COLLECTING_RELEASE_WITH_LAST_RELEASE(XPCWrappedNative, Destroy())
 
 /*
  *  Wrapped Native lifetime management is messy!
  *
  *  - At creation we push the refcount to 2 (only one of which is owned by
  *    the native caller that caused the wrapper creation).
  *  - During the JS GC Mark phase we mark any wrapper with a refcount > 1.
  *  - The *only* thing that can make the wrapper get destroyed is the
--- a/js/xpconnect/src/xpcprivate.h
+++ b/js/xpconnect/src/xpcprivate.h
@@ -2002,39 +2002,21 @@ TraceXPCGlobal(JSTracer *trc, JSObject *
 
 /***************************************************************************/
 // XPCWrappedNative the wrapper around one instance of a native xpcom object
 // to be used from JavaScript.
 
 class XPCWrappedNative : public nsIXPConnectWrappedNative
 {
 public:
-    NS_DECL_THREADSAFE_ISUPPORTS
+    NS_DECL_CYCLE_COLLECTING_ISUPPORTS
     NS_DECL_NSIXPCONNECTJSOBJECTHOLDER
     NS_DECL_NSIXPCONNECTWRAPPEDNATIVE
-    // No need to unlink the JS objects, if the XPCWrappedNative will be cycle
-    // collected then its mFlatJSObject will be cycle collected too and
-    // finalization of the mFlatJSObject will unlink the js objects (see
-    // XPC_WN_NoHelper_Finalize and FlatJSObjectFinalized).
-    // We also give XPCWrappedNative empty Root/Unroot methods, to avoid
-    // root/unrooting the JS objects from addrefing/releasing the
-    // XPCWrappedNative during unlinking, which would make the JS objects
-    // uncollectable to the JS GC.
-    class NS_CYCLE_COLLECTION_INNERCLASS
-     : public nsXPCOMCycleCollectionParticipant
-    {
-      NS_DECL_CYCLE_COLLECTION_CLASS_BODY(XPCWrappedNative, XPCWrappedNative)
-      NS_IMETHOD_(void) Root(void *p) { }
-      NS_IMETHOD_(void) Unroot(void *p) { }
-      NS_IMPL_GET_XPCOM_CYCLE_COLLECTION_PARTICIPANT(XPCWrappedNative)
-    };
-    NS_CHECK_FOR_RIGHT_PARTICIPANT_IMPL(XPCWrappedNative);
-    static NS_CYCLE_COLLECTION_INNERCLASS NS_CYCLE_COLLECTION_INNERNAME;
-
-    void DeleteCycleCollectable() {}
+
+    NS_DECL_CYCLE_COLLECTION_CLASS(XPCWrappedNative)
 
     nsIPrincipal* GetObjectPrincipal() const;
 
     bool
     IsValid() const { return mFlatJSObject.hasFlag(FLAT_JS_OBJECT_VALID); }
 
 #define XPC_SCOPE_WORD(s)   (intptr_t(s))
 #define XPC_SCOPE_MASK      (intptr_t(0x3))
--- a/layout/base/nsCSSColorUtils.cpp
+++ b/layout/base/nsCSSColorUtils.cpp
@@ -11,33 +11,30 @@
 
 // Weird color computing code stolen from winfe which was stolen
 // from the xfe which was written originally by Eric Bina. So there.
 
 #define RED_LUMINOSITY        299
 #define GREEN_LUMINOSITY      587
 #define BLUE_LUMINOSITY       114
 #define INTENSITY_FACTOR      25
-#define LIGHT_FACTOR          0
 #define LUMINOSITY_FACTOR     75
 
 #define MAX_COLOR             255
 #define COLOR_DARK_THRESHOLD  51
 #define COLOR_LIGHT_THRESHOLD 204
 
 #define COLOR_LITE_BS_FACTOR 45
 #define COLOR_LITE_TS_FACTOR 70
 
 #define COLOR_DARK_BS_FACTOR 30
 #define COLOR_DARK_TS_FACTOR 50
 
 #define LIGHT_GRAY NS_RGB(192, 192, 192)
 #define DARK_GRAY  NS_RGB(96, 96, 96)
-#define WHITE      NS_RGB(255, 255, 255)
-#define BLACK      NS_RGB(0, 0, 0)
 
 #define MAX_BRIGHTNESS  254
 #define MAX_DARKNESS     0
 
 void NS_GetSpecial3DColors(nscolor aResult[2],
                            nscolor aBackgroundColor,
                            nscolor aBorderColor)
 {
--- a/layout/forms/nsColorControlFrame.cpp
+++ b/layout/forms/nsColorControlFrame.cpp
@@ -130,8 +130,18 @@ nsColorControlFrame::AttributeChanged(in
                                                     aModType);
 }
 
 nsIFrame*
 nsColorControlFrame::GetContentInsertionFrame()
 {
   return this;
 }
+
+nsIContent*
+nsColorControlFrame::GetPseudoElementContent(nsCSSPseudoElements::Type aType)
+{
+  if (aType == nsCSSPseudoElements::ePseudo_mozColorSwatch) {
+    return mColorContent;
+  }
+
+  return nsContainerFrame::GetPseudoElementContent(aType);
+}
--- a/layout/forms/nsColorControlFrame.h
+++ b/layout/forms/nsColorControlFrame.h
@@ -39,16 +39,18 @@ public:
 
   // nsIFrame
   NS_IMETHOD AttributeChanged(int32_t  aNameSpaceID,
                               nsIAtom* aAttribute,
                               int32_t  aModType) MOZ_OVERRIDE;
   virtual bool IsLeaf() const MOZ_OVERRIDE { return true; }
   virtual nsIFrame* GetContentInsertionFrame() MOZ_OVERRIDE;
 
+  virtual nsIContent* GetPseudoElementContent(nsCSSPseudoElements::Type aType) MOZ_OVERRIDE;
+
 private:
   nsColorControlFrame(nsStyleContext* aContext);
 
   // Update the color swatch
   nsresult UpdateColor();
 
   nsCOMPtr<nsIContent> mColorContent;
 };
--- a/layout/forms/nsMeterFrame.cpp
+++ b/layout/forms/nsMeterFrame.cpp
@@ -273,8 +273,17 @@ nsMeterFrame::ShouldUseNativeStyle() con
   return StyleDisplay()->mAppearance == NS_THEME_METERBAR &&
          mBarDiv->GetPrimaryFrame()->StyleDisplay()->mAppearance == NS_THEME_METERBAR_CHUNK &&
          !PresContext()->HasAuthorSpecifiedRules(const_cast<nsMeterFrame*>(this),
                                                  NS_AUTHOR_SPECIFIED_BORDER | NS_AUTHOR_SPECIFIED_BACKGROUND) &&
          !PresContext()->HasAuthorSpecifiedRules(mBarDiv->GetPrimaryFrame(),
                                                  NS_AUTHOR_SPECIFIED_BORDER | NS_AUTHOR_SPECIFIED_BACKGROUND);
 }
 
+nsIContent*
+nsMeterFrame::GetPseudoElementContent(nsCSSPseudoElements::Type aType)
+{
+  if (aType == nsCSSPseudoElements::ePseudo_mozMeterBar) {
+    return mBarDiv;
+  }
+
+  return nsContainerFrame::GetPseudoElementContent(aType);
+}
--- a/layout/forms/nsMeterFrame.h
+++ b/layout/forms/nsMeterFrame.h
@@ -61,16 +61,18 @@ public:
       ~(nsIFrame::eReplaced | nsIFrame::eReplacedContainsBlock));
   }
 
   /**
    * Returns whether the frame and its child should use the native style.
    */
   bool ShouldUseNativeStyle() const;
 
+  virtual nsIContent* GetPseudoElementContent(nsCSSPseudoElements::Type aType) MOZ_OVERRIDE;
+
 protected:
   // Helper function which reflow the anonymous div frame.
   void ReflowBarFrame(nsIFrame*                aBarFrame,
                       nsPresContext*           aPresContext,
                       const nsHTMLReflowState& aReflowState,
                       nsReflowStatus&          aStatus);
   /**
    * The div used to show the meter bar.
--- a/layout/forms/nsNumberControlFrame.cpp
+++ b/layout/forms/nsNumberControlFrame.cpp
@@ -373,8 +373,34 @@ nsNumberControlFrame::UpdateForValueChan
     return;
   }
   // We need to update the value of our anonymous text control here. Note that
   // this must be its value, and not its 'value' attribute (the default value),
   // since the default value is ignored once a user types into the text
   // control.
   HTMLInputElement::FromContent(mTextField)->SetValue(aValue);
 }
+
+nsIContent*
+nsNumberControlFrame::GetPseudoElementContent(nsCSSPseudoElements::Type aType)
+{
+  if (aType == nsCSSPseudoElements::ePseudo_mozNumberWrapper) {
+    return mOuterWrapper;
+  }
+
+  if (aType == nsCSSPseudoElements::ePseudo_mozNumberText) {
+    return mTextField;
+  }
+
+  if (aType == nsCSSPseudoElements::ePseudo_mozNumberSpinBox) {
+    return mSpinBox;
+  }
+
+  if (aType == nsCSSPseudoElements::ePseudo_mozNumberSpinUp) {
+    return mSpinUp;
+  }
+
+  if (aType == nsCSSPseudoElements::ePseudo_mozNumberSpinDown) {
+    return mSpinDown;
+  }
+
+  return nsContainerFrame::GetPseudoElementContent(aType);
+}
--- a/layout/forms/nsNumberControlFrame.h
+++ b/layout/forms/nsNumberControlFrame.h
@@ -100,16 +100,18 @@ public:
    * Returns one of the SpinButtonEnum values to depending on whether the
    * pointer event is over the spin-up button, the spin-down button, or
    * neither.
    */
   int32_t GetSpinButtonForPointerEvent(WidgetGUIEvent* aEvent) const;
 
   void HandleFocusEvent(WidgetEvent* aEvent);
 
+  virtual nsIContent* GetPseudoElementContent(nsCSSPseudoElements::Type aType) MOZ_OVERRIDE;
+
 private:
 
   nsresult MakeAnonymousElement(nsIContent** aResult,
                                 nsTArray<ContentInfo>& aElements,
                                 nsIAtom* aTagName,
                                 nsCSSPseudoElements::Type aPseudoType,
                                 nsStyleContext* aParentContext);
 
--- a/layout/forms/nsProgressFrame.cpp
+++ b/layout/forms/nsProgressFrame.cpp
@@ -283,8 +283,17 @@ nsProgressFrame::ShouldUseNativeStyle() 
   return StyleDisplay()->mAppearance == NS_THEME_PROGRESSBAR &&
          mBarDiv->GetPrimaryFrame()->StyleDisplay()->mAppearance == NS_THEME_PROGRESSBAR_CHUNK &&
          !PresContext()->HasAuthorSpecifiedRules(const_cast<nsProgressFrame*>(this),
                                                  NS_AUTHOR_SPECIFIED_BORDER | NS_AUTHOR_SPECIFIED_BACKGROUND) &&
          !PresContext()->HasAuthorSpecifiedRules(mBarDiv->GetPrimaryFrame(),
                                                  NS_AUTHOR_SPECIFIED_BORDER | NS_AUTHOR_SPECIFIED_BACKGROUND);
 }
 
+nsIContent*
+nsProgressFrame::GetPseudoElementContent(nsCSSPseudoElements::Type aType)
+{
+  if (aType == nsCSSPseudoElements::ePseudo_mozProgressBar) {
+    return mBarDiv;
+  }
+
+  return nsContainerFrame::GetPseudoElementContent(aType);
+}
--- a/layout/forms/nsProgressFrame.h
+++ b/layout/forms/nsProgressFrame.h
@@ -66,16 +66,18 @@ public:
       ~(nsIFrame::eReplaced | nsIFrame::eReplacedContainsBlock));
   }
 
   /**
    * Returns whether the frame and its child should use the native style.
    */
   bool ShouldUseNativeStyle() const;
 
+  virtual nsIContent* GetPseudoElementContent(nsCSSPseudoElements::Type aType) MOZ_OVERRIDE;
+
 protected:
   // Helper function which reflow the anonymous div frame.
   void ReflowBarFrame(nsIFrame*                aBarFrame,
                       nsPresContext*           aPresContext,
                       const nsHTMLReflowState& aReflowState,
                       nsReflowStatus&          aStatus);
 
   /**
--- a/layout/forms/nsRangeFrame.cpp
+++ b/layout/forms/nsRangeFrame.cpp
@@ -827,8 +827,26 @@ nsRangeFrame::ShouldUseNativeStyle() con
                                                   NS_AUTHOR_SPECIFIED_BACKGROUND)) &&
          !PresContext()->HasAuthorSpecifiedRules(mTrackDiv->GetPrimaryFrame(),
                                                  STYLES_DISABLING_NATIVE_THEMING) &&
          !PresContext()->HasAuthorSpecifiedRules(mProgressDiv->GetPrimaryFrame(),
                                                  STYLES_DISABLING_NATIVE_THEMING) &&
          !PresContext()->HasAuthorSpecifiedRules(mThumbDiv->GetPrimaryFrame(),
                                                  STYLES_DISABLING_NATIVE_THEMING);
 }
+
+nsIContent*
+nsRangeFrame::GetPseudoElementContent(nsCSSPseudoElements::Type aType)
+{
+  if (aType == nsCSSPseudoElements::ePseudo_mozRangeTrack) {
+    return mTrackDiv;
+  }
+
+  if (aType == nsCSSPseudoElements::ePseudo_mozRangeThumb) {
+    return mThumbDiv;
+  }
+
+  if (aType == nsCSSPseudoElements::ePseudo_mozRangeProgress) {
+    return mProgressDiv;
+  }
+
+  return nsContainerFrame::GetPseudoElementContent(aType);
+}
--- a/layout/forms/nsRangeFrame.h
+++ b/layout/forms/nsRangeFrame.h
@@ -117,16 +117,18 @@ public:
    * Helper that's used when the value of the range changes to reposition the
    * thumb, resize the range-progress element, and schedule a repaint. (This
    * does not reflow, since the position and size of the thumb and
    * range-progress element do not affect the position or size of any other
    * frames.)
    */
   void UpdateForValueChange();
 
+  virtual nsIContent* GetPseudoElementContent(nsCSSPseudoElements::Type aType) MOZ_OVERRIDE;
+
 private:
 
   nsresult MakeAnonymousDiv(nsIContent** aResult,
                             nsCSSPseudoElements::Type aPseudoType,
                             nsTArray<ContentInfo>& aElements);
 
   // Helper function which reflows the anonymous div frames.
   nsresult ReflowAnonymousContent(nsPresContext*           aPresContext,
--- a/layout/forms/nsTextControlFrame.cpp
+++ b/layout/forms/nsTextControlFrame.cpp
@@ -1427,16 +1427,27 @@ nsTextControlFrame::BuildDisplayList(nsD
     if (kid->GetContent() != txtCtrl->GetPlaceholderNode() ||
         txtCtrl->GetPlaceholderVisibility()) {
       BuildDisplayListForChild(aBuilder, kid, aDirtyRect, set, 0);
     }
     kid = kid->GetNextSibling();
   }
 }
 
+nsIContent*
+nsTextControlFrame::GetPseudoElementContent(nsCSSPseudoElements::Type aType)
+{
+  if (aType == nsCSSPseudoElements::ePseudo_mozPlaceholder) {
+    nsCOMPtr<nsITextControlElement> txtCtrl = do_QueryInterface(GetContent());
+    return txtCtrl->GetPlaceholderNode();
+  }
+
+  return nsContainerFrame::GetPseudoElementContent(aType);
+}
+
 NS_IMETHODIMP
 nsTextControlFrame::EditorInitializer::Run()
 {
   if (!mFrame) {
     return NS_OK;
   }
 
   // Need to block script to avoid bug 669767.
--- a/layout/forms/nsTextControlFrame.h
+++ b/layout/forms/nsTextControlFrame.h
@@ -89,16 +89,18 @@ public:
 
   NS_IMETHOD SetInitialChildList(ChildListID     aListID,
                                  nsFrameList&    aChildList) MOZ_OVERRIDE;
 
   virtual void BuildDisplayList(nsDisplayListBuilder*   aBuilder,
                                 const nsRect&           aDirtyRect,
                                 const nsDisplayListSet& aLists) MOZ_OVERRIDE;
 
+  virtual nsIContent* GetPseudoElementContent(nsCSSPseudoElements::Type aType) MOZ_OVERRIDE;
+
 //==== BEGIN NSIFORMCONTROLFRAME
   virtual void SetFocus(bool aOn , bool aRepaint) MOZ_OVERRIDE; 
   virtual nsresult SetFormProperty(nsIAtom* aName, const nsAString& aValue) MOZ_OVERRIDE;
 
 //==== END NSIFORMCONTROLFRAME
 
 //==== NSITEXTCONTROLFRAME
 
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -8100,16 +8100,30 @@ nsIFrame::DestroyRegion(void* aPropertyV
 bool
 nsIFrame::IsPseudoStackingContextFromStyle() {
   const nsStyleDisplay* disp = StyleDisplay();
   return disp->mOpacity != 1.0f ||
          disp->IsPositioned(this) ||
          disp->IsFloating(this);
 }
 
+nsIContent*
+nsIFrame::GetPseudoElementContent(nsCSSPseudoElements::Type aType)
+{
+  nsIFrame* frame = nullptr;
+
+  if (aType == nsCSSPseudoElements::ePseudo_before) {
+    frame = nsLayoutUtils::GetBeforeFrame(this);
+  } else if (aType == nsCSSPseudoElements::ePseudo_after) {
+    frame = nsLayoutUtils::GetAfterFrame(this);
+  }
+
+  return frame ? frame->GetContent() : nullptr;
+}
+
 nsIFrame::ContentOffsets::ContentOffsets()
 {
 }
 
 nsIFrame::ContentOffsets::ContentOffsets(const ContentOffsets& rhs)
   : content(rhs.content),
     offset(rhs.offset),
     secondaryOffset(rhs.secondaryOffset),
--- a/layout/generic/nsIFrame.h
+++ b/layout/generic/nsIFrame.h
@@ -3016,16 +3016,23 @@ NS_PTR_TO_INT32(frame->Properties().Get(
   /**
    * Return whether this is a frame whose width is used when computing
    * the font size inflation of its descendants.
    */
   bool IsContainerForFontSizeInflation() const {
     return GetStateBits() & NS_FRAME_FONT_INFLATION_CONTAINER;
   }
 
+  /**
+   * Returns the content node within the anonymous content that this frame
+   * generated and which corresponds to the specified pseudo-element type,
+   * or nullptr if there is no such anonymous content.
+   */
+  virtual nsIContent* GetPseudoElementContent(nsCSSPseudoElements::Type aType);
+
 protected:
   // Members
   nsRect           mRect;