aboutsummaryrefslogtreecommitdiffstats
path: root/www/firefox
diff options
context:
space:
mode:
authorflo <flo@FreeBSD.org>2013-04-04 04:27:48 +0800
committerflo <flo@FreeBSD.org>2013-04-04 04:27:48 +0800
commit0150240fa08cbc859bbd979041e4e48f4b7700db (patch)
treefc7673f01258f369254c78eaa2111a667c2fd1f7 /www/firefox
parent104fe6e6b31270527f5f6fc15ae0d04ab9452e3d (diff)
downloadfreebsd-ports-gnome-0150240fa08cbc859bbd979041e4e48f4b7700db.tar.gz
freebsd-ports-gnome-0150240fa08cbc859bbd979041e4e48f4b7700db.tar.zst
freebsd-ports-gnome-0150240fa08cbc859bbd979041e4e48f4b7700db.zip
- update thunderbird, firefox-esr, linux-thunderbird and linux-firefox to
17.0.5 - update firefox to 20.0 - update seamonkey and linux-seamonkey to 2.17 - update nspr to 4.9.6 - remove mail/thunderbird-esr, Mozilla stopped providing 2 versions of thunderbird - prune support for old FreeBSD versions; users of 8.2, 7.4 or earlier are advised to upgrade - http://www.freebsd.org/security/ - add vuln.xml entry Security: 94976433-9c74-11e2-a9fc-d43d7e0c7c02 Approved by: portmgr (miwi) In collaboration with: Jan Beich <jbeich@tormail.org>
Diffstat (limited to 'www/firefox')
-rw-r--r--www/firefox/Makefile16
-rw-r--r--www/firefox/Makefile.options1
-rw-r--r--www/firefox/distinfo4
-rw-r--r--www/firefox/files/patch-alsapulse122
-rw-r--r--www/firefox/files/patch-browser-app-nsBrowserApp.cpp8
-rw-r--r--www/firefox/files/patch-bug78043217
-rw-r--r--www/firefox/files/patch-bug7878043557
-rw-r--r--www/firefox/files/patch-bug80348041
-rw-r--r--www/firefox/files/patch-bug807492273
-rw-r--r--www/firefox/files/patch-bug81071668
-rw-r--r--www/firefox/files/patch-bug81726736
-rw-r--r--www/firefox/files/patch-bug81748126
-rw-r--r--www/firefox/files/patch-bug82431714
-rw-r--r--www/firefox/files/patch-bug826985428
-rw-r--r--www/firefox/files/patch-bug827521147
-rw-r--r--www/firefox/files/patch-bug83682433
-rw-r--r--www/firefox/files/patch-bug844818126
-rw-r--r--www/firefox/files/patch-content-media-AudioStream.cpp11
-rw-r--r--www/firefox/files/patch-gfx-ots-include-opentype-sanitiser.h18
-rw-r--r--www/firefox/files/patch-ipc-chromium-src-base-platform_thread_posix.cc16
-rw-r--r--www/firefox/files/patch-js-src-js-confdefs.h.in10
-rw-r--r--www/firefox/files/patch-media-webrtc-trunk-src-modules-audio_device-main-source-linux-latebindingsymboltable_linux.cc37
-rw-r--r--www/firefox/files/patch-media-webrtc-trunk-src-system_wrappers-source-spreadsortlib-spreadsort.hpp4
-rw-r--r--www/firefox/files/patch-media-webrtc-trunk-src-system_wrappers-source-thread_posix.cc16
-rw-r--r--www/firefox/files/patch-python-psutil-psutil-_psutil_bsd.c13
-rw-r--r--www/firefox/files/patch-z-bug81591627
-rw-r--r--www/firefox/pkg-message2
27 files changed, 715 insertions, 4356 deletions
diff --git a/www/firefox/Makefile b/www/firefox/Makefile
index 23fe43952339..aea6f0c49065 100644
--- a/www/firefox/Makefile
+++ b/www/firefox/Makefile
@@ -2,7 +2,7 @@
# $FreeBSD$
PORTNAME= firefox
-DISTVERSION= 19.0.2
+DISTVERSION= 20.0
PORTEPOCH= 1
CATEGORIES= www ipv6
MASTER_SITES= ${MASTER_SITE_MOZILLA}
@@ -13,7 +13,7 @@ MAINTAINER= gecko@FreeBSD.org
COMMENT= Web browser based on the browser portion of Mozilla
BUILD_DEPENDS= nspr>=4.9.4:${PORTSDIR}/devel/nspr \
- nss>=3.14.1:${PORTSDIR}/security/nss \
+ nss>=3.14.3:${PORTSDIR}/security/nss \
sqlite3>=3.7.14.1:${PORTSDIR}/databases/sqlite3 \
${PYTHON_PKGNAMEPREFIX}sqlite3>0:${PORTSDIR}/databases/py-sqlite3 \
cairo>=1.10.2_1,1:${PORTSDIR}/graphics/cairo \
@@ -57,17 +57,6 @@ OPTIONS_DEFAULT:=${OPTIONS_DEFAULT:S/OSS/ALSA/}
WRKSRC:= ${WRKDIR}/mozilla-release
-.if ${ARCH} == amd64
-CONFIGURE_TARGET=x86_64-portbld-freebsd${OSREL}
-.elif ${ARCH} == powerpc64
-.if ${OSVERSION} < 900033
-BROKEN= Needs binutils 2.17.50 to build
-.else
-MOZ_EXPORT+= UNAME_m="powerpc64"
-CFLAGS+= -mminimal-toc
-.endif
-.endif
-
.if ${PORT_OPTIONS:MPGO}
USE_GCC?= yes
USE_DISPLAY= yes
@@ -102,6 +91,7 @@ post-extract:
post-patch:
@${REINPLACE_CMD} -e '/MOZPNG/s/=[0-9]*/=10511/' \
+ -e '/^SQLITE_VERSION/s/=.*/=3.7.14.1/' \
${WRKSRC}/configure.in
@${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|g' \
${WRKSRC}/browser/app/nsBrowserApp.cpp
diff --git a/www/firefox/Makefile.options b/www/firefox/Makefile.options
index f4d4f7de1280..61f1dde43ffb 100644
--- a/www/firefox/Makefile.options
+++ b/www/firefox/Makefile.options
@@ -8,6 +8,7 @@ OPTIONS_SINGLE+= AUDIO
OPTIONS_SINGLE_AUDIO= ALSA OSS PULSEAUDIO
ENIGMAIL_DESC?= Enigmail extension
+GIO_DESC?= GIO for file I/O # move to bsd.options.desc.mk
GNOMEUI_DESC?= libgnomeui support module
LIBPROXY_DESC?= Proxy support via libproxy
LIGHTNING_DESC?= Calendar extension
diff --git a/www/firefox/distinfo b/www/firefox/distinfo
index 8245bff50a5f..268c587b4b92 100644
--- a/www/firefox/distinfo
+++ b/www/firefox/distinfo
@@ -1,2 +1,2 @@
-SHA256 (firefox-19.0.2.source.tar.bz2) = f6850dbdaf63a67a184b3b23267619750981f291834fe8c04df9cea826a57d71
-SIZE (firefox-19.0.2.source.tar.bz2) = 99155868
+SHA256 (firefox-20.0.source.tar.bz2) = 69818444915d3002a0d15583d47bc86fcf5027b53fab2a8a91ae18a7bfa20577
+SIZE (firefox-20.0.source.tar.bz2) = 100311453
diff --git a/www/firefox/files/patch-alsapulse b/www/firefox/files/patch-alsapulse
deleted file mode 100644
index 6a8bad77fc17..000000000000
--- a/www/firefox/files/patch-alsapulse
+++ /dev/null
@@ -1,122 +0,0 @@
-diff --git configure.in configure.in
-index 5980b76..11f5f77 100644
---- configure.in
-+++ configure.in
-@@ -5618,11 +5618,25 @@ dnl ========================================================
-
- dnl If using sydneyaudio with Linux, ensure that the alsa library is available
- if test -n "$MOZ_SYDNEYAUDIO" -a "$OS_TARGET" = "Linux"; then
-+ MOZ_ALSA=1
-+fi
-+
-+MOZ_ARG_ENABLE_BOOL(alsa,
-+[ --enable-alsa Enable Alsa support (default on Linux)],
-+MOZ_ALSA=1,
-+MOZ_ALSA=)
-+
-+if test -n "$MOZ_ALSA"; then
-+ AC_DEFINE(MOZ_CUBEB)
- PKG_CHECK_MODULES(MOZ_ALSA, alsa, ,
- [echo "$MOZ_ALSA_PKG_ERRORS"
- AC_MSG_ERROR([Need alsa for Ogg, Wave or WebM decoding on Linux. Disable with --disable-ogg --disable-wave --disable-webm. (On Ubuntu, you might try installing the package libasound2-dev.)])])
- fi
-
-+AC_SUBST(MOZ_ALSA)
-+AC_SUBST(MOZ_ALSA_CFLAGS)
-+AC_SUBST(MOZ_ALSA_LIBS)
-+
- dnl ========================================================
- dnl = Enable PulseAudio
- dnl ========================================================
-@@ -8633,8 +8647,6 @@ AC_SUBST(MOZ_VP8_ERROR_CONCEALMENT)
- AC_SUBST(MOZ_VP8_ENCODER)
- AC_SUBST(MOZ_VP8)
- AC_SUBST(MOZ_OGG)
--AC_SUBST(MOZ_ALSA_LIBS)
--AC_SUBST(MOZ_ALSA_CFLAGS)
- AC_SUBST(VPX_AS)
- AC_SUBST(VPX_ASFLAGS)
- AC_SUBST(VPX_DASH_C_FLAG)
-diff --git media/libcubeb/src/Makefile.in media/libcubeb/src/Makefile.in
-index 5ab4dd8..c8df26f 100644
---- media/libcubeb/src/Makefile.in
-+++ media/libcubeb/src/Makefile.in
-@@ -24,10 +24,6 @@ endif
-
- ifeq ($(OS_TARGET),Android)
- # No Android implementation of libcubeb yet.
--else ifeq ($(OS_TARGET),Linux)
--CSRCS = \
-- cubeb_alsa.c \
-- $(NULL)
- endif
-
- ifeq ($(OS_TARGET),Darwin)
-@@ -42,6 +38,12 @@ CSRCS = \
- $(NULL)
- endif
-
-+ifdef MOZ_ALSA
-+CSRCS = \
-+ cubeb_alsa.c \
-+ $(NULL)
-+endif
-+
- ifdef MOZ_PULSEAUDIO
- CSRCS = \
- cubeb_pulse.c \
-diff --git media/libsydneyaudio/src/Makefile.in media/libsydneyaudio/src/Makefile.in
-index 8dda8ce..b19641d 100644
---- media/libsydneyaudio/src/Makefile.in
-+++ media/libsydneyaudio/src/Makefile.in
-@@ -30,10 +30,6 @@ else ifeq ($(MOZ_WIDGET_TOOLKIT),android)
- CSRCS = \
- sydney_audio_android.c \
- $(NULL)
--else ifeq ($(OS_ARCH),Linux)
--CSRCS = \
-- sydney_audio_alsa.c \
-- $(NULL)
- endif
-
- ifeq ($(OS_ARCH),WINNT)
-@@ -68,6 +64,18 @@ CSRCS = \
- $(NULL)
- endif
-
-+ifdef MOZ_ALSA
-+CSRCS = \
-+ sydney_audio_alsa.c \
-+ $(NULL)
-+endif
-+
-+ifdef MOZ_PULSEAUDIO
-+CSRCS = \
-+ sydney_audio_pulseaudio.c \
-+ $(NULL)
-+endif
-+
- ifeq ($(OS_ARCH),WINNT)
- OS_LIBS += winmm.lib
- endif
-diff --git toolkit/library/Makefile.in toolkit/library/Makefile.in
-index 43384e9..e46a6e3 100644
---- toolkit/library/Makefile.in
-+++ toolkit/library/Makefile.in
-@@ -370,14 +370,11 @@ endif
-
- EXTRA_DSO_LDOPTS += $(call EXPAND_LIBNAME_PATH,gkmedias,$(DIST)/lib)
-
--ifdef MOZ_SYDNEYAUDIO
--ifeq ($(OS_ARCH),Linux)
-+ifneq (,$(MOZ_CUBEB)$(MOZ_SYDNEYAUDIO))
-+ifdef MOZ_ALSA
- EXTRA_DSO_LDOPTS += $(MOZ_ALSA_LIBS)
- endif
--endif
--
- ifdef MOZ_PULSEAUDIO
--ifdef MOZ_CUBEB
- EXTRA_DSO_LDOPTS += $(MOZ_PULSEAUDIO_LIBS)
- endif
- endif
diff --git a/www/firefox/files/patch-browser-app-nsBrowserApp.cpp b/www/firefox/files/patch-browser-app-nsBrowserApp.cpp
index 2d5190639b79..b8ff70542e0d 100644
--- a/www/firefox/files/patch-browser-app-nsBrowserApp.cpp
+++ b/www/firefox/files/patch-browser-app-nsBrowserApp.cpp
@@ -1,10 +1,10 @@
--- browser/app/nsBrowserApp.cpp~
+++ browser/app/nsBrowserApp.cpp
-@@ -197,6 +197,7 @@ int main(int argc, char* argv[])
+@@ -334,6 +334,7 @@ int main(int argc, char* argv[])
TriggerQuirks();
#endif
+ setenv("MOZ_PLUGIN_PATH", "%%LOCALBASE%%/lib/browser_plugins/symlinks/gecko19:%%LOCALBASE%%/lib/npapi/symlinks/firefox", 0);
- nsresult rv = mozilla::BinaryPath::Get(argv[0], exePath);
- if (NS_FAILED(rv)) {
- Output("Couldn't calculate the application directory.\n");
+ int gotCounters;
+ #if defined(XP_UNIX)
+ struct rusage initialRUsage;
diff --git a/www/firefox/files/patch-bug780432 b/www/firefox/files/patch-bug780432
new file mode 100644
index 000000000000..076903cdeebc
--- /dev/null
+++ b/www/firefox/files/patch-bug780432
@@ -0,0 +1,17 @@
+diff --git media/libsydneyaudio/src/Makefile.in media/libsydneyaudio/src/Makefile.in
+index 8dda8ce..b19641d 100644
+--- media/libsydneyaudio/src/Makefile.in
++++ media/libsydneyaudio/src/Makefile.in
+@@ -68,6 +68,12 @@ ifdef MOZ_ALSA
+ $(NULL)
+ endif
+
++ifdef MOZ_PULSEAUDIO
++CSRCS = \
++ sydney_audio_pulseaudio.c \
++ $(NULL)
++endif
++
+ ifeq ($(OS_ARCH),WINNT)
+ OS_LIBS += winmm.lib
+ endif
diff --git a/www/firefox/files/patch-bug787804 b/www/firefox/files/patch-bug787804
deleted file mode 100644
index fd15771519d9..000000000000
--- a/www/firefox/files/patch-bug787804
+++ /dev/null
@@ -1,3557 +0,0 @@
-commit 74997f1
-Author: Jan Varga <jan.varga@gmail.com>
-Date: Mon Dec 17 20:25:10 2012 +0100
-
- Bug 787804 - Rewrite quota handling (eliminate test_quota.c). r=bent,asuth,vladan
----
- db/sqlite3/README.MOZILLA | 4 +-
- db/sqlite3/src/sqlite.def | 1 +
- db/sqlite3/src/test_quota.c | 2001 --------------------
- db/sqlite3/src/test_quota.h | 274 ---
- dom/Makefile.in | 1 +
- dom/dom-config.mk | 1 +
- dom/file/FileStreamWrappers.cpp | 11 -
- dom/file/LockedFile.cpp | 8 +-
- dom/file/nsIFileStorage.h | 40 +-
- dom/indexedDB/FileManager.cpp | 33 +-
- dom/indexedDB/FileManager.h | 20 +-
- dom/indexedDB/FileStream.cpp | 321 ----
- dom/indexedDB/FileStream.h | 140 --
- dom/indexedDB/IDBDatabase.cpp | 6 +
- dom/indexedDB/IDBFactory.cpp | 28 +-
- dom/indexedDB/IDBFactory.h | 8 +-
- dom/indexedDB/IDBFileHandle.cpp | 25 +-
- dom/indexedDB/IDBObjectStore.cpp | 10 +-
- dom/indexedDB/IDBTransaction.cpp | 3 +-
- dom/indexedDB/IndexedDatabaseInlines.h | 13 +
- dom/indexedDB/IndexedDatabaseManager.cpp | 162 +-
- dom/indexedDB/IndexedDatabaseManager.h | 11 +-
- dom/indexedDB/Makefile.in | 2 -
- dom/indexedDB/OpenDatabaseHelper.cpp | 104 +-
- dom/indexedDB/OpenDatabaseHelper.h | 12 +-
- dom/indexedDB/nsIStandardFileStream.idl | 60 -
- dom/indexedDB/test/Makefile.in | 2 +
- dom/indexedDB/test/file.js | 21 +-
- dom/indexedDB/test/test_file_quota.html | 14 +-
- dom/indexedDB/test/test_filehandle_quota.html | 5 +-
- dom/quota/FileStreams.cpp | 123 ++
- dom/quota/FileStreams.h | 115 ++
- dom/quota/Makefile.in | 33 +
- dom/quota/QuotaCommon.h | 23 +
- dom/quota/QuotaManager.cpp | 294 +++
- dom/quota/QuotaManager.h | 147 ++
- layout/build/Makefile.in | 1 +
- netwerk/base/src/Makefile.in | 1 +
- netwerk/base/src/nsFileStreams.cpp | 103 +-
- netwerk/base/src/nsFileStreams.h | 12 +-
- storage/public/Makefile.in | 1 -
- storage/public/mozIStorageService.idl | 13 +-
- .../public/mozIStorageServiceQuotaManagement.idl | 99 -
- storage/public/storage.h | 1 -
- storage/src/TelemetryVFS.cpp | 35 +-
- storage/src/mozStorageConnection.cpp | 85 +-
- storage/src/mozStorageConnection.h | 27 +-
- storage/src/mozStorageService.cpp | 168 +-
- storage/src/mozStorageService.h | 3 -
- toolkit/toolkit-makefiles.sh | 1 +
- 50 files changed, 1239 insertions(+), 3387 deletions(-)
-
-diff --git dom/Makefile.in dom/Makefile.in
-index 672e065..47cd253 100644
---- dom/Makefile.in
-+++ dom/Makefile.in
-@@ -58,6 +58,7 @@ PARALLEL_DIRS += \
- media \
- messages \
- power \
-+ quota \
- settings \
- sms \
- mms \
-diff --git dom/dom-config.mk dom/dom-config.mk
-index d0f46cc..1cf57ed 100644
---- dom/dom-config.mk
-+++ dom/dom-config.mk
-@@ -8,6 +8,7 @@ DOM_SRCDIRS = \
- dom/encoding \
- dom/file \
- dom/power \
-+ dom/quota \
- dom/media \
- dom/network/src \
- dom/settings \
-diff --git dom/file/FileStreamWrappers.cpp dom/file/FileStreamWrappers.cpp
-index 2283266..c4cf102 100644
---- dom/file/FileStreamWrappers.cpp
-+++ dom/file/FileStreamWrappers.cpp
-@@ -8,7 +8,6 @@
-
- #include "nsIFileStorage.h"
- #include "nsISeekableStream.h"
--#include "nsIStandardFileStream.h"
- #include "mozilla/Attributes.h"
-
- #include "FileHelper.h"
-@@ -246,16 +245,6 @@ FileOutputStreamWrapper::Close()
- nsresult rv = NS_OK;
-
- if (!mFirstTime) {
-- // We must flush buffers of the stream on the same thread on which we wrote
-- // some data.
-- nsCOMPtr<nsIStandardFileStream> sstream = do_QueryInterface(mFileStream);
-- if (sstream) {
-- rv = sstream->FlushBuffers();
-- if (NS_FAILED(rv)) {
-- NS_WARNING("Failed to flush buffers of the stream!");
-- }
-- }
--
- NS_ASSERTION(PR_GetCurrentThread() == mWriteThread,
- "Unsetting thread locals on wrong thread!");
- mFileHelper->mFileStorage->UnsetThreadLocals();
-diff --git dom/file/LockedFile.cpp dom/file/LockedFile.cpp
-index 0fca730..926df91 100644
---- dom/file/LockedFile.cpp
-+++ dom/file/LockedFile.cpp
-@@ -953,10 +953,10 @@ FinishHelper::Run()
- }
-
- for (uint32_t index = 0; index < mParallelStreams.Length(); index++) {
-- nsCOMPtr<nsIOutputStream> ostream =
-+ nsCOMPtr<nsIInputStream> stream =
- do_QueryInterface(mParallelStreams[index]);
-
-- if (NS_FAILED(ostream->Close())) {
-+ if (NS_FAILED(stream->Close())) {
- NS_WARNING("Failed to close stream!");
- }
-
-@@ -964,9 +964,9 @@ FinishHelper::Run()
- }
-
- if (mStream) {
-- nsCOMPtr<nsIOutputStream> ostream = do_QueryInterface(mStream);
-+ nsCOMPtr<nsIInputStream> stream = do_QueryInterface(mStream);
-
-- if (NS_FAILED(ostream->Close())) {
-+ if (NS_FAILED(stream->Close())) {
- NS_WARNING("Failed to close stream!");
- }
-
-diff --git dom/file/nsIFileStorage.h dom/file/nsIFileStorage.h
-index 92bb608..e985f0a 100644
---- dom/file/nsIFileStorage.h
-+++ dom/file/nsIFileStorage.h
-@@ -10,14 +10,17 @@
- #include "nsISupports.h"
-
- #define NS_FILESTORAGE_IID \
-- {0xbba9c2ff, 0x85c9, 0x47c1, \
-- { 0xaf, 0xce, 0x0a, 0x7e, 0x6f, 0x21, 0x50, 0x95 } }
-+ {0xa0801944, 0x2f1c, 0x4203, \
-+ { 0x9c, 0xaa, 0xaa, 0x47, 0xe0, 0x0c, 0x67, 0x92 } }
-
- class nsIFileStorage : public nsISupports
- {
- public:
- NS_DECLARE_STATIC_IID_ACCESSOR(NS_FILESTORAGE_IID)
-
-+ virtual const nsACString&
-+ StorageOrigin() = 0;
-+
- virtual nsISupports*
- StorageId() = 0;
-
-@@ -36,20 +39,23 @@ public:
-
- NS_DEFINE_STATIC_IID_ACCESSOR(nsIFileStorage, NS_FILESTORAGE_IID)
-
--#define NS_DECL_NSIFILESTORAGE \
-- virtual nsISupports* \
-- StorageId(); \
-- \
-- virtual bool \
-- IsStorageInvalidated(); \
-- \
-- virtual bool \
-- IsStorageShuttingDown(); \
-- \
-- virtual void \
-- SetThreadLocals(); \
-- \
-- virtual void \
-- UnsetThreadLocals();
-+#define NS_DECL_NSIFILESTORAGE \
-+ virtual const nsACString& \
-+ StorageOrigin() MOZ_OVERRIDE; \
-+ \
-+ virtual nsISupports* \
-+ StorageId() MOZ_OVERRIDE; \
-+ \
-+ virtual bool \
-+ IsStorageInvalidated() MOZ_OVERRIDE; \
-+ \
-+ virtual bool \
-+ IsStorageShuttingDown() MOZ_OVERRIDE; \
-+ \
-+ virtual void \
-+ SetThreadLocals() MOZ_OVERRIDE; \
-+ \
-+ virtual void \
-+ UnsetThreadLocals() MOZ_OVERRIDE;
-
- #endif // nsIFileStorage_h__
-diff --git dom/indexedDB/FileManager.cpp dom/indexedDB/FileManager.cpp
-index 9db56e8..4ed6e9e 100644
---- dom/indexedDB/FileManager.cpp
-+++ dom/indexedDB/FileManager.cpp
-@@ -7,8 +7,8 @@
- #include "FileManager.h"
-
- #include "mozIStorageConnection.h"
--#include "mozIStorageServiceQuotaManagement.h"
- #include "mozIStorageStatement.h"
-+#include "nsIInputStream.h"
- #include "nsISimpleEnumerator.h"
-
- #include "mozStorageCID.h"
-@@ -18,6 +18,8 @@
- #include "IndexedDatabaseManager.h"
- #include "OpenDatabaseHelper.h"
-
-+#include "IndexedDatabaseInlines.h"
-+
- #define JOURNAL_DIRECTORY_NAME "journals"
-
- USING_INDEXEDDB_NAMESPACE
-@@ -262,13 +264,11 @@ FileManager::GetFileForId(nsIFile* aDirectory, int64_t aId)
-
- // static
- nsresult
--FileManager::InitDirectory(mozIStorageServiceQuotaManagement* aService,
-- nsIFile* aDirectory,
-+FileManager::InitDirectory(nsIFile* aDirectory,
- nsIFile* aDatabaseFile,
-- FactoryPrivilege aPrivilege)
-+ const nsACString& aOrigin)
- {
- NS_ASSERTION(!NS_IsMainThread(), "Wrong thread!");
-- NS_ASSERTION(aService, "Null service!");
- NS_ASSERTION(aDirectory, "Null directory!");
- NS_ASSERTION(aDatabaseFile, "Null database file!");
-
-@@ -310,8 +310,8 @@ FileManager::InitDirectory(mozIStorageServiceQuotaManagement* aService,
-
- if (hasElements) {
- nsCOMPtr<mozIStorageConnection> connection;
-- rv = OpenDatabaseHelper::CreateDatabaseConnection(
-- NullString(), aDatabaseFile, aDirectory, getter_AddRefs(connection));
-+ rv = OpenDatabaseHelper::CreateDatabaseConnection(aDatabaseFile,
-+ aDirectory, NullString(), aOrigin, getter_AddRefs(connection));
- NS_ENSURE_SUCCESS(rv, rv);
-
- mozStorageTransaction transaction(connection, false);
-@@ -377,12 +377,17 @@ FileManager::InitDirectory(mozIStorageServiceQuotaManagement* aService,
- }
- }
-
-- if (aPrivilege == Chrome) {
-- return NS_OK;
-- }
-+ return NS_OK;
-+}
-+
-+// static
-+nsresult
-+FileManager::GetUsage(nsIFile* aDirectory, uint64_t* aUsage)
-+{
-+ uint64_t usage = 0;
-
- nsCOMPtr<nsISimpleEnumerator> entries;
-- rv = aDirectory->GetDirectoryEntries(getter_AddRefs(entries));
-+ nsresult rv = aDirectory->GetDirectoryEntries(getter_AddRefs(entries));
- NS_ENSURE_SUCCESS(rv, rv);
-
- bool hasMore;
-@@ -402,9 +407,13 @@ FileManager::InitDirectory(mozIStorageServiceQuotaManagement* aService,
- continue;
- }
-
-- rv = aService->UpdateQuotaInformationForFile(file);
-+ int64_t fileSize;
-+ rv = file->GetFileSize(&fileSize);
- NS_ENSURE_SUCCESS(rv, rv);
-+
-+ IncrementUsage(&usage, uint64_t(fileSize));
- }
-
-+ *aUsage = usage;
- return NS_OK;
- }
-diff --git dom/indexedDB/FileManager.h dom/indexedDB/FileManager.h
-index 2c72d0a..370d4a8 100644
---- dom/indexedDB/FileManager.h
-+++ dom/indexedDB/FileManager.h
-@@ -24,10 +24,10 @@ class FileManager
- friend class FileInfo;
-
- public:
-- FileManager(const nsACString& aOrigin,
-+ FileManager(const nsACString& aOrigin, FactoryPrivilege aPrivilege,
- const nsAString& aDatabaseName)
-- : mOrigin(aOrigin), mDatabaseName(aDatabaseName), mLastFileId(0),
-- mInvalidated(false)
-+ : mOrigin(aOrigin), mPrivilege(aPrivilege), mDatabaseName(aDatabaseName),
-+ mLastFileId(0), mInvalidated(false)
- { }
-
- ~FileManager()
-@@ -40,6 +40,11 @@ public:
- return mOrigin;
- }
-
-+ const FactoryPrivilege& Privilege() const
-+ {
-+ return mPrivilege;
-+ }
-+
- const nsAString& DatabaseName() const
- {
- return mDatabaseName;
-@@ -68,12 +73,15 @@ public:
- static already_AddRefed<nsIFile> GetFileForId(nsIFile* aDirectory,
- int64_t aId);
-
-- static nsresult InitDirectory(mozIStorageServiceQuotaManagement* aService,
-- nsIFile* aDirectory, nsIFile* aDatabaseFile,
-- FactoryPrivilege aPrivilege);
-+ static nsresult InitDirectory(nsIFile* aDirectory,
-+ nsIFile* aDatabaseFile,
-+ const nsACString& aOrigin);
-+
-+ static nsresult GetUsage(nsIFile* aDirectory, uint64_t* aUsage);
-
- private:
- nsCString mOrigin;
-+ FactoryPrivilege mPrivilege;
- nsString mDatabaseName;
-
- nsString mDirectoryPath;
-diff --git dom/indexedDB/FileStream.cpp dom/indexedDB/FileStream.cpp
-deleted file mode 100644
-index dddf5d5..0000000
---- dom/indexedDB/FileStream.cpp
-+++ /dev/null
-@@ -1,321 +0,0 @@
--/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
--/* vim: set ts=2 et sw=2 tw=80: */
--/* 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 "FileStream.h"
--
--#include "nsIFile.h"
--
--#include "nsThreadUtils.h"
--#include "test_quota.h"
--
--USING_INDEXEDDB_NAMESPACE
--
--NS_IMPL_THREADSAFE_ADDREF(FileStream)
--NS_IMPL_THREADSAFE_RELEASE(FileStream)
--
--NS_INTERFACE_MAP_BEGIN(FileStream)
-- NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIStandardFileStream)
-- NS_INTERFACE_MAP_ENTRY(nsISeekableStream)
-- NS_INTERFACE_MAP_ENTRY(nsIInputStream)
-- NS_INTERFACE_MAP_ENTRY(nsIOutputStream)
-- NS_INTERFACE_MAP_ENTRY(nsIStandardFileStream)
-- NS_INTERFACE_MAP_ENTRY(nsIFileMetadata)
--NS_INTERFACE_MAP_END
--
--NS_IMETHODIMP
--FileStream::Seek(int32_t aWhence, int64_t aOffset)
--{
-- // TODO: Add support for 64 bit file sizes, bug 752431
-- NS_ENSURE_TRUE(aOffset <= INT32_MAX, NS_ERROR_INVALID_ARG);
--
-- nsresult rv = DoPendingOpen();
-- NS_ENSURE_SUCCESS(rv, rv);
--
-- if (!mQuotaFile) {
-- return NS_BASE_STREAM_CLOSED;
-- }
--
-- int whence;
-- switch (aWhence) {
-- case nsISeekableStream::NS_SEEK_SET:
-- whence = SEEK_SET;
-- break;
-- case nsISeekableStream::NS_SEEK_CUR:
-- whence = SEEK_CUR;
-- break;
-- case nsISeekableStream::NS_SEEK_END:
-- whence = SEEK_END;
-- break;
-- default:
-- return NS_ERROR_INVALID_ARG;
-- }
--
-- NS_ASSERTION(!NS_IsMainThread(), "Performing sync IO on the main thread!");
--
-- int rc = sqlite3_quota_fseek(mQuotaFile, aOffset, whence);
-- NS_ENSURE_TRUE(rc == 0, NS_BASE_STREAM_OSERROR);
--
-- return NS_OK;
--}
--
--NS_IMETHODIMP
--FileStream::Tell(int64_t* aResult)
--{
-- nsresult rv = DoPendingOpen();
-- NS_ENSURE_SUCCESS(rv, rv);
--
-- if (!mQuotaFile) {
-- return NS_BASE_STREAM_CLOSED;
-- }
--
-- NS_ASSERTION(!NS_IsMainThread(), "Performing sync IO on the main thread!");
--
-- long rc = sqlite3_quota_ftell(mQuotaFile);
-- NS_ENSURE_TRUE(rc >= 0, NS_BASE_STREAM_OSERROR);
--
-- *aResult = rc;
-- return NS_OK;
--}
--
--NS_IMETHODIMP
--FileStream::SetEOF()
--{
-- int64_t pos;
-- nsresult rv = Tell(&pos);
-- NS_ENSURE_SUCCESS(rv, rv);
--
-- NS_ASSERTION(!NS_IsMainThread(), "Performing sync IO on the main thread!");
--
-- int rc = sqlite3_quota_ftruncate(mQuotaFile, pos);
-- NS_ENSURE_TRUE(rc == 0, NS_BASE_STREAM_OSERROR);
--
-- return NS_OK;
--}
--
--
--NS_IMETHODIMP
--FileStream::Close()
--{
-- CleanUpOpen();
--
-- if (mQuotaFile) {
-- NS_ASSERTION(!NS_IsMainThread(), "Performing sync IO on the main thread!");
--
-- int rc = sqlite3_quota_fclose(mQuotaFile);
-- mQuotaFile = nullptr;
--
-- NS_ENSURE_TRUE(rc == 0, NS_BASE_STREAM_OSERROR);
-- }
--
-- return NS_OK;
--}
--
--NS_IMETHODIMP
--FileStream::Available(uint64_t* aResult)
--{
-- nsresult rv = DoPendingOpen();
-- NS_ENSURE_SUCCESS(rv, rv);
--
-- if (!mQuotaFile) {
-- return NS_BASE_STREAM_CLOSED;
-- }
--
-- NS_ASSERTION(!NS_IsMainThread(), "Performing sync IO on the main thread!");
--
-- long rc = sqlite3_quota_file_available(mQuotaFile);
-- NS_ENSURE_TRUE(rc >= 0, NS_BASE_STREAM_OSERROR);
--
-- *aResult = rc;
-- return NS_OK;
--}
--
--NS_IMETHODIMP
--FileStream::Read(char* aBuf, uint32_t aCount, uint32_t* aResult)
--{
-- nsresult rv = DoPendingOpen();
-- NS_ENSURE_SUCCESS(rv, rv);
--
-- if (!mQuotaFile) {
-- return NS_BASE_STREAM_CLOSED;
-- }
--
-- NS_ASSERTION(!NS_IsMainThread(), "Performing sync IO on the main thread!");
--
-- size_t bytesRead = sqlite3_quota_fread(aBuf, 1, aCount, mQuotaFile);
-- if (bytesRead < aCount && sqlite3_quota_ferror(mQuotaFile)) {
-- return NS_BASE_STREAM_OSERROR;
-- }
--
-- *aResult = bytesRead;
-- return NS_OK;
--}
--
--NS_IMETHODIMP
--FileStream::ReadSegments(nsWriteSegmentFun aWriter, void* aClosure,
-- uint32_t aCount, uint32_t* aResult)
--{
-- NS_NOTREACHED("Don't call me!");
-- return NS_ERROR_NOT_IMPLEMENTED;
--}
--
--NS_IMETHODIMP
--FileStream::IsNonBlocking(bool *aNonBlocking)
--{
-- *aNonBlocking = false;
-- return NS_OK;
--}
--
--NS_IMETHODIMP
--FileStream::Write(const char* aBuf, uint32_t aCount, uint32_t *aResult)
--{
-- nsresult rv = DoPendingOpen();
-- NS_ENSURE_SUCCESS(rv, rv);
--
-- if (!mQuotaFile) {
-- return NS_BASE_STREAM_CLOSED;
-- }
--
-- NS_ASSERTION(!NS_IsMainThread(), "Performing sync IO on the main thread!");
--
-- size_t bytesWritten = sqlite3_quota_fwrite(aBuf, 1, aCount, mQuotaFile);
-- if (bytesWritten < aCount) {
-- return NS_BASE_STREAM_OSERROR;
-- }
--
-- *aResult = bytesWritten;
-- return NS_OK;
--}
--
--NS_IMETHODIMP
--FileStream::Flush()
--{
-- nsresult rv = DoPendingOpen();
-- NS_ENSURE_SUCCESS(rv, rv);
--
-- if (!mQuotaFile) {
-- return NS_BASE_STREAM_CLOSED;
-- }
--
-- NS_ASSERTION(!NS_IsMainThread(), "Performing sync IO on the main thread!");
--
-- int rc = sqlite3_quota_fflush(mQuotaFile, 1);
-- NS_ENSURE_TRUE(rc == 0, NS_BASE_STREAM_OSERROR);
--
-- return NS_OK;
--}
--
--NS_IMETHODIMP
--FileStream::WriteFrom(nsIInputStream *inStr, uint32_t count, uint32_t *_retval)
--{
-- return NS_ERROR_NOT_IMPLEMENTED;
--}
--
--NS_IMETHODIMP
--FileStream::WriteSegments(nsReadSegmentFun reader, void * closure, uint32_t count, uint32_t *_retval)
--{
-- NS_NOTREACHED("Don't call me!");
-- return NS_ERROR_NOT_IMPLEMENTED;
--}
--
--NS_IMETHODIMP
--FileStream::Init(nsIFile* aFile, const nsAString& aMode, int32_t aFlags)
--{
-- NS_ASSERTION(!mQuotaFile && !mDeferredOpen, "Already initialized!");
--
-- nsresult rv = aFile->GetPath(mFilePath);
-- NS_ENSURE_SUCCESS(rv, rv);
--
-- mMode = aMode;
-- mFlags = aFlags;
--
-- if (mFlags & nsIStandardFileStream::FLAGS_DEFER_OPEN) {
-- mDeferredOpen = true;
-- return NS_OK;
-- }
--
-- return DoOpen();
--}
--
--NS_IMETHODIMP
--FileStream::GetSize(int64_t* _retval)
--{
-- nsresult rv = DoPendingOpen();
-- NS_ENSURE_SUCCESS(rv, rv);
--
-- if (!mQuotaFile) {
-- return NS_BASE_STREAM_CLOSED;
-- }
--
-- NS_ASSERTION(!NS_IsMainThread(), "Performing sync IO on the main thread!");
--
-- // TODO: Use sqlite3_quota_file_size() here, bug 760783
-- int64_t rc = sqlite3_quota_file_truesize(mQuotaFile);
--
-- NS_ASSERTION(rc >= 0, "The file is not under quota management!");
--
-- *_retval = rc;
-- return NS_OK;
--}
--
--NS_IMETHODIMP
--FileStream::GetLastModified(int64_t* _retval)
--{
-- nsresult rv = DoPendingOpen();
-- NS_ENSURE_SUCCESS(rv, rv);
--
-- if (!mQuotaFile) {
-- return NS_BASE_STREAM_CLOSED;
-- }
--
-- NS_ASSERTION(!NS_IsMainThread(), "Performing sync IO on the main thread!");
--
-- time_t mtime;
-- int rc = sqlite3_quota_file_mtime(mQuotaFile, &mtime);
-- NS_ENSURE_TRUE(rc == 0, NS_BASE_STREAM_OSERROR);
--
-- *_retval = mtime * PR_MSEC_PER_SEC;
-- return NS_OK;
--}
--
--NS_IMETHODIMP
--FileStream::FlushBuffers()
--{
-- nsresult rv = DoPendingOpen();
-- NS_ENSURE_SUCCESS(rv, rv);
--
-- if (!mQuotaFile) {
-- return NS_BASE_STREAM_CLOSED;
-- }
--
-- NS_ASSERTION(!NS_IsMainThread(), "Performing sync IO on the main thread!");
--
-- int rc = sqlite3_quota_fflush(mQuotaFile, 0);
-- NS_ENSURE_TRUE(rc == 0, NS_BASE_STREAM_OSERROR);
--
-- return NS_OK;
--}
--
--nsresult
--FileStream::DoOpen()
--{
-- NS_ASSERTION(!mFilePath.IsEmpty(), "Must have a file path");
--
-- NS_ASSERTION(!NS_IsMainThread(), "Performing sync IO on the main thread!");
--
-- quota_FILE* quotaFile =
-- sqlite3_quota_fopen(NS_ConvertUTF16toUTF8(mFilePath).get(),
-- NS_ConvertUTF16toUTF8(mMode).get());
--
-- CleanUpOpen();
--
-- if (!quotaFile) {
-- return NS_BASE_STREAM_OSERROR;
-- }
--
-- mQuotaFile = quotaFile;
--
-- return NS_OK;
--}
-diff --git dom/indexedDB/FileStream.h dom/indexedDB/FileStream.h
-deleted file mode 100644
-index 09648b1..0000000
---- dom/indexedDB/FileStream.h
-+++ /dev/null
-@@ -1,140 +0,0 @@
--/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
--/* vim: set ts=2 et sw=2 tw=80: */
--/* This Source Code Form is subject to the terms of the Mozilla Public
-- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
-- * You can obtain one at http://mozilla.org/MPL/2.0/. */
--
--#ifndef mozilla_dom_indexeddb_filestream_h__
--#define mozilla_dom_indexeddb_filestream_h__
--
--#include "IndexedDatabase.h"
--
--#include "nsIFileStreams.h"
--#include "nsIInputStream.h"
--#include "nsIOutputStream.h"
--#include "nsISeekableStream.h"
--#include "nsIStandardFileStream.h"
--
--class nsIFile;
--struct quota_FILE;
--
--BEGIN_INDEXEDDB_NAMESPACE
--
--class FileStream : public nsISeekableStream,
-- public nsIInputStream,
-- public nsIOutputStream,
-- public nsIStandardFileStream,
-- public nsIFileMetadata
--{
--public:
-- FileStream()
-- : mFlags(0),
-- mDeferredOpen(false),
-- mQuotaFile(nullptr)
-- { }
--
-- virtual ~FileStream()
-- {
-- Close();
-- }
--
-- NS_DECL_ISUPPORTS
-- NS_DECL_NSISEEKABLESTREAM
-- NS_DECL_NSISTANDARDFILESTREAM
-- NS_DECL_NSIFILEMETADATA
--
-- // nsIInputStream
-- NS_IMETHOD
-- Close();
--
-- NS_IMETHOD
-- Available(uint64_t* _retval);
--
-- NS_IMETHOD
-- Read(char* aBuf, uint32_t aCount, uint32_t* _retval);
--
-- NS_IMETHOD
-- ReadSegments(nsWriteSegmentFun aWriter, void* aClosure, uint32_t aCount,
-- uint32_t* _retval);
--
-- NS_IMETHOD
-- IsNonBlocking(bool* _retval);
--
-- // nsIOutputStream
--
-- // Close() already declared
--
-- NS_IMETHOD
-- Flush();
--
-- NS_IMETHOD
-- Write(const char* aBuf, uint32_t aCount, uint32_t* _retval);
--
-- NS_IMETHOD
-- WriteFrom(nsIInputStream* aFromStream, uint32_t aCount, uint32_t* _retval);
--
-- NS_IMETHOD
-- WriteSegments(nsReadSegmentFun aReader, void* aClosure, uint32_t aCount,
-- uint32_t* _retval);
--
-- // IsNonBlocking() already declared
--
--protected:
-- /**
-- * Cleans up data prepared in Init.
-- */
-- void
-- CleanUpOpen()
-- {
-- mFilePath.Truncate();
-- mDeferredOpen = false;
-- }
--
-- /**
-- * Open the file. This is called either from Init
-- * or from DoPendingOpen (if FLAGS_DEFER_OPEN is used when initializing this
-- * stream). The default behavior of DoOpen is to open the file and save the
-- * file descriptor.
-- */
-- virtual nsresult
-- DoOpen();
--
-- /**
-- * If there is a pending open, do it now. It's important for this to be
-- * inlined since we do it in almost every stream API call.
-- */
-- nsresult
-- DoPendingOpen()
-- {
-- if (!mDeferredOpen) {
-- return NS_OK;
-- }
--
-- return DoOpen();
-- }
--
-- /**
-- * Data we need to do an open.
-- */
-- nsString mFilePath;
-- nsString mMode;
--
-- /**
-- * Flags describing our behavior. See the IDL file for possible values.
-- */
-- int32_t mFlags;
--
-- /**
-- * Whether we have a pending open (see FLAGS_DEFER_OPEN in the IDL file).
-- */
-- bool mDeferredOpen;
--
-- /**
-- * File descriptor for opened file.
-- */
-- quota_FILE* mQuotaFile;
--};
--
--END_INDEXEDDB_NAMESPACE
--
--#endif // mozilla_dom_indexeddb_filestream_h__
-diff --git dom/indexedDB/IDBDatabase.cpp dom/indexedDB/IDBDatabase.cpp
-index 63500b0..8842daf 100644
---- dom/indexedDB/IDBDatabase.cpp
-+++ dom/indexedDB/IDBDatabase.cpp
-@@ -779,6 +779,12 @@ IDBDatabase::Close()
- return NS_OK;
- }
-
-+const nsACString&
-+IDBDatabase::StorageOrigin()
-+{
-+ return Origin();
-+}
-+
- nsISupports*
- IDBDatabase::StorageId()
- {
-diff --git dom/indexedDB/IDBFactory.cpp dom/indexedDB/IDBFactory.cpp
-index 1007df1..c1f573e 100644
---- dom/indexedDB/IDBFactory.cpp
-+++ dom/indexedDB/IDBFactory.cpp
-@@ -253,8 +253,26 @@ IDBFactory::Create(ContentParent* aContentParent,
- }
-
- // static
-+already_AddRefed<nsIFileURL>
-+IDBFactory::GetDatabaseFileURL(nsIFile* aDatabaseFile, const nsACString& aOrigin)
-+{
-+ nsCOMPtr<nsIURI> uri;
-+ nsresult rv = NS_NewFileURI(getter_AddRefs(uri), aDatabaseFile);
-+ NS_ENSURE_SUCCESS(rv, nullptr);
-+
-+ nsCOMPtr<nsIFileURL> fileUrl = do_QueryInterface(uri);
-+ NS_ASSERTION(fileUrl, "This should always succeed!");
-+
-+ rv = fileUrl->SetQuery(NS_LITERAL_CSTRING("origin=") + aOrigin);
-+ NS_ENSURE_SUCCESS(rv, nullptr);
-+
-+ return fileUrl.forget();
-+}
-+
-+// static
- already_AddRefed<mozIStorageConnection>
--IDBFactory::GetConnection(const nsAString& aDatabaseFilePath)
-+IDBFactory::GetConnection(const nsAString& aDatabaseFilePath,
-+ const nsACString& aOrigin)
- {
- NS_ASSERTION(IndexedDatabaseManager::IsMainProcess(), "Wrong process!");
- NS_ASSERTION(StringEndsWith(aDatabaseFilePath, NS_LITERAL_STRING(".sqlite")),
-@@ -271,13 +289,15 @@ IDBFactory::GetConnection(const nsAString& aDatabaseFilePath)
- NS_ENSURE_SUCCESS(rv, nullptr);
- NS_ENSURE_TRUE(exists, nullptr);
-
-- nsCOMPtr<mozIStorageServiceQuotaManagement> ss =
-+ nsCOMPtr<nsIFileURL> dbFileUrl = GetDatabaseFileURL(dbFile, aOrigin);
-+ NS_ENSURE_TRUE(dbFileUrl, nullptr);
-+
-+ nsCOMPtr<mozIStorageService> ss =
- do_GetService(MOZ_STORAGE_SERVICE_CONTRACTID);
- NS_ENSURE_TRUE(ss, nullptr);
-
- nsCOMPtr<mozIStorageConnection> connection;
-- rv = ss->OpenDatabaseWithVFS(dbFile, NS_LITERAL_CSTRING("quota"),
-- getter_AddRefs(connection));
-+ rv = ss->OpenDatabaseWithFileURL(dbFileUrl, getter_AddRefs(connection));
- NS_ENSURE_SUCCESS(rv, nullptr);
-
- // Turn on foreign key constraints and recursive triggers.
-diff --git dom/indexedDB/IDBFactory.h dom/indexedDB/IDBFactory.h
-index d5461f7..49dad42 100644
---- dom/indexedDB/IDBFactory.h
-+++ dom/indexedDB/IDBFactory.h
-@@ -15,6 +15,8 @@
- #include "nsCycleCollectionParticipant.h"
-
- class nsIAtom;
-+class nsIFile;
-+class nsIFileURL;
- class nsPIDOMWindow;
-
- namespace mozilla {
-@@ -75,8 +77,12 @@ public:
- static nsresult Create(ContentParent* aContentParent,
- IDBFactory** aFactory);
-
-+ static already_AddRefed<nsIFileURL>
-+ GetDatabaseFileURL(nsIFile* aDatabaseFile, const nsACString& aOrigin);
-+
- static already_AddRefed<mozIStorageConnection>
-- GetConnection(const nsAString& aDatabaseFilePath);
-+ GetConnection(const nsAString& aDatabaseFilePath,
-+ const nsACString& aOrigin);
-
- static nsresult
- LoadDatabaseInformation(mozIStorageConnection* aConnection,
-diff --git dom/indexedDB/IDBFileHandle.cpp dom/indexedDB/IDBFileHandle.cpp
-index e0340ff..f71fd56 100644
---- dom/indexedDB/IDBFileHandle.cpp
-+++ dom/indexedDB/IDBFileHandle.cpp
-@@ -6,15 +6,14 @@
-
- #include "IDBFileHandle.h"
-
--#include "nsIStandardFileStream.h"
--
- #include "mozilla/dom/file/File.h"
-+#include "mozilla/dom/quota/FileStreams.h"
- #include "nsDOMClassInfoID.h"
-
--#include "FileStream.h"
- #include "IDBDatabase.h"
-
- USING_INDEXEDDB_NAMESPACE
-+USING_QUOTA_NAMESPACE
-
- namespace {
-
-@@ -68,22 +67,22 @@ IDBFileHandle::Create(IDBDatabase* aDatabase,
- already_AddRefed<nsISupports>
- IDBFileHandle::CreateStream(nsIFile* aFile, bool aReadOnly)
- {
-- nsRefPtr<FileStream> stream = new FileStream();
-+ const nsACString& origin = mFileStorage->StorageOrigin();
-+
-+ nsCOMPtr<nsISupports> result;
-
-- nsString streamMode;
- if (aReadOnly) {
-- streamMode.AssignLiteral("rb");
-+ nsRefPtr<FileInputStream> stream = FileInputStream::Create(
-+ origin, aFile, -1, -1, nsIFileInputStream::DEFER_OPEN);
-+ result = NS_ISUPPORTS_CAST(nsIFileInputStream*, stream);
- }
- else {
-- streamMode.AssignLiteral("r+b");
-+ nsRefPtr<FileStream> stream = FileStream::Create(
-+ origin, aFile, -1, -1, nsIFileStream::DEFER_OPEN);
-+ result = NS_ISUPPORTS_CAST(nsIFileStream*, stream);
- }
-+ NS_ENSURE_TRUE(result, nullptr);
-
-- nsresult rv = stream->Init(aFile, streamMode,
-- nsIStandardFileStream::FLAGS_DEFER_OPEN);
-- NS_ENSURE_SUCCESS(rv, nullptr);
--
-- nsCOMPtr<nsISupports> result =
-- NS_ISUPPORTS_CAST(nsIStandardFileStream*, stream);
- return result.forget();
- }
-
-diff --git dom/indexedDB/IDBObjectStore.cpp dom/indexedDB/IDBObjectStore.cpp
-index 746d473..1f16d26 100644
---- dom/indexedDB/IDBObjectStore.cpp
-+++ dom/indexedDB/IDBObjectStore.cpp
-@@ -17,6 +17,7 @@
- #include "mozilla/dom/ContentParent.h"
- #include "mozilla/dom/StructuredCloneTags.h"
- #include "mozilla/dom/ipc/Blob.h"
-+#include "mozilla/dom/quota/FileStreams.h"
- #include "mozilla/storage.h"
- #include "nsContentUtils.h"
- #include "nsDOMClassInfo.h"
-@@ -27,10 +28,8 @@
- #include "nsServiceManagerUtils.h"
- #include "nsThreadUtils.h"
- #include "snappy/snappy.h"
--#include "test_quota.h"
-
- #include "AsyncConnectionHelper.h"
--#include "FileStream.h"
- #include "IDBCursor.h"
- #include "IDBEvents.h"
- #include "IDBFileHandle.h"
-@@ -51,6 +50,7 @@
- USING_INDEXEDDB_NAMESPACE
- using namespace mozilla::dom;
- using namespace mozilla::dom::indexedDB::ipc;
-+using mozilla::dom::quota::FileOutputStream;
-
- namespace {
-
-@@ -2734,9 +2734,9 @@ AddHelper::DoDatabaseWork(mozIStorageConnection* aConnection)
- nativeFile = fileManager->GetFileForId(directory, id);
- NS_ENSURE_TRUE(nativeFile, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
-
-- nsRefPtr<FileStream> outputStream = new FileStream();
-- rv = outputStream->Init(nativeFile, NS_LITERAL_STRING("wb"), 0);
-- NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
-+ nsRefPtr<FileOutputStream> outputStream = FileOutputStream::Create(
-+ mObjectStore->Transaction()->Database()->Origin(), nativeFile);
-+ NS_ENSURE_TRUE(outputStream, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
-
- rv = CopyData(inputStream, outputStream);
- NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
-diff --git dom/indexedDB/IDBTransaction.cpp dom/indexedDB/IDBTransaction.cpp
-index fcef7cc..a5345e2 100644
---- dom/indexedDB/IDBTransaction.cpp
-+++ dom/indexedDB/IDBTransaction.cpp
-@@ -352,7 +352,8 @@ IDBTransaction::GetOrCreateConnection(mozIStorageConnection** aResult)
-
- if (!mConnection) {
- nsCOMPtr<mozIStorageConnection> connection =
-- IDBFactory::GetConnection(mDatabase->FilePath());
-+ IDBFactory::GetConnection(mDatabase->FilePath(),
-+ mDatabase->Origin());
- NS_ENSURE_TRUE(connection, NS_ERROR_FAILURE);
-
- nsresult rv;
-diff --git dom/indexedDB/IndexedDatabaseInlines.h dom/indexedDB/IndexedDatabaseInlines.h
-index 62e65d6..f27d60c 100644
---- dom/indexedDB/IndexedDatabaseInlines.h
-+++ dom/indexedDB/IndexedDatabaseInlines.h
-@@ -79,4 +79,17 @@ AppendConditionClause(const nsACString& aColumnName,
- aResult += NS_LITERAL_CSTRING(" :") + aArgName;
- }
-
-+inline void
-+IncrementUsage(uint64_t* aUsage, uint64_t aDelta)
-+{
-+ // Watch for overflow!
-+ if ((UINT64_MAX - *aUsage) < aDelta) {
-+ NS_WARNING("Usage exceeds the maximum!");
-+ *aUsage = UINT64_MAX;
-+ }
-+ else {
-+ *aUsage += aDelta;
-+ }
-+}
-+
- END_INDEXEDDB_NAMESPACE
-diff --git dom/indexedDB/IndexedDatabaseManager.cpp dom/indexedDB/IndexedDatabaseManager.cpp
-index e4ad647..88f09da 100644
---- dom/indexedDB/IndexedDatabaseManager.cpp
-+++ dom/indexedDB/IndexedDatabaseManager.cpp
-@@ -22,6 +22,7 @@
- #include "nsITimer.h"
-
- #include "mozilla/dom/file/FileService.h"
-+#include "mozilla/dom/quota/QuotaManager.h"
- #include "mozilla/dom/TabContext.h"
- #include "mozilla/LazyIdleThread.h"
- #include "mozilla/Preferences.h"
-@@ -36,7 +37,6 @@
- #include "nsThreadUtils.h"
- #include "nsXPCOM.h"
- #include "nsXPCOMPrivate.h"
--#include "test_quota.h"
- #include "xpcpublic.h"
-
- #include "AsyncConnectionHelper.h"
-@@ -48,6 +48,8 @@
- #include "OpenDatabaseHelper.h"
- #include "TransactionThreadPool.h"
-
-+#include "IndexedDatabaseInlines.h"
-+
- // The amount of time, in milliseconds, that our IO thread will stay alive
- // after the last event it processes.
- #define DEFAULT_THREAD_TIMEOUT_MS 30000
-@@ -70,6 +72,7 @@ using namespace mozilla::services;
- using namespace mozilla::dom;
- using mozilla::Preferences;
- using mozilla::dom::file::FileService;
-+using mozilla::dom::quota::QuotaManager;
-
- static NS_DEFINE_CID(kDOMSOF_CID, NS_DOM_SCRIPT_OBJECT_FACTORY_CID);
-
-@@ -103,29 +106,6 @@ GetDatabaseBaseFilename(const nsAString& aFilename,
- return true;
- }
-
--class QuotaCallback MOZ_FINAL : public mozIStorageQuotaCallback
--{
--public:
-- NS_DECL_ISUPPORTS
--
-- NS_IMETHOD
-- QuotaExceeded(const nsACString& aFilename,
-- int64_t aCurrentSizeLimit,
-- int64_t aCurrentTotalSize,
-- nsISupports* aUserData,
-- int64_t* _retval)
-- {
-- if (IndexedDatabaseManager::QuotaIsLifted()) {
-- *_retval = 0;
-- return NS_OK;
-- }
--
-- return NS_ERROR_FAILURE;
-- }
--};
--
--NS_IMPL_THREADSAFE_ISUPPORTS1(QuotaCallback, mozIStorageQuotaCallback)
--
- // Adds all databases in the hash to the given array.
- template <class T>
- PLDHashOperator
-@@ -440,8 +420,8 @@ IndexedDatabaseManager::GetOrCreate()
- NS_LITERAL_CSTRING("IndexedDB I/O"),
- LazyIdleThread::ManualShutdown);
-
-- // We need one quota callback object to hand to SQLite.
-- instance->mQuotaCallbackSingleton = new QuotaCallback();
-+ // Make sure that the quota manager is up.
-+ NS_ENSURE_TRUE(QuotaManager::GetOrCreate(), nullptr);
-
- // Make a timer here to avoid potential failures later. We don't actually
- // initialize the timer until shutdown.
-@@ -996,37 +976,15 @@ IndexedDatabaseManager::EnsureOriginIsInitialized(const nsACString& aOrigin,
- return NS_OK;
- }
-
-- // First figure out the filename pattern we'll use.
-- nsCOMPtr<nsIFile> patternFile;
-- rv = directory->Clone(getter_AddRefs(patternFile));
-- NS_ENSURE_SUCCESS(rv, rv);
--
-- rv = patternFile->Append(NS_LITERAL_STRING("*"));
-- NS_ENSURE_SUCCESS(rv, rv);
--
-- nsString pattern;
-- rv = patternFile->GetPath(pattern);
-- NS_ENSURE_SUCCESS(rv, rv);
--
-- // Now tell SQLite to start tracking this pattern for content.
-- nsCOMPtr<mozIStorageServiceQuotaManagement> ss =
-- do_GetService(MOZ_STORAGE_SERVICE_CONTRACTID);
-- NS_ENSURE_TRUE(ss, NS_ERROR_FAILURE);
--
-- if (aPrivilege != Chrome) {
-- rv = ss->SetQuotaForFilenamePattern(NS_ConvertUTF16toUTF8(pattern),
-- GetIndexedDBQuotaMB() * 1024 * 1024,
-- mQuotaCallbackSingleton, nullptr);
-- NS_ENSURE_SUCCESS(rv, rv);
-- }
--
- // We need to see if there are any files in the directory already. If they
- // are database files then we need to cleanup stored files (if it's needed)
-- // and also tell SQLite about all of them.
-+ // and also initialize the quota.
-
- nsAutoTArray<nsString, 20> subdirsToProcess;
- nsAutoTArray<nsCOMPtr<nsIFile> , 20> unknownFiles;
-
-+ uint64_t usage = 0;
-+
- nsTHashtable<nsStringHashKey> validSubdirs;
- validSubdirs.Init(20);
-
-@@ -1068,20 +1026,28 @@ IndexedDatabaseManager::EnsureOriginIsInitialized(const nsACString& aOrigin,
- continue;
- }
-
-- nsCOMPtr<nsIFile> fileManagerDirectory;
-- rv = directory->Clone(getter_AddRefs(fileManagerDirectory));
-+ nsCOMPtr<nsIFile> fmDirectory;
-+ rv = directory->Clone(getter_AddRefs(fmDirectory));
- NS_ENSURE_SUCCESS(rv, rv);
-
-- rv = fileManagerDirectory->Append(dbBaseFilename);
-+ rv = fmDirectory->Append(dbBaseFilename);
- NS_ENSURE_SUCCESS(rv, rv);
-
-- rv = FileManager::InitDirectory(ss, fileManagerDirectory, file,
-- aPrivilege);
-+ rv = FileManager::InitDirectory(fmDirectory, file, aOrigin);
- NS_ENSURE_SUCCESS(rv, rv);
-
- if (aPrivilege != Chrome) {
-- rv = ss->UpdateQuotaInformationForFile(file);
-+ uint64_t fileUsage;
-+ rv = FileManager::GetUsage(fmDirectory, &fileUsage);
- NS_ENSURE_SUCCESS(rv, rv);
-+
-+ IncrementUsage(&usage, fileUsage);
-+
-+ int64_t fileSize;
-+ rv = file->GetFileSize(&fileSize);
-+ NS_ENSURE_SUCCESS(rv, rv);
-+
-+ IncrementUsage(&usage, uint64_t(fileSize));
- }
-
- validSubdirs.PutEntry(dbBaseFilename);
-@@ -1117,12 +1083,39 @@ IndexedDatabaseManager::EnsureOriginIsInitialized(const nsACString& aOrigin,
- }
- }
-
-+ if (aPrivilege != Chrome) {
-+ QuotaManager* quotaManager = QuotaManager::Get();
-+ NS_ASSERTION(quotaManager, "Shouldn't be null!");
-+
-+ quotaManager->InitQuotaForOrigin(aOrigin, GetIndexedDBQuotaMB(), usage);
-+ }
-+
- mInitializedOrigins.AppendElement(aOrigin);
-
- NS_ADDREF(*aDirectory = directory);
- return NS_OK;
- }
-
-+void
-+IndexedDatabaseManager::UninitializeOriginsByPattern(
-+ const nsACString& aPattern)
-+{
-+#ifdef DEBUG
-+ {
-+ bool correctThread;
-+ NS_ASSERTION(NS_SUCCEEDED(mIOThread->IsOnCurrentThread(&correctThread)) &&
-+ correctThread,
-+ "Running on the wrong thread!");
-+ }
-+#endif
-+
-+ for (int32_t i = mInitializedOrigins.Length() - 1; i >= 0; i--) {
-+ if (PatternMatchesOrigin(aPattern, mInitializedOrigins[i])) {
-+ mInitializedOrigins.RemoveElementAt(i);
-+ }
-+ }
-+}
-+
- bool
- IndexedDatabaseManager::QuotaIsLiftedInternal()
- {
-@@ -1250,16 +1243,14 @@ IndexedDatabaseManager::GetFileManager(const nsACString& aOrigin,
- }
-
- void
--IndexedDatabaseManager::AddFileManager(const nsACString& aOrigin,
-- const nsAString& aDatabaseName,
-- FileManager* aFileManager)
-+IndexedDatabaseManager::AddFileManager(FileManager* aFileManager)
- {
- NS_ASSERTION(aFileManager, "Null file manager!");
-
- nsTArray<nsRefPtr<FileManager> >* array;
-- if (!mFileManagers.Get(aOrigin, &array)) {
-+ if (!mFileManagers.Get(aFileManager->Origin(), &array)) {
- array = new nsTArray<nsRefPtr<FileManager> >();
-- mFileManagers.Put(aOrigin, array);
-+ mFileManagers.Put(aFileManager->Origin(), array);
- }
-
- array->AppendElement(aFileManager);
-@@ -1783,6 +1774,13 @@ OriginClearRunnable::DeleteFiles(IndexedDatabaseManager* aManager)
- // correctly...
- NS_ERROR("Failed to remove directory!");
- }
-+
-+ QuotaManager* quotaManager = QuotaManager::Get();
-+ NS_ASSERTION(quotaManager, "Shouldn't be null!");
-+
-+ quotaManager->RemoveQuotaForPattern(mOriginOrPattern);
-+
-+ aManager->UninitializeOriginsByPattern(mOriginOrPattern);
- }
- }
-
-@@ -1880,19 +1878,6 @@ IndexedDatabaseManager::AsyncUsageRunnable::Cancel()
- }
- }
-
--inline void
--IncrementUsage(uint64_t* aUsage, uint64_t aDelta)
--{
-- // Watch for overflow!
-- if ((INT64_MAX - *aUsage) <= aDelta) {
-- NS_WARNING("Database sizes exceed max we can report!");
-- *aUsage = INT64_MAX;
-- }
-- else {
-- *aUsage += aDelta;
-- }
--}
--
- nsresult
- IndexedDatabaseManager::AsyncUsageRunnable::TakeShortcut()
- {
-@@ -2295,25 +2280,22 @@ IndexedDatabaseManager::AsyncDeleteFileRunnable::Run()
- nsCOMPtr<nsIFile> file = mFileManager->GetFileForId(directory, mFileId);
- NS_ENSURE_TRUE(file, NS_ERROR_FAILURE);
-
-- nsString filePath;
-- nsresult rv = file->GetPath(filePath);
-- NS_ENSURE_SUCCESS(rv, rv);
-+ nsresult rv;
-+ int64_t fileSize;
-
-- int rc = sqlite3_quota_remove(NS_ConvertUTF16toUTF8(filePath).get());
-- if (rc != SQLITE_OK) {
-- NS_WARNING("Failed to delete stored file!");
-- return NS_ERROR_FAILURE;
-+ if (mFileManager->Privilege() != Chrome) {
-+ rv = file->GetFileSize(&fileSize);
-+ NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
- }
-
-- // sqlite3_quota_remove won't actually remove anything if we're not tracking
-- // the quota here. Manually remove the file if it exists.
-- bool exists;
-- rv = file->Exists(&exists);
-- NS_ENSURE_SUCCESS(rv, rv);
-+ rv = file->Remove(false);
-+ NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
-
-- if (exists) {
-- rv = file->Remove(false);
-- NS_ENSURE_SUCCESS(rv, rv);
-+ if (mFileManager->Privilege() != Chrome) {
-+ QuotaManager* quotaManager = QuotaManager::Get();
-+ NS_ASSERTION(quotaManager, "Shouldn't be null!");
-+
-+ quotaManager->DecreaseUsageForOrigin(mFileManager->Origin(), fileSize);
- }
-
- directory = mFileManager->GetJournalDirectory();
-diff --git dom/indexedDB/IndexedDatabaseManager.h dom/indexedDB/IndexedDatabaseManager.h
-index f9fbbf2..1ea5425 100644
---- dom/indexedDB/IndexedDatabaseManager.h
-+++ dom/indexedDB/IndexedDatabaseManager.h
-@@ -23,7 +23,6 @@
-
- #define INDEXEDDB_MANAGER_CONTRACTID "@mozilla.org/dom/indexeddb/manager;1"
-
--class mozIStorageQuotaCallback;
- class nsIAtom;
- class nsIFile;
- class nsITimer;
-@@ -134,6 +133,8 @@ public:
- FactoryPrivilege aPrivilege,
- nsIFile** aDirectory);
-
-+ void UninitializeOriginsByPattern(const nsACString& aPattern);
-+
- // Determine if the quota is lifted for the Window the current thread is
- // using.
- static inline bool
-@@ -172,9 +173,7 @@ public:
- const nsAString& aDatabaseName);
-
- void
-- AddFileManager(const nsACString& aOrigin,
-- const nsAString& aDatabaseName,
-- FileManager* aFileManager);
-+ AddFileManager(FileManager* aFileManager);
-
- void InvalidateFileManagersForPattern(const nsACString& aPattern);
-
-@@ -502,10 +501,6 @@ private:
- // A timer that gets activated at shutdown to ensure we close all databases.
- nsCOMPtr<nsITimer> mShutdownTimer;
-
-- // A single threadsafe instance of our quota callback. Created on the main
-- // thread during GetOrCreate().
-- nsCOMPtr<mozIStorageQuotaCallback> mQuotaCallbackSingleton;
--
- // A list of all successfully initialized origins. This list isn't protected
- // by any mutex but it is only ever touched on the IO thread.
- nsTArray<nsCString> mInitializedOrigins;
-diff --git dom/indexedDB/Makefile.in dom/indexedDB/Makefile.in
-index fef0858..09d4853 100644
---- dom/indexedDB/Makefile.in
-+++ dom/indexedDB/Makefile.in
-@@ -25,7 +25,6 @@ CPPSRCS = \
- DatabaseInfo.cpp \
- FileInfo.cpp \
- FileManager.cpp \
-- FileStream.cpp \
- IDBCursor.cpp \
- IDBDatabase.cpp \
- IDBEvents.cpp \
-@@ -93,7 +92,6 @@ XPIDLSRCS = \
- nsIIDBVersionChangeEvent.idl \
- nsIIDBOpenDBRequest.idl \
- nsIIndexedDatabaseManager.idl \
-- nsIStandardFileStream.idl \
- $(NULL)
-
- DIRS += ipc
-diff --git dom/indexedDB/OpenDatabaseHelper.cpp dom/indexedDB/OpenDatabaseHelper.cpp
-index e71cad4..4cd7f61 100644
---- dom/indexedDB/OpenDatabaseHelper.cpp
-+++ dom/indexedDB/OpenDatabaseHelper.cpp
-@@ -8,11 +8,12 @@
-
- #include "nsIFile.h"
-
-+#include "mozilla/dom/quota/QuotaManager.h"
- #include "mozilla/storage.h"
- #include "nsEscape.h"
-+#include "nsNetUtil.h"
- #include "nsThreadUtils.h"
- #include "snappy/snappy.h"
--#include "test_quota.h"
-
- #include "nsIBFCacheEntry.h"
- #include "IDBEvents.h"
-@@ -21,6 +22,7 @@
-
- using namespace mozilla;
- USING_INDEXEDDB_NAMESPACE
-+USING_QUOTA_NAMESPACE
-
- namespace {
-
-@@ -1632,15 +1634,15 @@ OpenDatabaseHelper::DoDatabaseWork()
- rv = dbFile->GetPath(mDatabaseFilePath);
- NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
-
-- nsCOMPtr<nsIFile> fileManagerDirectory;
-- rv = dbDirectory->Clone(getter_AddRefs(fileManagerDirectory));
-+ nsCOMPtr<nsIFile> fmDirectory;
-+ rv = dbDirectory->Clone(getter_AddRefs(fmDirectory));
- NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
-
-- rv = fileManagerDirectory->Append(filename);
-+ rv = fmDirectory->Append(filename);
- NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
-
- nsCOMPtr<mozIStorageConnection> connection;
-- rv = CreateDatabaseConnection(mName, dbFile, fileManagerDirectory,
-+ rv = CreateDatabaseConnection(dbFile, fmDirectory, mName, mASCIIOrigin,
- getter_AddRefs(connection));
- if (NS_FAILED(rv) &&
- NS_ERROR_GET_MODULE(rv) != NS_ERROR_MODULE_DOM_INDEXEDDB) {
-@@ -1691,12 +1693,12 @@ OpenDatabaseHelper::DoDatabaseWork()
-
- nsRefPtr<FileManager> fileManager = mgr->GetFileManager(mASCIIOrigin, mName);
- if (!fileManager) {
-- fileManager = new FileManager(mASCIIOrigin, mName);
-+ fileManager = new FileManager(mASCIIOrigin, mPrivilege, mName);
-
-- rv = fileManager->Init(fileManagerDirectory, connection);
-+ rv = fileManager->Init(fmDirectory, connection);
- NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
-
-- mgr->AddFileManager(mASCIIOrigin, mName, fileManager);
-+ mgr->AddFileManager(fileManager);
- }
-
- mFileManager = fileManager.forget();
-@@ -1707,23 +1709,26 @@ OpenDatabaseHelper::DoDatabaseWork()
- // static
- nsresult
- OpenDatabaseHelper::CreateDatabaseConnection(
-- const nsAString& aName,
- nsIFile* aDBFile,
-- nsIFile* aFileManagerDirectory,
-+ nsIFile* aFMDirectory,
-+ const nsAString& aName,
-+ const nsACString& aOrigin,
- mozIStorageConnection** aConnection)
- {
- NS_ASSERTION(IndexedDatabaseManager::IsMainProcess(), "Wrong process!");
- NS_ASSERTION(!NS_IsMainThread(), "Wrong thread!");
-
-- NS_NAMED_LITERAL_CSTRING(quotaVFSName, "quota");
-+ nsCOMPtr<nsIFileURL> dbFileUrl =
-+ IDBFactory::GetDatabaseFileURL(aDBFile, aOrigin);
-+ NS_ENSURE_TRUE(dbFileUrl, NS_ERROR_FAILURE);
-
-- nsCOMPtr<mozIStorageServiceQuotaManagement> ss =
-+ nsCOMPtr<mozIStorageService> ss =
- do_GetService(MOZ_STORAGE_SERVICE_CONTRACTID);
- NS_ENSURE_TRUE(ss, NS_ERROR_FAILURE);
-
- nsCOMPtr<mozIStorageConnection> connection;
-- nsresult rv = ss->OpenDatabaseWithVFS(aDBFile, quotaVFSName,
-- getter_AddRefs(connection));
-+ nsresult rv =
-+ ss->OpenDatabaseWithFileURL(dbFileUrl, getter_AddRefs(connection));
- if (rv == NS_ERROR_FILE_CORRUPTED) {
- // If we're just opening the database during origin initialization, then
- // we don't want to erase any files. The failure here will fail origin
-@@ -1737,21 +1742,20 @@ OpenDatabaseHelper::CreateDatabaseConnection(
- NS_ENSURE_SUCCESS(rv, rv);
-
- bool exists;
-- rv = aFileManagerDirectory->Exists(&exists);
-+ rv = aFMDirectory->Exists(&exists);
- NS_ENSURE_SUCCESS(rv, rv);
-
- if (exists) {
- bool isDirectory;
-- rv = aFileManagerDirectory->IsDirectory(&isDirectory);
-+ rv = aFMDirectory->IsDirectory(&isDirectory);
- NS_ENSURE_SUCCESS(rv, rv);
- NS_ENSURE_TRUE(isDirectory, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
-
-- rv = aFileManagerDirectory->Remove(true);
-+ rv = aFMDirectory->Remove(true);
- NS_ENSURE_SUCCESS(rv, rv);
- }
-
-- rv = ss->OpenDatabaseWithVFS(aDBFile, quotaVFSName,
-- getter_AddRefs(connection));
-+ rv = ss->OpenDatabaseWithFileURL(dbFileUrl, getter_AddRefs(connection));
- }
- NS_ENSURE_SUCCESS(rv, rv);
-
-@@ -2347,6 +2351,8 @@ DeleteDatabaseHelper::DoDatabaseWork(mozIStorageConnection* aConnection)
- {
- NS_ASSERTION(!aConnection, "How did we get a connection here?");
-
-+ const FactoryPrivilege& privilege = mOpenHelper->Privilege();
-+
- IndexedDatabaseManager* mgr = IndexedDatabaseManager::Get();
- NS_ASSERTION(mgr, "This should never fail!");
-
-@@ -2372,59 +2378,57 @@ DeleteDatabaseHelper::DoDatabaseWork(mozIStorageConnection* aConnection)
- rv = dbFile->Exists(&exists);
- NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
-
-- int rc;
--
- if (exists) {
-- nsString dbFilePath;
-- rv = dbFile->GetPath(dbFilePath);
-- NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
-+ int64_t fileSize;
-
-- rc = sqlite3_quota_remove(NS_ConvertUTF16toUTF8(dbFilePath).get());
-- if (rc != SQLITE_OK) {
-- NS_WARNING("Failed to delete db file!");
-- return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR;
-+ if (privilege != Chrome) {
-+ rv = dbFile->GetFileSize(&fileSize);
-+ NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
- }
-
-- // sqlite3_quota_remove won't actually remove anything if we're not tracking
-- // the quota here. Manually remove the file if it exists.
-- rv = dbFile->Exists(&exists);
-+ rv = dbFile->Remove(false);
- NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
-
-- if (exists) {
-- rv = dbFile->Remove(false);
-- NS_ENSURE_SUCCESS(rv, rv);
-+ if (privilege != Chrome) {
-+ QuotaManager* quotaManager = QuotaManager::Get();
-+ NS_ASSERTION(quotaManager, "Shouldn't be null!");
-+
-+ quotaManager->DecreaseUsageForOrigin(mASCIIOrigin, fileSize);
- }
- }
-
-- nsCOMPtr<nsIFile> fileManagerDirectory;
-- rv = directory->Clone(getter_AddRefs(fileManagerDirectory));
-- NS_ENSURE_SUCCESS(rv, rv);
-+ nsCOMPtr<nsIFile> fmDirectory;
-+ rv = directory->Clone(getter_AddRefs(fmDirectory));
-+ NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
-
-- rv = fileManagerDirectory->Append(filename);
-+ rv = fmDirectory->Append(filename);
- NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
-
-- rv = fileManagerDirectory->Exists(&exists);
-+ rv = fmDirectory->Exists(&exists);
- NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
-
- if (exists) {
- bool isDirectory;
-- rv = fileManagerDirectory->IsDirectory(&isDirectory);
-+ rv = fmDirectory->IsDirectory(&isDirectory);
- NS_ENSURE_SUCCESS(rv, rv);
- NS_ENSURE_TRUE(isDirectory, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
-
-- nsString fileManagerDirectoryPath;
-- rv = fileManagerDirectory->GetPath(fileManagerDirectoryPath);
-- NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
-+ uint64_t usage = 0;
-
-- rc = sqlite3_quota_remove(
-- NS_ConvertUTF16toUTF8(fileManagerDirectoryPath).get());
-- if (rc != SQLITE_OK) {
-- NS_WARNING("Failed to delete file directory!");
-- return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR;
-+ if (privilege != Chrome) {
-+ rv = FileManager::GetUsage(fmDirectory, &usage);
-+ NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
- }
-
-- rv = fileManagerDirectory->Remove(true);
-- NS_ENSURE_SUCCESS(rv, rv);
-+ rv = fmDirectory->Remove(true);
-+ NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
-+
-+ if (privilege != Chrome) {
-+ QuotaManager* quotaManager = QuotaManager::Get();
-+ NS_ASSERTION(quotaManager, "Shouldn't be null!");
-+
-+ quotaManager->DecreaseUsageForOrigin(mASCIIOrigin, usage);
-+ }
- }
-
- return NS_OK;
-diff --git dom/indexedDB/OpenDatabaseHelper.h dom/indexedDB/OpenDatabaseHelper.h
-index 587301b..5a3d987 100644
---- dom/indexedDB/OpenDatabaseHelper.h
-+++ dom/indexedDB/OpenDatabaseHelper.h
-@@ -77,10 +77,16 @@ public:
- return mDatabase;
- }
-
-+ const FactoryPrivilege& Privilege() const
-+ {
-+ return mPrivilege;
-+ }
-+
- static
-- nsresult CreateDatabaseConnection(const nsAString& aName,
-- nsIFile* aDBFile,
-- nsIFile* aFileManagerDirectory,
-+ nsresult CreateDatabaseConnection(nsIFile* aDBFile,
-+ nsIFile* aFMDirectory,
-+ const nsAString& aName,
-+ const nsACString& aOrigin,
- mozIStorageConnection** aConnection);
-
- protected:
-diff --git dom/indexedDB/nsIStandardFileStream.idl dom/indexedDB/nsIStandardFileStream.idl
-deleted file mode 100644
-index 265c3ed..0000000
---- dom/indexedDB/nsIStandardFileStream.idl
-+++ /dev/null
-@@ -1,60 +0,0 @@
--/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
--/* vim: set ts=2 et sw=2 tw=80: */
--/* 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 "nsISupports.idl"
--
--interface nsIFile;
--
--/**
-- * A stream that allows you to read from a file or stream to a file
-- * using standard file APIs.
-- */
--[scriptable, uuid(ebbbb779-92a3-4b2a-b7cf-6efbe904c453)]
--interface nsIStandardFileStream : nsISupports
--{
-- /**
-- * If this is set, the file will be opened (i.e., a call to
-- * fopen done) only when we do an actual operation on the stream,
-- * or more specifically, when one of the following is called:
-- * - Seek
-- * - Tell
-- * - SetEOF
-- * - Available
-- * - Read
-- * - Write
-- * - Flush
-- * - GetSize
-- * - GetLastModified
-- * - Sync
-- *
-- * FLAGS_DEFER_OPEN is useful if we use the stream on a background
-- * thread, so that the opening and possible |stat|ing of the file
-- * happens there as well.
-- *
-- * @note Using this flag results in the file not being opened
-- * during the call to Init. This means that any errors that might
-- * happen when this flag is not set would happen during the
-- * first read. Also, the file is not locked when Init is called,
-- * so it might be deleted before we try to read from it.
-- */
-- const long FLAGS_DEFER_OPEN = 1 << 0;
--
-- /**
-- * @param file file to read from or stream to
-- * @param mode file open mode (see fopen documentation)
-- * @param flags flags specifying various behaviors of the class
-- * (see enumerations in the class)
-- */
-- void init(in nsIFile file,
-- in AString mode,
-- in long flags);
--
-- /**
-- * Flush all written content held in memory buffers out to disk.
-- * This is the equivalent of fflush()
-- */
-- void flushBuffers();
--};
-diff --git dom/indexedDB/test/Makefile.in dom/indexedDB/test/Makefile.in
-index 9c79b14..4c9a201 100644
---- dom/indexedDB/test/Makefile.in
-+++ dom/indexedDB/test/Makefile.in
-@@ -54,11 +54,13 @@ MOCHITEST_FILES = \
- test_file_os_delete.html \
- test_file_put_get_object.html \
- test_file_put_get_values.html \
-+ test_file_quota.html \
- test_file_replace.html \
- test_file_resurrection_delete.html \
- test_file_resurrection_transaction_abort.html \
- test_file_sharing.html \
- test_file_transaction_abort.html \
-+ test_filehandle_quota.html \
- test_filehandle_serialization.html \
- test_filehandle_store_snapshot.html \
- test_getAll.html \
-diff --git dom/indexedDB/test/file.js dom/indexedDB/test/file.js
-index 07bd10a..3c6194a 100644
---- dom/indexedDB/test/file.js
-+++ dom/indexedDB/test/file.js
-@@ -3,6 +3,8 @@
- * http://creativecommons.org/publicdomain/zero/1.0/
- */
-
-+const DEFAULT_QUOTA = 50 * 1024 * 1024;
-+
- var bufferCache = [];
- var utils = SpecialPowers.getDOMWindowUtils(window);
-
-@@ -184,25 +186,6 @@ function getUsage(usageHandler)
- idbManager.getUsageForURI(uri, callback);
- }
-
--function getUsageSync()
--{
-- let usage;
--
-- getUsage(function(aUsage, aFileUsage) {
-- usage = aUsage;
-- });
--
-- let comp = SpecialPowers.wrap(Components);
-- let thread = comp.classes["@mozilla.org/thread-manager;1"]
-- .getService(comp.interfaces.nsIThreadManager)
-- .currentThread;
-- while (!usage) {
-- thread.processNextEvent(true);
-- }
--
-- return usage;
--}
--
- function scheduleGC()
- {
- SpecialPowers.exactGC(window, continueToNextStep);
-diff --git dom/indexedDB/test/test_file_quota.html dom/indexedDB/test/test_file_quota.html
-index b07880d..9fbc0c0 100644
---- dom/indexedDB/test/test_file_quota.html
-+++ dom/indexedDB/test/test_file_quota.html
-@@ -13,14 +13,12 @@
- function testSteps()
- {
- const READ_WRITE = IDBTransaction.READ_WRITE;
-- const DEFAULT_QUOTA_MB = 50;
-
- const name = window.location.pathname;
-
- const objectStoreName = "Blobs";
-
-- const testData = { key: 0, value: {} };
-- const fileData = { key: 1, file: null };
-+ const fileData = { key: 1, file: getNullFile("random.bin", DEFAULT_QUOTA) };
-
- let request = indexedDB.open(name, 1);
- request.onerror = errorHandler;
-@@ -32,21 +30,17 @@
-
- let db = event.target.result;
-
-- let objectStore = db.createObjectStore(objectStoreName, { });
-- objectStore.add(testData.value, testData.key);
--
-- let size = (DEFAULT_QUOTA_MB + 1) * 1024 * 1024 - getUsageSync();
-- fileData.file = getNullFile("random.bin", size);
-+ db.createObjectStore(objectStoreName, { });
-
- event = yield;
-
- is(event.type, "success", "Got correct event type");
-
- trans = db.transaction([objectStoreName], READ_WRITE);
-- objectStore = trans.objectStore(objectStoreName);
-+ let objectStore = trans.objectStore(objectStoreName);
-
- request = objectStore.add(fileData.file, fileData.key);
-- request.addEventListener("error", new ExpectError("UnknownError"));
-+ request.addEventListener("error", new ExpectError("UnknownError", true));
- request.onsuccess = unexpectedSuccessHandler;
- event = yield;
-
-diff --git dom/indexedDB/test/test_filehandle_quota.html dom/indexedDB/test/test_filehandle_quota.html
-index addaf01..0506279 100644
---- dom/indexedDB/test/test_filehandle_quota.html
-+++ dom/indexedDB/test/test_filehandle_quota.html
-@@ -13,7 +13,6 @@
- function testSteps()
- {
- const READ_WRITE = IDBTransaction.READ_WRITE;
-- const DEFAULT_QUOTA_MB = 50;
-
- const name = window.location.pathname;
-
-@@ -39,10 +38,10 @@
-
- let lockedFile = fileHandle.open("readwrite");
-
-- let blob = getNullBlob((50 + 1) * 1024 * 1024 - getUsageSync());
-+ let blob = getNullBlob(DEFAULT_QUOTA);
-
- request = lockedFile.write(blob);
-- request.addEventListener("error", new ExpectError("UnknownError"));
-+ request.addEventListener("error", new ExpectError("UnknownError", true));
- request.onsuccess = unexpectedSuccessHandler;
- event = yield;
-
-diff --git dom/quota/FileStreams.cpp dom/quota/FileStreams.cpp
-new file mode 100644
-index 0000000..9de244f
---- /dev/null
-+++ dom/quota/FileStreams.cpp
-@@ -0,0 +1,123 @@
-+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-+/* vim: set ts=2 et sw=2 tw=80: */
-+/* 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 "FileStreams.h"
-+
-+USING_QUOTA_NAMESPACE
-+
-+template <class FileStreamBase>
-+NS_IMETHODIMP
-+FileQuotaStream<FileStreamBase>::SetEOF()
-+{
-+ nsresult rv = FileStreamBase::SetEOF();
-+ NS_ENSURE_SUCCESS(rv, rv);
-+
-+ if (mQuotaObject) {
-+ int64_t offset;
-+ nsresult rv = FileStreamBase::Tell(&offset);
-+ NS_ENSURE_SUCCESS(rv, rv);
-+
-+ mQuotaObject->UpdateSize(offset);
-+ }
-+
-+ return NS_OK;
-+}
-+
-+template <class FileStreamBase>
-+NS_IMETHODIMP
-+FileQuotaStream<FileStreamBase>::Close()
-+{
-+ nsresult rv = FileStreamBase::Close();
-+ NS_ENSURE_SUCCESS(rv, rv);
-+
-+ mQuotaObject = nullptr;
-+
-+ return NS_OK;
-+}
-+
-+template <class FileStreamBase>
-+nsresult
-+FileQuotaStream<FileStreamBase>::DoOpen()
-+{
-+ QuotaManager* quotaManager = QuotaManager::Get();
-+ NS_ASSERTION(quotaManager, "Shouldn't be null!");
-+
-+ NS_ASSERTION(!mQuotaObject, "Creating quota object more than once?");
-+ mQuotaObject = quotaManager->GetQuotaObject(mOrigin,
-+ FileStreamBase::mOpenParams.localFile);
-+
-+ nsresult rv = FileStreamBase::DoOpen();
-+ NS_ENSURE_SUCCESS(rv, rv);
-+
-+ if (mQuotaObject && (FileStreamBase::mOpenParams.ioFlags & PR_TRUNCATE)) {
-+ mQuotaObject->UpdateSize(0);
-+ }
-+
-+ return NS_OK;
-+}
-+
-+template <class FileStreamBase>
-+NS_IMETHODIMP
-+FileQuotaStreamWithWrite<FileStreamBase>::Write(const char* aBuf,
-+ uint32_t aCount,
-+ uint32_t* _retval)
-+{
-+ nsresult rv;
-+
-+ if (FileQuotaStreamWithWrite::mQuotaObject) {
-+ int64_t offset;
-+ rv = FileStreamBase::Tell(&offset);
-+ NS_ENSURE_SUCCESS(rv, rv);
-+
-+ if (!FileQuotaStreamWithWrite::
-+ mQuotaObject->MaybeAllocateMoreSpace(offset, aCount)) {
-+ return NS_ERROR_FAILURE;
-+ }
-+ }
-+
-+ rv = FileStreamBase::Write(aBuf, aCount, _retval);
-+ NS_ENSURE_SUCCESS(rv, rv);
-+
-+ return NS_OK;
-+}
-+
-+NS_IMPL_ISUPPORTS_INHERITED0(FileInputStream, nsFileInputStream)
-+
-+already_AddRefed<FileInputStream>
-+FileInputStream::Create(const nsACString& aOrigin, nsIFile* aFile,
-+ int32_t aIOFlags, int32_t aPerm,
-+ int32_t aBehaviorFlags)
-+{
-+ nsRefPtr<FileInputStream> stream = new FileInputStream(aOrigin);
-+ nsresult rv = stream->Init(aFile, aIOFlags, aPerm, aBehaviorFlags);
-+ NS_ENSURE_SUCCESS(rv, nullptr);
-+ return stream.forget();
-+}
-+
-+NS_IMPL_ISUPPORTS_INHERITED0(FileOutputStream, nsFileOutputStream)
-+
-+already_AddRefed<FileOutputStream>
-+FileOutputStream::Create(const nsACString& aOrigin, nsIFile* aFile,
-+ int32_t aIOFlags, int32_t aPerm,
-+ int32_t aBehaviorFlags)
-+{
-+ nsRefPtr<FileOutputStream> stream = new FileOutputStream(aOrigin);
-+ nsresult rv = stream->Init(aFile, aIOFlags, aPerm, aBehaviorFlags);
-+ NS_ENSURE_SUCCESS(rv, nullptr);
-+ return stream.forget();
-+}
-+
-+NS_IMPL_ISUPPORTS_INHERITED0(FileStream, nsFileStream)
-+
-+already_AddRefed<FileStream>
-+FileStream::Create(const nsACString& aOrigin, nsIFile* aFile, int32_t aIOFlags,
-+ int32_t aPerm, int32_t aBehaviorFlags)
-+{
-+ nsRefPtr<FileStream> stream = new FileStream(aOrigin);
-+ nsresult rv = stream->Init(aFile, aIOFlags, aPerm, aBehaviorFlags);
-+ NS_ENSURE_SUCCESS(rv, nullptr);
-+ return stream.forget();
-+}
-diff --git dom/quota/FileStreams.h dom/quota/FileStreams.h
-new file mode 100644
-index 0000000..77bfad4
---- /dev/null
-+++ dom/quota/FileStreams.h
-@@ -0,0 +1,115 @@
-+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-+/* vim: set ts=2 et sw=2 tw=80: */
-+/* This Source Code Form is subject to the terms of the Mozilla Public
-+ * License, v. 2.0. If a copy of the MPL was not distributed with this
-+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-+
-+#ifndef mozilla_dom_quota_filestreams_h__
-+#define mozilla_dom_quota_filestreams_h__
-+
-+#include "QuotaCommon.h"
-+
-+#include "nsFileStreams.h"
-+
-+#include "QuotaManager.h"
-+
-+BEGIN_QUOTA_NAMESPACE
-+
-+template <class FileStreamBase>
-+class FileQuotaStream : public FileStreamBase
-+{
-+public:
-+ // nsFileStreamBase override
-+ NS_IMETHOD
-+ SetEOF() MOZ_OVERRIDE;
-+
-+ NS_IMETHOD
-+ Close() MOZ_OVERRIDE;
-+
-+protected:
-+ FileQuotaStream(const nsACString& aOrigin)
-+ : mOrigin(aOrigin)
-+ { }
-+
-+ // nsFileStreamBase override
-+ virtual nsresult
-+ DoOpen() MOZ_OVERRIDE;
-+
-+ nsCString mOrigin;
-+ nsRefPtr<QuotaObject> mQuotaObject;
-+};
-+
-+template <class FileStreamBase>
-+class FileQuotaStreamWithWrite : public FileQuotaStream<FileStreamBase>
-+{
-+public:
-+ // nsFileStreamBase override
-+ NS_IMETHOD
-+ Write(const char* aBuf, uint32_t aCount, uint32_t* _retval) MOZ_OVERRIDE;
-+
-+protected:
-+ FileQuotaStreamWithWrite(const nsACString& aOrigin)
-+ : FileQuotaStream<FileStreamBase>(aOrigin)
-+ { }
-+};
-+
-+class FileInputStream : public FileQuotaStream<nsFileInputStream>
-+{
-+public:
-+ NS_DECL_ISUPPORTS_INHERITED
-+
-+ static already_AddRefed<FileInputStream>
-+ Create(const nsACString& aOrigin, nsIFile* aFile, int32_t aIOFlags = -1,
-+ int32_t aPerm = -1, int32_t aBehaviorFlags = 0);
-+
-+private:
-+ FileInputStream(const nsACString& aOrigin)
-+ : FileQuotaStream<nsFileInputStream>(aOrigin)
-+ { }
-+
-+ virtual ~FileInputStream() {
-+ Close();
-+ }
-+};
-+
-+class FileOutputStream : public FileQuotaStreamWithWrite<nsFileOutputStream>
-+{
-+public:
-+ NS_DECL_ISUPPORTS_INHERITED
-+
-+ static already_AddRefed<FileOutputStream>
-+ Create(const nsACString& aOrigin, nsIFile* aFile, int32_t aIOFlags = -1,
-+ int32_t aPerm = -1, int32_t aBehaviorFlags = 0);
-+
-+private:
-+ FileOutputStream(const nsACString& aOrigin)
-+ : FileQuotaStreamWithWrite<nsFileOutputStream>(aOrigin)
-+ { }
-+
-+ virtual ~FileOutputStream() {
-+ Close();
-+ }
-+};
-+
-+class FileStream : public FileQuotaStreamWithWrite<nsFileStream>
-+{
-+public:
-+ NS_DECL_ISUPPORTS_INHERITED
-+
-+ static already_AddRefed<FileStream>
-+ Create(const nsACString& aOrigin, nsIFile* aFile, int32_t aIOFlags = -1,
-+ int32_t aPerm = -1, int32_t aBehaviorFlags = 0);
-+
-+private:
-+ FileStream(const nsACString& aOrigin)
-+ : FileQuotaStreamWithWrite<nsFileStream>(aOrigin)
-+ { }
-+
-+ virtual ~FileStream() {
-+ Close();
-+ }
-+};
-+
-+END_QUOTA_NAMESPACE
-+
-+#endif /* mozilla_dom_quota_filestreams_h__ */
-diff --git dom/quota/Makefile.in dom/quota/Makefile.in
-new file mode 100644
-index 0000000..49be551
---- /dev/null
-+++ dom/quota/Makefile.in
-@@ -0,0 +1,33 @@
-+# 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/.
-+
-+DEPTH = ../..
-+topsrcdir = @top_srcdir@
-+srcdir = @srcdir@
-+VPATH = @srcdir@
-+
-+include $(DEPTH)/config/autoconf.mk
-+
-+MODULE = dom
-+LIBRARY_NAME = domquota_s
-+XPIDL_MODULE = dom_quota
-+LIBXUL_LIBRARY = 1
-+FORCE_STATIC_LIB = 1
-+
-+include $(topsrcdir)/dom/dom-config.mk
-+
-+EXPORTS_NAMESPACES = mozilla/dom/quota
-+
-+CPPSRCS = \
-+ FileStreams.cpp \
-+ QuotaManager.cpp \
-+ $(NULL)
-+
-+EXPORTS_mozilla/dom/quota = \
-+ FileStreams.h \
-+ QuotaCommon.h \
-+ QuotaManager.h \
-+ $(NULL)
-+
-+include $(topsrcdir)/config/rules.mk
-diff --git dom/quota/QuotaCommon.h dom/quota/QuotaCommon.h
-new file mode 100644
-index 0000000..a415d17
---- /dev/null
-+++ dom/quota/QuotaCommon.h
-@@ -0,0 +1,23 @@
-+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-+/* vim: set ts=2 et sw=2 tw=80: */
-+/* This Source Code Form is subject to the terms of the Mozilla Public
-+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
-+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
-+
-+#ifndef mozilla_dom_quota_quotacommon_h__
-+#define mozilla_dom_quota_quotacommon_h__
-+
-+#include "nsAutoPtr.h"
-+#include "nsCOMPtr.h"
-+#include "nsDebug.h"
-+#include "nsStringGlue.h"
-+#include "nsTArray.h"
-+
-+#define BEGIN_QUOTA_NAMESPACE \
-+ namespace mozilla { namespace dom { namespace quota {
-+#define END_QUOTA_NAMESPACE \
-+ } /* namespace quota */ } /* namespace dom */ } /* namespace mozilla */
-+#define USING_QUOTA_NAMESPACE \
-+ using namespace mozilla::dom::quota;
-+
-+#endif // mozilla_dom_quota_quotacommon_h__
-diff --git dom/quota/QuotaManager.cpp dom/quota/QuotaManager.cpp
-new file mode 100644
-index 0000000..b251606
---- /dev/null
-+++ dom/quota/QuotaManager.cpp
-@@ -0,0 +1,294 @@
-+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-+/* vim: set ts=2 et sw=2 tw=80: */
-+/* 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 "QuotaManager.h"
-+
-+#include "nsIFile.h"
-+
-+#include "mozilla/ClearOnShutdown.h"
-+#include "nsComponentManagerUtils.h"
-+
-+#include "mozilla/dom/indexedDB/IndexedDatabaseManager.h"
-+
-+USING_QUOTA_NAMESPACE
-+
-+namespace {
-+
-+nsAutoPtr<QuotaManager> gInstance;
-+
-+PLDHashOperator
-+RemoveQuotaForPatternCallback(const nsACString& aKey,
-+ nsRefPtr<OriginInfo>& aValue,
-+ void* aUserArg)
-+{
-+ NS_ASSERTION(!aKey.IsEmpty(), "Empty key!");
-+ NS_ASSERTION(aValue, "Null pointer!");
-+ NS_ASSERTION(aUserArg, "Null pointer!");
-+
-+ const nsACString* pattern =
-+ static_cast<const nsACString*>(aUserArg);
-+
-+ if (StringBeginsWith(aKey, *pattern)) {
-+ return PL_DHASH_REMOVE;
-+ }
-+
-+ return PL_DHASH_NEXT;
-+}
-+
-+} // anonymous namespace
-+
-+void
-+QuotaObject::AddRef()
-+{
-+ QuotaManager* quotaManager = QuotaManager::Get();
-+ if (!quotaManager) {
-+ NS_ERROR("Null quota manager, this shouldn't happen, possible leak!");
-+
-+ NS_AtomicIncrementRefcnt(mRefCnt);
-+
-+ return;
-+ }
-+
-+ MutexAutoLock lock(quotaManager->mQuotaMutex);
-+
-+ ++mRefCnt;
-+}
-+
-+void
-+QuotaObject::Release()
-+{
-+ QuotaManager* quotaManager = QuotaManager::Get();
-+ if (!quotaManager) {
-+ NS_ERROR("Null quota manager, this shouldn't happen, possible leak!");
-+
-+ nsrefcnt count = NS_AtomicDecrementRefcnt(mRefCnt);
-+ if (count == 0) {
-+ mRefCnt = 1;
-+ delete this;
-+ }
-+
-+ return;
-+ }
-+
-+ {
-+ MutexAutoLock lock(quotaManager->mQuotaMutex);
-+
-+ --mRefCnt;
-+
-+ if (mRefCnt > 0) {
-+ return;
-+ }
-+
-+ if (mOriginInfo) {
-+ mOriginInfo->mQuotaObjects.Remove(mPath);
-+ }
-+ }
-+
-+ delete this;
-+}
-+
-+void
-+QuotaObject::UpdateSize(int64_t aSize)
-+{
-+ QuotaManager* quotaManager = QuotaManager::Get();
-+ NS_ASSERTION(quotaManager, "Shouldn't be null!");
-+
-+ MutexAutoLock lock(quotaManager->mQuotaMutex);
-+
-+ if (mOriginInfo) {
-+ mOriginInfo->mUsage -= mSize;
-+ mSize = aSize;
-+ mOriginInfo->mUsage += mSize;
-+ }
-+}
-+
-+bool
-+QuotaObject::MaybeAllocateMoreSpace(int64_t aOffset, int32_t aCount)
-+{
-+ int64_t end = aOffset + aCount;
-+
-+ QuotaManager* quotaManager = QuotaManager::Get();
-+ NS_ASSERTION(quotaManager, "Shouldn't be null!");
-+
-+ MutexAutoLock lock(quotaManager->mQuotaMutex);
-+
-+ if (mSize >= end || !mOriginInfo) {
-+ return true;
-+ }
-+
-+ int64_t newUsage = mOriginInfo->mUsage - mSize + end;
-+ if (newUsage > mOriginInfo->mLimit) {
-+ if (!indexedDB::IndexedDatabaseManager::QuotaIsLifted()) {
-+ return false;
-+ }
-+
-+ nsCString origin = mOriginInfo->mOrigin;
-+
-+ mOriginInfo->LockedClearOriginInfos();
-+ NS_ASSERTION(!mOriginInfo,
-+ "Should have cleared in LockedClearOriginInfos!");
-+
-+ quotaManager->mOriginInfos.Remove(origin);
-+
-+ mSize = end;
-+
-+ return true;
-+ }
-+
-+ mOriginInfo->mUsage = newUsage;
-+ mSize = end;
-+
-+ return true;
-+}
-+
-+#ifdef DEBUG
-+void
-+OriginInfo::LockedClearOriginInfos()
-+{
-+ QuotaManager* quotaManager = QuotaManager::Get();
-+ NS_ASSERTION(quotaManager, "Shouldn't be null!");
-+
-+ quotaManager->mQuotaMutex.AssertCurrentThreadOwns();
-+
-+ mQuotaObjects.EnumerateRead(ClearOriginInfoCallback, nullptr);
-+}
-+#endif
-+
-+// static
-+PLDHashOperator
-+OriginInfo::ClearOriginInfoCallback(const nsAString& aKey,
-+ QuotaObject* aValue,
-+ void* aUserArg)
-+{
-+ NS_ASSERTION(!aKey.IsEmpty(), "Empty key!");
-+ NS_ASSERTION(aValue, "Null pointer!");
-+
-+ aValue->mOriginInfo = nullptr;
-+
-+ return PL_DHASH_NEXT;
-+}
-+
-+// static
-+QuotaManager*
-+QuotaManager::GetOrCreate()
-+{
-+ if (!gInstance) {
-+ NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
-+
-+ gInstance = new QuotaManager();
-+
-+ ClearOnShutdown(&gInstance);
-+ }
-+
-+ return gInstance;
-+}
-+
-+// static
-+QuotaManager*
-+QuotaManager::Get()
-+{
-+ // Does not return an owning reference.
-+ return gInstance;
-+}
-+
-+void
-+QuotaManager::InitQuotaForOrigin(const nsACString& aOrigin,
-+ int64_t aLimit,
-+ int64_t aUsage)
-+{
-+ OriginInfo* info = new OriginInfo(aOrigin, aLimit * 1024 * 1024, aUsage);
-+
-+ MutexAutoLock lock(mQuotaMutex);
-+
-+ NS_ASSERTION(!mOriginInfos.GetWeak(aOrigin), "Replacing an existing entry!");
-+ mOriginInfos.Put(aOrigin, info);
-+}
-+
-+void
-+QuotaManager::DecreaseUsageForOrigin(const nsACString& aOrigin,
-+ int64_t aSize)
-+{
-+ MutexAutoLock lock(mQuotaMutex);
-+
-+ nsRefPtr<OriginInfo> originInfo;
-+ mOriginInfos.Get(aOrigin, getter_AddRefs(originInfo));
-+
-+ if (originInfo) {
-+ originInfo->mUsage -= aSize;
-+ }
-+}
-+
-+void
-+QuotaManager::RemoveQuotaForPattern(const nsACString& aPattern)
-+{
-+ NS_ASSERTION(!aPattern.IsEmpty(), "Empty pattern!");
-+
-+ MutexAutoLock lock(mQuotaMutex);
-+
-+ mOriginInfos.Enumerate(RemoveQuotaForPatternCallback,
-+ const_cast<nsACString*>(&aPattern));
-+}
-+
-+already_AddRefed<QuotaObject>
-+QuotaManager::GetQuotaObject(const nsACString& aOrigin,
-+ nsIFile* aFile)
-+{
-+ NS_ASSERTION(!NS_IsMainThread(), "Wrong thread!");
-+
-+ nsString path;
-+ nsresult rv = aFile->GetPath(path);
-+ NS_ENSURE_SUCCESS(rv, nullptr);
-+
-+ int64_t fileSize;
-+
-+ bool exists;
-+ rv = aFile->Exists(&exists);
-+ NS_ENSURE_SUCCESS(rv, nullptr);
-+
-+ if (exists) {
-+ rv = aFile->GetFileSize(&fileSize);
-+ NS_ENSURE_SUCCESS(rv, nullptr);
-+ }
-+ else {
-+ fileSize = 0;
-+ }
-+
-+ QuotaObject* info = nullptr;
-+ {
-+ MutexAutoLock lock(mQuotaMutex);
-+
-+ nsRefPtr<OriginInfo> originInfo;
-+ mOriginInfos.Get(aOrigin, getter_AddRefs(originInfo));
-+
-+ if (!originInfo) {
-+ return nullptr;
-+ }
-+
-+ originInfo->mQuotaObjects.Get(path, &info);
-+
-+ if (!info) {
-+ info = new QuotaObject(originInfo, path, fileSize);
-+ originInfo->mQuotaObjects.Put(path, info);
-+ }
-+ }
-+
-+ nsRefPtr<QuotaObject> result = info;
-+ return result.forget();
-+}
-+
-+already_AddRefed<QuotaObject>
-+QuotaManager::GetQuotaObject(const nsACString& aOrigin,
-+ const nsAString& aPath)
-+{
-+ nsresult rv;
-+ nsCOMPtr<nsIFile> file = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv);
-+ NS_ENSURE_SUCCESS(rv, nullptr);
-+
-+ rv = file->InitWithPath(aPath);
-+ NS_ENSURE_SUCCESS(rv, nullptr);
-+
-+ return GetQuotaObject(aOrigin, file);
-+}
-diff --git dom/quota/QuotaManager.h dom/quota/QuotaManager.h
-new file mode 100644
-index 0000000..e19acdd
---- /dev/null
-+++ dom/quota/QuotaManager.h
-@@ -0,0 +1,147 @@
-+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-+/* vim: set ts=2 et sw=2 tw=80: */
-+/* This Source Code Form is subject to the terms of the Mozilla Public
-+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
-+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
-+
-+#ifndef mozilla_dom_quota_quotamanager_h__
-+#define mozilla_dom_quota_quotamanager_h__
-+
-+#include "QuotaCommon.h"
-+
-+#include "mozilla/Mutex.h"
-+#include "nsDataHashtable.h"
-+#include "nsRefPtrHashtable.h"
-+#include "nsThreadUtils.h"
-+
-+BEGIN_QUOTA_NAMESPACE
-+
-+class OriginInfo;
-+class QuotaManager;
-+
-+class QuotaObject
-+{
-+ friend class OriginInfo;
-+ friend class QuotaManager;
-+
-+public:
-+ void
-+ AddRef();
-+
-+ void
-+ Release();
-+
-+ void
-+ UpdateSize(int64_t aSize);
-+
-+ bool
-+ MaybeAllocateMoreSpace(int64_t aOffset, int32_t aCount);
-+
-+private:
-+ QuotaObject(OriginInfo* aOriginInfo, const nsAString& aPath, int64_t aSize)
-+ : mOriginInfo(aOriginInfo), mPath(aPath), mSize(aSize)
-+ { }
-+
-+ virtual ~QuotaObject()
-+ { }
-+
-+ nsAutoRefCnt mRefCnt;
-+
-+ OriginInfo* mOriginInfo;
-+ nsString mPath;
-+ int64_t mSize;
-+};
-+
-+class OriginInfo
-+{
-+ friend class QuotaManager;
-+ friend class QuotaObject;
-+
-+public:
-+ OriginInfo(const nsACString& aOrigin, int64_t aLimit, int64_t aUsage)
-+ : mOrigin(aOrigin), mLimit(aLimit), mUsage(aUsage)
-+ {
-+ mQuotaObjects.Init();
-+ }
-+
-+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(OriginInfo)
-+
-+private:
-+ void
-+#ifdef DEBUG
-+ LockedClearOriginInfos();
-+#else
-+ LockedClearOriginInfos()
-+ {
-+ mQuotaObjects.EnumerateRead(ClearOriginInfoCallback, nullptr);
-+ }
-+#endif
-+
-+ static PLDHashOperator
-+ ClearOriginInfoCallback(const nsAString& aKey,
-+ QuotaObject* aValue, void* aUserArg);
-+
-+ nsDataHashtable<nsStringHashKey, QuotaObject*> mQuotaObjects;
-+
-+ nsCString mOrigin;
-+ int64_t mLimit;
-+ int64_t mUsage;
-+};
-+
-+class QuotaManager
-+{
-+ friend class nsAutoPtr<QuotaManager>;
-+ friend class OriginInfo;
-+ friend class QuotaObject;
-+
-+public:
-+ // Returns a non-owning reference.
-+ static QuotaManager*
-+ GetOrCreate();
-+
-+ // Returns a non-owning reference.
-+ static QuotaManager*
-+ Get();
-+
-+ void
-+ InitQuotaForOrigin(const nsACString& aOrigin,
-+ int64_t aLimit,
-+ int64_t aUsage);
-+
-+ void
-+ DecreaseUsageForOrigin(const nsACString& aOrigin,
-+ int64_t aSize);
-+
-+ void
-+ RemoveQuotaForPattern(const nsACString& aPattern);
-+
-+ already_AddRefed<QuotaObject>
-+ GetQuotaObject(const nsACString& aOrigin,
-+ nsIFile* aFile);
-+
-+ already_AddRefed<QuotaObject>
-+ GetQuotaObject(const nsACString& aOrigin,
-+ const nsAString& aPath);
-+
-+private:
-+ QuotaManager()
-+ : mQuotaMutex("QuotaManager.mQuotaMutex")
-+ {
-+ NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
-+
-+ mOriginInfos.Init();
-+ }
-+
-+ virtual ~QuotaManager()
-+ {
-+ NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
-+ }
-+
-+ mozilla::Mutex mQuotaMutex;
-+
-+ nsRefPtrHashtable<nsCStringHashKey, OriginInfo> mOriginInfos;
-+};
-+
-+END_QUOTA_NAMESPACE
-+
-+#endif /* mozilla_dom_quota_quotamanager_h__ */
-diff --git layout/build/Makefile.in layout/build/Makefile.in
-index e6b32da..496b55f 100644
---- layout/build/Makefile.in
-+++ layout/build/Makefile.in
-@@ -69,6 +69,7 @@ SHARED_LIBRARY_LIBS = \
- $(DEPTH)/dom/encoding/$(LIB_PREFIX)domencoding_s.$(LIB_SUFFIX) \
- $(DEPTH)/dom/file/$(LIB_PREFIX)domfile_s.$(LIB_SUFFIX) \
- $(DEPTH)/dom/power/$(LIB_PREFIX)dom_power_s.$(LIB_SUFFIX) \
-+ $(DEPTH)/dom/quota/$(LIB_PREFIX)domquota_s.$(LIB_SUFFIX) \
- $(DEPTH)/dom/settings/$(LIB_PREFIX)jsdomsettings_s.$(LIB_SUFFIX) \
- $(DEPTH)/dom/permission/$(LIB_PREFIX)jsdompermissionsettings_s.$(LIB_SUFFIX) \
- $(DEPTH)/dom/network/src/$(LIB_PREFIX)dom_network_s.$(LIB_SUFFIX) \
-diff --git netwerk/base/src/Makefile.in netwerk/base/src/Makefile.in
-index 0c0d60e..e8cef48 100644
---- netwerk/base/src/Makefile.in
-+++ netwerk/base/src/Makefile.in
-@@ -19,6 +19,7 @@ LIBXUL_LIBRARY = 1
- EXPORTS = \
- nsMIMEInputStream.h \
- nsURLHelper.h \
-+ nsFileStreams.h \
- $(NULL)
-
- EXPORTS_NAMESPACES = mozilla/net
-diff --git netwerk/base/src/nsFileStreams.cpp netwerk/base/src/nsFileStreams.cpp
-index 2420ffc..ecc26aa 100644
---- netwerk/base/src/nsFileStreams.cpp
-+++ netwerk/base/src/nsFileStreams.cpp
-@@ -51,7 +51,9 @@ nsFileStreamBase::~nsFileStreamBase()
- Close();
- }
-
--NS_IMPL_THREADSAFE_ISUPPORTS1(nsFileStreamBase, nsISeekableStream)
-+NS_IMPL_THREADSAFE_ISUPPORTS2(nsFileStreamBase,
-+ nsISeekableStream,
-+ nsIFileMetadata)
-
- NS_IMETHODIMP
- nsFileStreamBase::Seek(int32_t whence, int64_t offset)
-@@ -124,6 +126,52 @@ nsFileStreamBase::SetEOF()
- return NS_OK;
- }
-
-+NS_IMETHODIMP
-+nsFileStreamBase::GetSize(int64_t* _retval)
-+{
-+ nsresult rv = DoPendingOpen();
-+ NS_ENSURE_SUCCESS(rv, rv);
-+
-+ if (!mFD) {
-+ return NS_BASE_STREAM_CLOSED;
-+ }
-+
-+ PRFileInfo64 info;
-+ if (PR_GetOpenFileInfo64(mFD, &info) == PR_FAILURE) {
-+ return NS_BASE_STREAM_OSERROR;
-+ }
-+
-+ *_retval = int64_t(info.size);
-+
-+ return NS_OK;
-+}
-+
-+NS_IMETHODIMP
-+nsFileStreamBase::GetLastModified(int64_t* _retval)
-+{
-+ nsresult rv = DoPendingOpen();
-+ NS_ENSURE_SUCCESS(rv, rv);
-+
-+ if (!mFD) {
-+ return NS_BASE_STREAM_CLOSED;
-+ }
-+
-+ PRFileInfo64 info;
-+ if (PR_GetOpenFileInfo64(mFD, &info) == PR_FAILURE) {
-+ return NS_BASE_STREAM_OSERROR;
-+ }
-+
-+ int64_t modTime = int64_t(info.modifyTime);
-+ if (modTime == 0) {
-+ *_retval = 0;
-+ }
-+ else {
-+ *_retval = modTime / int64_t(PR_USEC_PER_MSEC);
-+ }
-+
-+ return NS_OK;
-+}
-+
- nsresult
- nsFileStreamBase::Close()
- {
-@@ -934,13 +982,12 @@ nsSafeFileOutputStream::Write(const char *buf, uint32_t count, uint32_t *result)
- ////////////////////////////////////////////////////////////////////////////////
- // nsFileStream
-
--NS_IMPL_ISUPPORTS_INHERITED4(nsFileStream,
-+NS_IMPL_ISUPPORTS_INHERITED3(nsFileStream,
- nsFileStreamBase,
- nsIInputStream,
- nsIOutputStream,
-- nsIFileStream,
-- nsIFileMetadata)
--
-+ nsIFileStream)
-+
- NS_IMETHODIMP
- nsFileStream::Init(nsIFile* file, int32_t ioFlags, int32_t perm,
- int32_t behaviorFlags)
-@@ -959,50 +1006,4 @@ nsFileStream::Init(nsIFile* file, int32_t ioFlags, int32_t perm,
- mBehaviorFlags & nsIFileStream::DEFER_OPEN);
- }
-
--NS_IMETHODIMP
--nsFileStream::GetSize(int64_t* _retval)
--{
-- nsresult rv = DoPendingOpen();
-- NS_ENSURE_SUCCESS(rv, rv);
--
-- if (!mFD) {
-- return NS_BASE_STREAM_CLOSED;
-- }
--
-- PRFileInfo64 info;
-- if (PR_GetOpenFileInfo64(mFD, &info) == PR_FAILURE) {
-- return NS_BASE_STREAM_OSERROR;
-- }
--
-- *_retval = int64_t(info.size);
--
-- return NS_OK;
--}
--
--NS_IMETHODIMP
--nsFileStream::GetLastModified(int64_t* _retval)
--{
-- nsresult rv = DoPendingOpen();
-- NS_ENSURE_SUCCESS(rv, rv);
--
-- if (!mFD) {
-- return NS_BASE_STREAM_CLOSED;
-- }
--
-- PRFileInfo64 info;
-- if (PR_GetOpenFileInfo64(mFD, &info) == PR_FAILURE) {
-- return NS_BASE_STREAM_OSERROR;
-- }
--
-- int64_t modTime = int64_t(info.modifyTime);
-- if (modTime == 0) {
-- *_retval = 0;
-- }
-- else {
-- *_retval = modTime / int64_t(PR_USEC_PER_MSEC);
-- }
--
-- return NS_OK;
--}
--
- ////////////////////////////////////////////////////////////////////////////////
-diff --git netwerk/base/src/nsFileStreams.h netwerk/base/src/nsFileStreams.h
-index 13e5b45..1aa6a82 100644
---- netwerk/base/src/nsFileStreams.h
-+++ netwerk/base/src/nsFileStreams.h
-@@ -24,11 +24,13 @@
-
- ////////////////////////////////////////////////////////////////////////////////
-
--class nsFileStreamBase : public nsISeekableStream
-+class nsFileStreamBase : public nsISeekableStream,
-+ public nsIFileMetadata
- {
- public:
- NS_DECL_ISUPPORTS
- NS_DECL_NSISEEKABLESTREAM
-+ NS_DECL_NSIFILEMETADATA
-
- nsFileStreamBase();
- virtual ~nsFileStreamBase();
-@@ -124,8 +126,8 @@ public:
- NS_IMETHOD IsNonBlocking(bool* _retval)
- {
- return nsFileStreamBase::IsNonBlocking(_retval);
-- }
--
-+ }
-+
- // Overrided from nsFileStreamBase
- NS_IMETHOD Seek(int32_t aWhence, int64_t aOffset);
-
-@@ -260,13 +262,11 @@ protected:
- class nsFileStream : public nsFileStreamBase,
- public nsIInputStream,
- public nsIOutputStream,
-- public nsIFileStream,
-- public nsIFileMetadata
-+ public nsIFileStream
- {
- public:
- NS_DECL_ISUPPORTS_INHERITED
- NS_DECL_NSIFILESTREAM
-- NS_DECL_NSIFILEMETADATA
- NS_FORWARD_NSIINPUTSTREAM(nsFileStreamBase::)
-
- // Can't use NS_FORWARD_NSIOUTPUTSTREAM due to overlapping methods
-diff --git storage/public/Makefile.in storage/public/Makefile.in
-index c485d4e..c05e6f3 100644
---- storage/public/Makefile.in
-+++ storage/public/Makefile.in
-@@ -36,7 +36,6 @@ XPIDLSRCS = \
- mozIStorageCompletionCallback.idl \
- mozIStorageBaseStatement.idl \
- mozIStorageAsyncStatement.idl \
-- mozIStorageServiceQuotaManagement.idl \
- mozIStorageVacuumParticipant.idl \
- $(NULL)
- # SEE ABOVE NOTE!
-diff --git storage/public/mozIStorageService.idl storage/public/mozIStorageService.idl
-index 3087a11..483649b 100644
---- storage/public/mozIStorageService.idl
-+++ storage/public/mozIStorageService.idl
-@@ -7,6 +7,7 @@
-
- interface mozIStorageConnection;
- interface nsIFile;
-+interface nsIFileURL;
-
- /**
- * The mozIStorageService interface is intended to be implemented by
-@@ -15,7 +16,7 @@ interface nsIFile;
- *
- * This is the only way to open a database connection.
- */
--[scriptable, uuid(fe8e95cb-b377-4c8d-bccb-d9198c67542b)]
-+[scriptable, uuid(12bfad34-cca3-40fb-8736-d8bf9db61a27)]
- interface mozIStorageService : nsISupports {
- /**
- * Get a connection to a named special database storage.
-@@ -106,6 +107,16 @@ interface mozIStorageService : nsISupports {
- */
- mozIStorageConnection openUnsharedDatabase(in nsIFile aDatabaseFile);
-
-+ /**
-+ * See openDatabase(). Exactly the same only initialized with a file URL.
-+ * Custom parameters can be passed to SQLite and VFS implementations through
-+ * the query part of the URL.
-+ *
-+ * @param aURL
-+ * A nsIFileURL that represents the database that is to be opened.
-+ */
-+ mozIStorageConnection openDatabaseWithFileURL(in nsIFileURL aFileURL);
-+
- /*
- * Utilities
- */
-diff --git storage/public/mozIStorageServiceQuotaManagement.idl storage/public/mozIStorageServiceQuotaManagement.idl
-deleted file mode 100644
-index ee5086b..0000000
---- storage/public/mozIStorageServiceQuotaManagement.idl
-+++ /dev/null
-@@ -1,99 +0,0 @@
--/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
--/* vim: set ts=2 et sw=2 tw=80: */
--/* 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 "nsISupports.idl"
--
--interface mozIStorageConnection;
--interface nsIFile;
--
--[scriptable, function, uuid(ae94f0a5-ebdf-48f4-9959-085e13235d8d)]
--interface mozIStorageQuotaCallback : nsISupports
--{
-- /**
-- * Called when the file size quota for a group of databases is exceeded.
-- *
-- * @param aFilename
-- * The filename of the database that has exceeded the quota.
-- *
-- * @param aCurrentSizeLimit
-- * The current size (in bytes) of the quota.
-- *
-- * @param aCurrentTotalSize
-- * The current size of all databases in the quota group.
-- *
-- * @param aUserData
-- * Any additional data that was provided to the
-- * setQuotaForFilenamePattern function.
-- *
-- * @returns A new quota size. A new quota of 0 will disable the quota callback
-- * and any quota value less than aCurrentTotalSize will cause the
-- * database operation to fail with NS_ERROR_FILE_NO_DEVICE_SPACE.
-- */
-- long long quotaExceeded(in ACString aFilename,
-- in long long aCurrentSizeLimit,
-- in long long aCurrentTotalSize,
-- in nsISupports aUserData);
--};
--
--/**
-- * This is a temporary interface that should eventually merge with
-- * mozIStorageService.
-- */
--[scriptable, uuid(4d81faf5-fe01-428b-99b8-c94cba12fd72)]
--interface mozIStorageServiceQuotaManagement : nsISupports
--{
-- /**
-- * See mozIStorageService.openDatabase. Exactly the same only with a custom
-- * SQLite VFS.
-- */
-- mozIStorageConnection openDatabaseWithVFS(in nsIFile aDatabaseFile,
-- in ACString aVFSName);
--
-- /**
-- * Set a file size quota for a group of databases matching the given filename
-- * pattern, optionally specifying a callback when the quota is exceeded.
-- *
-- * @param aPattern
-- * A pattern to match filenames for inclusion in the quota system. May
-- * contain the following special characters:
-- * '*' Matches any sequence of zero or more characters.
-- * '?' Matches exactly one character.
-- * [...] Matches one character from the enclosed list of characters.
-- * [^...] Matches one character not in the enclosed list.
-- *
-- * @param aSizeLimit
-- * The size limit (in bytes) for the quota group.
-- *
-- * @param aCallback
-- * A callback that will be used when the quota is exceeded.
-- *
-- * @param aUserData
-- * Additional information to be passed to the callback.
-- */
-- void setQuotaForFilenamePattern(in ACString aPattern,
-- in long long aSizeLimit,
-- in mozIStorageQuotaCallback aCallback,
-- in nsISupports aUserData);
--
-- /**
-- * Adds, removes, or updates the file size information maintained by the quota
-- * system for files not opened through openDatabaseWithVFS().
-- *
-- * Use this function when you want files to be included in quota calculations
-- * that are either a) not SQLite databases, or b) SQLite databases that have
-- * not been opened.
-- *
-- * This function will have no effect on files that do not match an existing
-- * quota pattern (set previously by setQuotaForFilenamePattern()).
-- *
-- * @param aFile
-- * The file for which quota information should be updated. If the file
-- * exists then its size information will be added or refreshed. If the
-- * file does not exist then the file will be removed from tracking
-- * under the quota system.
-- */
-- void updateQuotaInformationForFile(in nsIFile aFile);
--};
-diff --git storage/public/storage.h storage/public/storage.h
-index 8e571e2..08f39f3 100644
---- storage/public/storage.h
-+++ storage/public/storage.h
-@@ -24,7 +24,6 @@
- #include "mozIStorageStatementCallback.h"
- #include "mozIStorageBindingParamsArray.h"
- #include "mozIStorageBindingParams.h"
--#include "mozIStorageServiceQuotaManagement.h"
- #include "mozIStorageVacuumParticipant.h"
- #include "mozIStorageCompletionCallback.h"
- #include "mozIStorageAsyncStatement.h"
-diff --git storage/src/TelemetryVFS.cpp storage/src/TelemetryVFS.cpp
-index 60de5c4..e4fce09 100644
---- storage/src/TelemetryVFS.cpp
-+++ storage/src/TelemetryVFS.cpp
-@@ -10,6 +10,7 @@
- #include "sqlite3.h"
- #include "nsThreadUtils.h"
- #include "mozilla/Util.h"
-+#include "mozilla/dom/quota/QuotaManager.h"
-
- /**
- * This preference is a workaround to allow users/sysadmins to identify
-@@ -24,6 +25,7 @@
- namespace {
-
- using namespace mozilla;
-+using namespace mozilla::dom::quota;
-
- struct Histograms {
- const char *name;
-@@ -82,9 +84,17 @@ private:
- };
-
- struct telemetry_file {
-- sqlite3_file base; // Base class. Must be first
-- Histograms *histograms; // histograms pertaining to this file
-- sqlite3_file pReal[1]; // This contains the vfs that actually does work
-+ // Base class. Must be first
-+ sqlite3_file base;
-+
-+ // histograms pertaining to this file
-+ Histograms *histograms;
-+
-+ // quota object for this file
-+ nsRefPtr<QuotaObject> quotaObject;
-+
-+ // This contains the vfs that actually does work
-+ sqlite3_file pReal[1];
- };
-
- /*
-@@ -99,6 +109,7 @@ xClose(sqlite3_file *pFile)
- if( rc==SQLITE_OK ){
- delete p->base.pMethods;
- p->base.pMethods = NULL;
-+ p->quotaObject = nullptr;
- }
- return rc;
- }
-@@ -126,6 +137,9 @@ int
- xWrite(sqlite3_file *pFile, const void *zBuf, int iAmt, sqlite_int64 iOfst)
- {
- telemetry_file *p = (telemetry_file *)pFile;
-+ if (p->quotaObject && !p->quotaObject->MaybeAllocateMoreSpace(iOfst, iAmt)) {
-+ return SQLITE_FULL;
-+ }
- IOThreadAutoTimer ioTimer(p->histograms->writeMS);
- int rc;
- rc = p->pReal->pMethods->xWrite(p->pReal, zBuf, iAmt, iOfst);
-@@ -144,6 +158,9 @@ xTruncate(sqlite3_file *pFile, sqlite_int64 size)
- int rc;
- Telemetry::AutoTimer<Telemetry::MOZ_SQLITE_TRUNCATE_MS> timer;
- rc = p->pReal->pMethods->xTruncate(p->pReal, size);
-+ if (rc == SQLITE_OK && p->quotaObject) {
-+ p->quotaObject->UpdateSize(size);
-+ }
- return rc;
- }
-
-@@ -300,6 +317,18 @@ xOpen(sqlite3_vfs* vfs, const char *zName, sqlite3_file* pFile,
- break;
- }
- p->histograms = h;
-+
-+ const char* origin;
-+ if ((flags & SQLITE_OPEN_URI) &&
-+ (origin = sqlite3_uri_parameter(zName, "origin"))) {
-+ QuotaManager* quotaManager = QuotaManager::Get();
-+ MOZ_ASSERT(quotaManager);
-+
-+ p->quotaObject = quotaManager->GetQuotaObject(nsDependentCString(origin),
-+ NS_ConvertUTF8toUTF16(zName));
-+
-+ }
-+
- rc = orig_vfs->xOpen(orig_vfs, zName, p->pReal, flags, pOutFlags);
- if( rc != SQLITE_OK )
- return rc;
-diff --git storage/src/mozStorageConnection.cpp storage/src/mozStorageConnection.cpp
-index 3afd3e1b..430824a 100644
---- storage/src/mozStorageConnection.cpp
-+++ storage/src/mozStorageConnection.cpp
-@@ -12,6 +12,7 @@
- #include "nsIMemoryReporter.h"
- #include "nsThreadUtils.h"
- #include "nsIFile.h"
-+#include "nsIFileURL.h"
- #include "mozilla/Telemetry.h"
- #include "mozilla/Mutex.h"
- #include "mozilla/CondVar.h"
-@@ -471,34 +472,83 @@ Connection::getAsyncExecutionTarget()
- }
-
- nsresult
--Connection::initialize(nsIFile *aDatabaseFile,
-- const char* aVFSName)
-+Connection::initialize()
- {
- NS_ASSERTION (!mDBConn, "Initialize called on already opened database!");
- SAMPLE_LABEL("storage", "Connection::initialize");
-
-- int srv;
-- nsresult rv;
-+ // in memory database requested, sqlite uses a magic file name
-+ int srv = ::sqlite3_open_v2(":memory:", &mDBConn, mFlags, NULL);
-+ if (srv != SQLITE_OK) {
-+ mDBConn = nullptr;
-+ return convertResultCode(srv);
-+ }
-+
-+ return initializeInternal(nullptr);
-+}
-+
-+nsresult
-+Connection::initialize(nsIFile *aDatabaseFile)
-+{
-+ NS_ASSERTION (aDatabaseFile, "Passed null file!");
-+ NS_ASSERTION (!mDBConn, "Initialize called on already opened database!");
-+ SAMPLE_LABEL("storage", "Connection::initialize");
-
- mDatabaseFile = aDatabaseFile;
-
-- if (aDatabaseFile) {
-- nsAutoString path;
-- rv = aDatabaseFile->GetPath(path);
-- NS_ENSURE_SUCCESS(rv, rv);
-+ nsAutoString path;
-+ nsresult rv = aDatabaseFile->GetPath(path);
-+ NS_ENSURE_SUCCESS(rv, rv);
-
-- srv = ::sqlite3_open_v2(NS_ConvertUTF16toUTF8(path).get(), &mDBConn, mFlags,
-- aVFSName);
-- }
-- else {
-- // in memory database requested, sqlite uses a magic file name
-- srv = ::sqlite3_open_v2(":memory:", &mDBConn, mFlags, aVFSName);
-+ int srv = ::sqlite3_open_v2(NS_ConvertUTF16toUTF8(path).get(), &mDBConn,
-+ mFlags, NULL);
-+ if (srv != SQLITE_OK) {
-+ mDBConn = nullptr;
-+ return convertResultCode(srv);
- }
-+
-+ rv = initializeInternal(aDatabaseFile);
-+ NS_ENSURE_SUCCESS(rv, rv);
-+
-+ mDatabaseFile = aDatabaseFile;
-+
-+ return NS_OK;
-+}
-+
-+nsresult
-+Connection::initialize(nsIFileURL *aFileURL)
-+{
-+ NS_ASSERTION (aFileURL, "Passed null file URL!");
-+ NS_ASSERTION (!mDBConn, "Initialize called on already opened database!");
-+ SAMPLE_LABEL("storage", "Connection::initialize");
-+
-+ nsCOMPtr<nsIFile> databaseFile;
-+ nsresult rv = aFileURL->GetFile(getter_AddRefs(databaseFile));
-+ NS_ENSURE_SUCCESS(rv, rv);
-+
-+ nsAutoCString spec;
-+ rv = aFileURL->GetSpec(spec);
-+ NS_ENSURE_SUCCESS(rv, rv);
-+
-+ int srv = ::sqlite3_open_v2(spec.get(), &mDBConn, mFlags, NULL);
- if (srv != SQLITE_OK) {
- mDBConn = nullptr;
- return convertResultCode(srv);
- }
-
-+ rv = initializeInternal(databaseFile);
-+ NS_ENSURE_SUCCESS(rv, rv);
-+
-+ mFileURL = aFileURL;
-+ mDatabaseFile = databaseFile;
-+
-+ return NS_OK;
-+}
-+
-+
-+nsresult
-+Connection::initializeInternal(nsIFile* aDatabaseFile)
-+{
- // Properly wrap the database handle's mutex.
- sharedDBMutex.initWithMutex(sqlite3_db_mutex(mDBConn));
-
-@@ -522,14 +572,14 @@ Connection::initialize(nsIFile *aDatabaseFile,
- nsAutoCString pageSizeQuery(MOZ_STORAGE_UNIQUIFY_QUERY_STR
- "PRAGMA page_size = ");
- pageSizeQuery.AppendInt(pageSize);
-- rv = ExecuteSimpleSQL(pageSizeQuery);
-+ nsresult rv = ExecuteSimpleSQL(pageSizeQuery);
- NS_ENSURE_SUCCESS(rv, rv);
-
- // Get the current page_size, since it may differ from the specified value.
- sqlite3_stmt *stmt;
- NS_NAMED_LITERAL_CSTRING(pragma_page_size,
- MOZ_STORAGE_UNIQUIFY_QUERY_STR "PRAGMA page_size");
-- srv = prepareStatement(pragma_page_size, &stmt);
-+ int srv = prepareStatement(pragma_page_size, &stmt);
- if (srv == SQLITE_OK) {
- if (SQLITE_ROW == stepStatement(stmt)) {
- pageSize = ::sqlite3_column_int64(stmt, 0);
-@@ -962,7 +1012,8 @@ Connection::Clone(bool aReadOnly,
- nsRefPtr<Connection> clone = new Connection(mStorageService, flags);
- NS_ENSURE_TRUE(clone, NS_ERROR_OUT_OF_MEMORY);
-
-- nsresult rv = clone->initialize(mDatabaseFile);
-+ nsresult rv = mFileURL ? clone->initialize(mFileURL)
-+ : clone->initialize(mDatabaseFile);
- NS_ENSURE_SUCCESS(rv, rv);
-
- // Copy over pragmas from the original connection.
-diff --git storage/src/mozStorageConnection.h storage/src/mozStorageConnection.h
-index b71f5db..97f5cf8 100644
---- storage/src/mozStorageConnection.h
-+++ storage/src/mozStorageConnection.h
-@@ -25,6 +25,7 @@
-
- struct PRLock;
- class nsIFile;
-+class nsIFileURL;
- class nsIEventTarget;
- class nsIThread;
-
-@@ -63,18 +64,27 @@ public:
- Connection(Service *aService, int aFlags);
-
- /**
-+ * Creates the connection to an in-memory database.
-+ */
-+ nsresult initialize();
-+
-+ /**
- * Creates the connection to the database.
- *
- * @param aDatabaseFile
- * The nsIFile of the location of the database to open, or create if it
-- * does not exist. Passing in nullptr here creates an in-memory
-- * database.
-- * @param aVFSName
-- * The VFS that SQLite will use when opening this database. NULL means
-- * "default".
-+ * does not exist.
- */
-- nsresult initialize(nsIFile *aDatabaseFile,
-- const char* aVFSName = NULL);
-+ nsresult initialize(nsIFile *aDatabaseFile);
-+
-+ /**
-+ * Creates the connection to the database.
-+ *
-+ * @param aFileURL
-+ * The nsIFileURL of the location of the database to open, or create if it
-+ * does not exist.
-+ */
-+ nsresult initialize(nsIFileURL *aFileURL);
-
- // fetch the native handle
- sqlite3 *GetNativeConnection() { return mDBConn; }
-@@ -155,6 +165,8 @@ public:
- private:
- ~Connection();
-
-+ nsresult initializeInternal(nsIFile *aDatabaseFile);
-+
- /**
- * Sets the database into a closed state so no further actions can be
- * performed.
-@@ -206,6 +218,7 @@ private:
- int progressHandler();
-
- sqlite3 *mDBConn;
-+ nsCOMPtr<nsIFileURL> mFileURL;
- nsCOMPtr<nsIFile> mDatabaseFile;
-
- /**
-diff --git storage/src/mozStorageService.cpp storage/src/mozStorageService.cpp
-index 00661d6..862a7da 100644
---- storage/src/mozStorageService.cpp
-+++ storage/src/mozStorageService.cpp
-@@ -24,8 +24,6 @@
- #include "mozilla/Preferences.h"
-
- #include "sqlite3.h"
--#include "test_quota.h"
--#include "test_quota.c"
-
- #ifdef SQLITE_OS_WIN
- // "windows.h" was included and it can #define lots of things we care about...
-@@ -35,61 +33,6 @@
- #include "nsIPromptService.h"
- #include "nsIMemoryReporter.h"
-
--namespace {
--
--class QuotaCallbackData
--{
--public:
-- QuotaCallbackData(mozIStorageQuotaCallback *aCallback,
-- nsISupports *aUserData)
-- : callback(aCallback), userData(aUserData)
-- {
-- MOZ_COUNT_CTOR(QuotaCallbackData);
-- }
--
-- ~QuotaCallbackData()
-- {
-- MOZ_COUNT_DTOR(QuotaCallbackData);
-- }
--
-- static void Callback(const char *zFilename,
-- sqlite3_int64 *piLimit,
-- sqlite3_int64 iSize,
-- void *pArg)
-- {
-- NS_ASSERTION(zFilename && strlen(zFilename), "Null or empty filename!");
-- NS_ASSERTION(piLimit, "Null pointer!");
--
-- QuotaCallbackData *data = static_cast<QuotaCallbackData*>(pArg);
-- if (!data) {
-- // No callback specified, return immediately.
-- return;
-- }
--
-- NS_ASSERTION(data->callback, "Should never have a null callback!");
--
-- nsDependentCString filename(zFilename);
--
-- int64_t newLimit;
-- if (NS_SUCCEEDED(data->callback->QuotaExceeded(filename, *piLimit,
-- iSize, data->userData,
-- &newLimit))) {
-- *piLimit = newLimit;
-- }
-- }
--
-- static void Destroy(void *aUserData)
-- {
-- delete static_cast<QuotaCallbackData*>(aUserData);
-- }
--
--private:
-- nsCOMPtr<mozIStorageQuotaCallback> callback;
-- nsCOMPtr<nsISupports> userData;
--};
--
--} // anonymous namespace
--
- ////////////////////////////////////////////////////////////////////////////////
- //// Defines
-
-@@ -345,11 +288,10 @@ private:
- ////////////////////////////////////////////////////////////////////////////////
- //// Service
-
--NS_IMPL_THREADSAFE_ISUPPORTS3(
-+NS_IMPL_THREADSAFE_ISUPPORTS2(
- Service,
- mozIStorageService,
-- nsIObserver,
-- mozIStorageServiceQuotaManagement
-+ nsIObserver
- )
-
- Service *Service::gService = nullptr;
-@@ -438,10 +380,6 @@ Service::~Service()
-
- // Shutdown the sqlite3 API. Warn if shutdown did not turn out okay, but
- // there is nothing actionable we can do in that case.
-- rc = ::sqlite3_quota_shutdown();
-- if (rc != SQLITE_OK)
-- NS_WARNING("sqlite3 did not shutdown cleanly.");
--
- rc = ::sqlite3_shutdown();
- if (rc != SQLITE_OK)
- NS_WARNING("sqlite3 did not shutdown cleanly.");
-@@ -636,9 +574,6 @@ Service::initialize()
- } else {
- NS_WARNING("Failed to register telemetry VFS");
- }
-- rc = ::sqlite3_quota_initialize("telemetry-vfs", 0);
-- if (rc != SQLITE_OK)
-- return convertResultCode(rc);
-
- // Set the default value for the toolkit.storage.synchronous pref. It will be
- // updated with the user preference on the main thread.
-@@ -739,28 +674,24 @@ Service::OpenSpecialDatabase(const char *aStorageKey,
- // connection to use a memory DB.
- }
- else if (::strcmp(aStorageKey, "profile") == 0) {
--
- rv = NS_GetSpecialDirectory(NS_APP_STORAGE_50_FILE,
- getter_AddRefs(storageFile));
- NS_ENSURE_SUCCESS(rv, rv);
-
-- nsString filename;
-- storageFile->GetPath(filename);
-- nsCString filename8 = NS_ConvertUTF16toUTF8(filename.get());
- // fall through to DB initialization
- }
- else {
- return NS_ERROR_INVALID_ARG;
- }
-
-- Connection *msc = new Connection(this, SQLITE_OPEN_READWRITE);
-- NS_ENSURE_TRUE(msc, NS_ERROR_OUT_OF_MEMORY);
-+ nsRefPtr<Connection> msc = new Connection(this, SQLITE_OPEN_READWRITE);
-
-- rv = msc->initialize(storageFile);
-+ rv = storageFile ? msc->initialize(storageFile) : msc->initialize();
- NS_ENSURE_SUCCESS(rv, rv);
-
-- NS_ADDREF(*_connection = msc);
-+ msc.forget(_connection);
- return NS_OK;
-+
- }
-
- NS_IMETHODIMP
-@@ -774,12 +705,11 @@ Service::OpenDatabase(nsIFile *aDatabaseFile,
- int flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_SHAREDCACHE |
- SQLITE_OPEN_CREATE;
- nsRefPtr<Connection> msc = new Connection(this, flags);
-- NS_ENSURE_TRUE(msc, NS_ERROR_OUT_OF_MEMORY);
-
- nsresult rv = msc->initialize(aDatabaseFile);
- NS_ENSURE_SUCCESS(rv, rv);
-
-- NS_ADDREF(*_connection = msc);
-+ msc.forget(_connection);
- return NS_OK;
- }
-
-@@ -794,12 +724,30 @@ Service::OpenUnsharedDatabase(nsIFile *aDatabaseFile,
- int flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_PRIVATECACHE |
- SQLITE_OPEN_CREATE;
- nsRefPtr<Connection> msc = new Connection(this, flags);
-- NS_ENSURE_TRUE(msc, NS_ERROR_OUT_OF_MEMORY);
-
- nsresult rv = msc->initialize(aDatabaseFile);
- NS_ENSURE_SUCCESS(rv, rv);
-
-- NS_ADDREF(*_connection = msc);
-+ msc.forget(_connection);
-+ return NS_OK;
-+}
-+
-+NS_IMETHODIMP
-+Service::OpenDatabaseWithFileURL(nsIFileURL *aFileURL,
-+ mozIStorageConnection **_connection)
-+{
-+ NS_ENSURE_ARG(aFileURL);
-+
-+ // Always ensure that SQLITE_OPEN_CREATE is passed in for compatibility
-+ // reasons.
-+ int flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_SHAREDCACHE |
-+ SQLITE_OPEN_CREATE | SQLITE_OPEN_URI;
-+ nsRefPtr<Connection> msc = new Connection(this, flags);
-+
-+ nsresult rv = msc->initialize(aFileURL);
-+ NS_ENSURE_SUCCESS(rv, rv);
-+
-+ msc.forget(_connection);
- return NS_OK;
- }
-
-@@ -885,67 +833,5 @@ Service::Observe(nsISupports *, const char *aTopic, const PRUnichar *)
- return NS_OK;
- }
-
--////////////////////////////////////////////////////////////////////////////////
--//// mozIStorageServiceQuotaManagement
--
--NS_IMETHODIMP
--Service::OpenDatabaseWithVFS(nsIFile *aDatabaseFile,
-- const nsACString &aVFSName,
-- mozIStorageConnection **_connection)
--{
-- NS_ENSURE_ARG(aDatabaseFile);
--
-- // Always ensure that SQLITE_OPEN_CREATE is passed in for compatibility
-- // reasons.
-- int flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_SHAREDCACHE |
-- SQLITE_OPEN_CREATE;
-- nsRefPtr<Connection> msc = new Connection(this, flags);
-- NS_ENSURE_TRUE(msc, NS_ERROR_OUT_OF_MEMORY);
--
-- nsresult rv = msc->initialize(aDatabaseFile,
-- PromiseFlatCString(aVFSName).get());
-- NS_ENSURE_SUCCESS(rv, rv);
--
-- NS_ADDREF(*_connection = msc);
-- return NS_OK;
--}
--
--NS_IMETHODIMP
--Service::SetQuotaForFilenamePattern(const nsACString &aPattern,
-- int64_t aSizeLimit,
-- mozIStorageQuotaCallback *aCallback,
-- nsISupports *aUserData)
--{
-- NS_ENSURE_FALSE(aPattern.IsEmpty(), NS_ERROR_INVALID_ARG);
--
-- nsAutoPtr<QuotaCallbackData> data;
-- if (aSizeLimit && aCallback) {
-- data = new QuotaCallbackData(aCallback, aUserData);
-- }
--
-- int rc = ::sqlite3_quota_set(PromiseFlatCString(aPattern).get(),
-- aSizeLimit, QuotaCallbackData::Callback,
-- data, QuotaCallbackData::Destroy);
-- NS_ENSURE_TRUE(rc == SQLITE_OK, convertResultCode(rc));
--
-- data.forget();
-- return NS_OK;
--}
--
--NS_IMETHODIMP
--Service::UpdateQuotaInformationForFile(nsIFile *aFile)
--{
-- NS_ENSURE_ARG_POINTER(aFile);
--
-- nsString path;
-- nsresult rv = aFile->GetPath(path);
-- NS_ENSURE_SUCCESS(rv, rv);
--
-- int rc = ::sqlite3_quota_file(NS_ConvertUTF16toUTF8(path).get());
-- NS_ENSURE_TRUE(rc == SQLITE_OK, convertResultCode(rc));
--
-- return NS_OK;
--}
--
- } // namespace storage
- } // namespace mozilla
-diff --git storage/src/mozStorageService.h storage/src/mozStorageService.h
-index 21c1ff8..3f5a546 100644
---- storage/src/mozStorageService.h
-+++ storage/src/mozStorageService.h
-@@ -15,7 +15,6 @@
- #include "mozilla/Mutex.h"
-
- #include "mozIStorageService.h"
--#include "mozIStorageServiceQuotaManagement.h"
-
- class nsIMemoryReporter;
- class nsIMemoryMultiReporter;
-@@ -28,7 +27,6 @@ namespace storage {
- class Connection;
- class Service : public mozIStorageService
- , public nsIObserver
-- , public mozIStorageServiceQuotaManagement
- {
- public:
- /**
-@@ -58,7 +56,6 @@ public:
- NS_DECL_ISUPPORTS
- NS_DECL_MOZISTORAGESERVICE
- NS_DECL_NSIOBSERVER
-- NS_DECL_MOZISTORAGESERVICEQUOTAMANAGEMENT
-
- /**
- * Obtains an already AddRefed pointer to XPConnect. This is used by
-diff --git toolkit/toolkit-makefiles.sh toolkit/toolkit-makefiles.sh
-index 6a7d714..8f1bbe0 100644
---- toolkit/toolkit-makefiles.sh
-+++ toolkit/toolkit-makefiles.sh
-@@ -68,6 +68,7 @@ MAKEFILES_dom="
- dom/plugins/base/Makefile
- dom/plugins/ipc/Makefile
- dom/power/Makefile
-+ dom/quota/Makefile
- dom/settings/Makefile
- dom/sms/Makefile
- dom/sms/interfaces/Makefile
diff --git a/www/firefox/files/patch-bug803480 b/www/firefox/files/patch-bug803480
new file mode 100644
index 000000000000..c15992fa36f8
--- /dev/null
+++ b/www/firefox/files/patch-bug803480
@@ -0,0 +1,41 @@
+diff --git configure.in configure.in
+index fa283d0..936b6e0 100644
+--- configure.in
++++ configure.in
+@@ -8229,16 +8229,26 @@ MOZ_ARG_DISABLE_BOOL(necko-wifi,
+ NECKO_WIFI=,
+ NECKO_WIFI=1)
+
+-if test "$OS_ARCH" = "OS2"; then
+- dnl OS/2 implementation of Necko-WiFi support will be added in bug 506566
+- NECKO_WIFI=
+-fi
+-if test "$NECKO_WIFI" -a \
+- "$OS_ARCH" != "Linux" -a \
+- "$OS_ARCH" != "Darwin" -a \
+- "$OS_ARCH" != "SunOS" -a \
+- "$OS_ARCH" != "WINNT"; then
+- AC_MSG_ERROR([Necko WiFi scanning not supported on your platform, use --disable-necko-wifi])
++if test "$NECKO_WIFI"; then
++ case "$OS_TARGET" in
++ Android)
++ ;;
++ Darwin)
++ ;;
++ SunOS)
++ ;;
++ WINNT)
++ ;;
++ OS2)
++ dnl OS/2 implementation of Necko-WiFi support will be added in bug 506566
++ NECKO_WIFI=
++ ;;
++ *)
++ if test -z "$MOZ_ENABLE_DBUS"; then
++ AC_MSG_ERROR([Necko WiFi scanning needs DBus on your platform, remove --disable-dbus or use --disable-necko-wifi])
++ fi
++ ;;
++ esac
+ fi
+
+ if test "$NECKO_WIFI"; then
diff --git a/www/firefox/files/patch-bug807492 b/www/firefox/files/patch-bug807492
index 84472160d8b9..12bbb48a1cba 100644
--- a/www/firefox/files/patch-bug807492
+++ b/www/firefox/files/patch-bug807492
@@ -2,7 +2,7 @@ diff --git config/system-headers config/system-headers
index 9bd1efa..1095a01 100644
--- config/system-headers
+++ config/system-headers
-@@ -1066,8 +1066,10 @@ gst/app/gstappsink.h
+@@ -1121,8 +1121,10 @@ gst/app/gstappsink.h
gst/app/gstappsrc.h
gst/video/video.h
sys/msg.h
@@ -17,7 +17,7 @@ diff --git configure.in configure.in
index c167461..8346c11 100644
--- configure.in
+++ configure.in
-@@ -1413,16 +1413,27 @@ if test "$GNU_CC"; then
+@@ -1449,16 +1449,27 @@ if test "$GNU_CC"; then
_SAVE_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS -mssse3"
AC_TRY_COMPILE([asm ("pmaddubsw %xmm2,%xmm3");],,AC_MSG_RESULT([yes])
@@ -45,7 +45,7 @@ index c167461..8346c11 100644
# -Werror=return-type - catches missing returns, zero false positives
# -Wtype-limits - catches overflow bugs, few false positives
# -Wempty-body - catches bugs, e.g. "if (c); foo();", few false positives
-@@ -5232,17 +5243,17 @@ dnl Turn off webrtc for OS's we don't handle yet, but allow
+@@ -5259,17 +5270,17 @@ dnl Turn off webrtc for OS's we don't handle yet, but allow
dnl --enable-webrtc to override. Can disable for everything in
dnl the master list above.
if test -n "$MOZ_WEBRTC"; then
@@ -64,13 +64,13 @@ index c167461..8346c11 100644
;;
esac
fi
-@@ -8909,16 +8920,21 @@ if test "${OS_TARGET}" = "WINNT"; then
- if test "$HAVE_64BIT_OS"; then
- OS_BITS=64
+@@ -9065,16 +9076,21 @@ elif test "${OS_TARGET}" = "Android"; then
+ EXTRA_GYP_DEFINES="-D gtest_target_type=executable -D android_toolchain=${android_toolchain} -G os=android "
+ if test -n "$ARM_ARCH" && test "$ARM_ARCH" -lt 7; then
+ EXTRA_GYP_DEFINES+=" -D armv7=0 "
else
- OS_BITS=32
+ EXTRA_GYP_DEFINES+=" -D armv7=1 "
fi
- EXTRA_GYP_DEFINES="-D MSVS_VERSION=${_MSVS_VERSION} -D MSVS_OS_BITS=${OS_BITS}"
fi
+# Don't try to compile sse4.1 code if toolchain doesn't support
@@ -85,12 +85,12 @@ index c167461..8346c11 100644
dnl so that regeneration via dependencies works correctly
WEBRTC_CONFIG="-D build_with_mozilla=1 --include ${srcdir}/media/webrtc/webrtc_config.gypi -D FORCED_INCLUDE_FILE=${srcdir}/media/webrtc/webrtc_config.gypi"
- GYP_WEBRTC_OPTIONS="--format=mozmake ${WEBRTC_CONFIG} ${EXTRA_GYP_DEFINES} --depth=${srcdir}/media/webrtc/trunk --toplevel-dir=${srcdir} -G OBJDIR=${_objdir}"
+ GYP_WEBRTC_OPTIONS="--format=mozmake ${WEBRTC_CONFIG} -D target_arch=${WEBRTC_TARGET_ARCH} ${EXTRA_GYP_DEFINES} --depth=${srcdir}/media/webrtc/trunk --toplevel-dir=${srcdir} -G OBJDIR=${_objdir}"
diff --git js/src/config/system-headers js/src/config/system-headers
index 9bd1efa..1095a01 100644
--- js/src/config/system-headers
+++ js/src/config/system-headers
-@@ -1066,8 +1066,10 @@ gst/app/gstappsink.h
+@@ -1121,8 +1121,10 @@ gst/app/gstappsink.h
gst/app/gstappsrc.h
gst/video/video.h
sys/msg.h
@@ -114,20 +114,20 @@ index f1fc85f..141e8ca 100644
-I$(topsrcdir)/media/mtransport/third_party/nrappkit/src/event \
$(NULL)
--ifeq ($(OS_ARCH), Darwin)
+-ifeq ($(OS_TARGET), Darwin)
+ifneq (,$(filter Darwin DragonFly FreeBSD NetBSD OpenBSD,$(OS_TARGET)))
LOCAL_INCLUDES += \
-I$(topsrcdir)/media/mtransport/third_party/nrappkit/src/port/darwin/include \
-I$(topsrcdir)/media/mtransport/third_party/nrappkit/src/port/generic/include \
$(NULL)
-+ifeq ($(OS_ARCH), Darwin)
++ifeq ($(OS_TARGET), Darwin)
DEFINES += -DDARWIN
+else
+DEFINES += -DBSD
+endif
endif
- ifeq ($(OS_ARCH), Linux)
+ ifeq ($(OS_TARGET), Linux)
LOCAL_INCLUDES += \
-I$(topsrcdir)/media/mtransport/third_party/nrappkit/src/port/linux/include \
-I$(topsrcdir)/media/mtransport/third_party/nrappkit/src/port/generic/include \
@@ -146,7 +146,7 @@ index c1d5bf4..2ecf2c7 100644
endif
endif
--ifeq ($(OS_ARCH), Darwin)
+-ifeq ($(OS_TARGET), Darwin)
+ifneq (,$(filter Darwin DragonFly FreeBSD NetBSD OpenBSD,$(OS_TARGET)))
LOCAL_INCLUDES += -I$(topsrcdir)/media/mtransport/third_party/nrappkit/src/port/darwin/include
+ifeq ($(OS_TARGET), Darwin)
@@ -156,13 +156,13 @@ index c1d5bf4..2ecf2c7 100644
endif
+endif
- ifeq ($(OS_ARCH), Linux)
+ ifeq ($(OS_TARGET), Linux)
LOCAL_INCLUDES += -I$(topsrcdir)/media/mtransport/third_party/nrappkit/src/port/linux/include
endif
- ifneq ($(OS_TARGET),WINNT)
- CPP_UNIT_TESTS = \
- ice_unittest.cpp \
+ ifeq ($(OS_TARGET), Android)
+ LOCAL_INCLUDES += -I$(topsrcdir)/media/mtransport/third_party/nrappkit/src/port/android/include
+
diff --git media/mtransport/third_party/nICEr/nicer.gyp media/mtransport/third_party/nICEr/nicer.gyp
index 0e1f8b4..9a4b995 100644
--- media/mtransport/third_party/nICEr/nicer.gyp
@@ -210,7 +210,27 @@ diff --git media/mtransport/third_party/nICEr/src/stun/addrs.c media/mtransport/
index b0b66b2..04fea94 100644
--- media/mtransport/third_party/nICEr/src/stun/addrs.c
+++ media/mtransport/third_party/nICEr/src/stun/addrs.c
-@@ -69,17 +69,17 @@ static char *RCSSTRING __UNUSED__="$Id: addrs.c,v 1.2 2008/04/28 18:21:30 ekr Ex
+@@ -50,17 +50,19 @@ static char *RCSSTRING __UNUSED__="$Id: addrs.c,v 1.2 2008/04/28 18:21:30 ekr Ex
+ #else
+ #include <syslog.h>
+ /* Work around an Android NDK < r8c bug */
+ #undef __unused
+ #include <linux/sysctl.h>
+ #endif
+ #include <net/if.h>
+ #ifndef LINUX
++#if !defined(__OpenBSD__) && !defined(__NetBSD__)
+ #include <net/if_var.h>
++#endif
+ #include <net/if_dl.h>
+ #include <net/if_types.h>
+ #include <sys/sockio.h>
+ #else
+ #include <linux/if.h>
+ #endif
+ #include <net/route.h>
+
+@@ -75,17 +77,17 @@ static char *RCSSTRING __UNUSED__="$Id: addrs.c,v 1.2 2008/04/28 18:21:30 ekr Ex
#include <netdb.h>
#endif /* UNIX */
@@ -229,7 +249,7 @@ index b0b66b2..04fea94 100644
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
-@@ -675,17 +675,17 @@ nr_stun_remove_duplicate_addrs(nr_transport_addr addrs[], int remove_loopback, i
+@@ -685,17 +687,17 @@ nr_stun_remove_duplicate_addrs(nr_transport_addr addrs[], int remove_loopback, i
}
int
@@ -252,12 +272,18 @@ diff --git media/mtransport/third_party/nICEr/src/stun/stun.h media/mtransport/t
index a3c51f9..eb65ac8 100644
--- media/mtransport/third_party/nICEr/src/stun/stun.h
+++ media/mtransport/third_party/nICEr/src/stun/stun.h
-@@ -40,17 +40,19 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+@@ -36,21 +36,25 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ #ifdef WIN32
+ #include <winsock2.h>
+ #else
#include <sys/param.h>
#include <sys/socket.h>
#include <net/if.h>
#ifndef LINUX
++#if !defined(__OpenBSD__) && !defined(__NetBSD__)
#include <net/if_var.h>
++#endif
#include <net/if_dl.h>
#include <net/if_types.h>
#endif
@@ -341,13 +367,13 @@ index cc260b7..66af2d7 100644
if (!(my_locale = r_strdup(setlocale(LC_CTYPE, 0))))
ABORT(R_NO_MEMORY);
-@@ -91,28 +99,28 @@ mbslen(const char *s, size_t *ncharsp)
- if (!strstr(my_locale, "UTF-8"))
- ABORT(R_NOT_FOUND);
+@@ -93,28 +101,28 @@ mbslen(const char *s, size_t *ncharsp)
#else
- /* can't count UTF-8 characters with mbrlen if the locale isn't UTF-8 */
- if (! strcasestr(setlocale(LC_CTYPE, 0), "UTF-8"))
- ABORT(R_NOT_FOUND);
+ /* can't count UTF-8 characters with mbrlen if the locale isn't UTF-8 */
+ /* null-checking setlocale is required because Android */
+ char *locale = setlocale(LC_CTYPE, 0);
+ if (!locale || !strcasestr(locale, "UTF-8"))
+ ABORT(R_NOT_FOUND);
#endif
-#ifdef DARWIN
@@ -416,6 +442,28 @@ index 3cc8e1c..74016c6 100644
'NEW_STDIO'
'RETSIGTYPE=void',
'TIME_WITH_SYS_TIME_H=1',
+diff --git media/mtransport/third_party/nrappkit/src/log/r_log.c media/mtransport/third_party/nrappkit/src/log/r_log.c
+index b25d5c2..b207b8c 100644
+--- media/mtransport/third_party/nrappkit/src/log/r_log.c
++++ media/mtransport/third_party/nrappkit/src/log/r_log.c
+@@ -43,16 +43,17 @@ static char *RCSSTRING __UNUSED__ ="$Id: r_log.c,v 1.10 2008/11/25 22:25:18 adam
+ #ifdef LINUX
+ #define _BSD_SOURCE
+ #endif
+
+ #include "r_log.h"
+ #include "hex.h"
+
+ #include <string.h>
++#include <errno.h>
+ #ifndef _MSC_VER
+ #include <strings.h>
+ #include <syslog.h>
+ #endif
+ #include <registry.h>
+ #include <time.h>
+
+
diff --git media/mtransport/third_party/nrappkit/src/port/darwin/include/csi_platform.h media/mtransport/third_party/nrappkit/src/port/darwin/include/csi_platform.h
index 15452e3..2c9651a 100644
--- media/mtransport/third_party/nrappkit/src/port/darwin/include/csi_platform.h
@@ -446,20 +494,20 @@ diff --git media/mtransport/third_party/nrappkit/src/port/generic/include/sys/qu
index bcb1ec0..bb73591 100644
--- media/mtransport/third_party/nrappkit/src/port/generic/include/sys/queue.h
+++ media/mtransport/third_party/nrappkit/src/port/generic/include/sys/queue.h
-@@ -33,5 +33,5 @@
- #define _SYS_QUEUE_H_
-
+@@ -33,7 +33,7 @@
+ #ifndef _SYS_QUEUE_H_
+ #define _SYS_QUEUE_H_
+
-#ifndef DARWIN
-+#if !defined(BSD) && !defined(DARWIN)
++#if !defined(__FreeBSD__) && !defined(DARWIN)
#include <stddef.h>
#define __offsetof offsetof
#endif
-
diff --git media/mtransport/third_party/nrappkit/src/util/util.c media/mtransport/third_party/nrappkit/src/util/util.c
index 3aced8b..be020bb 100644
--- media/mtransport/third_party/nrappkit/src/util/util.c
+++ media/mtransport/third_party/nrappkit/src/util/util.c
-@@ -36,16 +36,19 @@
+@@ -36,20 +36,24 @@
ekr@rtfm.com Wed Dec 26 17:19:36 2001
*/
@@ -475,11 +523,16 @@ index 3aced8b..be020bb 100644
#include <dirent.h>
#endif
#include <string.h>
++#include <errno.h>
#include <ctype.h>
#include <sys/stat.h>
#ifdef OPENSSL
#include <openssl/evp.h>
-@@ -431,17 +434,17 @@ int nr_reg_uint8_fetch_and_check(NR_registry key, UINT8 min, UINT8 max, int log_
+ #endif
+ #include "nr_common.h"
+ #include "r_common.h"
+ #include "registry.h"
+@@ -431,17 +435,17 @@ int nr_reg_uint8_fetch_and_check(NR_registry key, UINT8 min, UINT8 max, int log_
abort:
if(die && _status){
r_log(log_fac,LOG_CRIT,"Exiting due to invalid configuration (key '%s')",key);
@@ -499,15 +552,15 @@ index 3aced8b..be020bb 100644
if (! buf)
diff --git media/webrtc/signaling/signaling.gyp media/webrtc/signaling/signaling.gyp
-index f0cbf870..ba0f801 100644
+index 2a91e3d..31de641 100644
--- media/webrtc/signaling/signaling.gyp
+++ media/webrtc/signaling/signaling.gyp
-@@ -208,16 +208,29 @@
+@@ -212,16 +212,29 @@
'SIPCC_BUILD',
'HAVE_WINSOCK2_H',
'CPR_STDINT_INCLUDE=\\"mozilla/StandardInteger.h\\"'
],
-
+
'cflags_mozilla': [
],
}],
@@ -529,34 +582,34 @@ index f0cbf870..ba0f801 100644
],
'defines': [
'SIP_OS_OSX',
- 'OSX',
+ 'OSX',
'_FORTIFY_SOURCE=2',
],
-@@ -701,17 +714,17 @@
+@@ -747,17 +760,17 @@
'EXTERNAL_TICK_REQUIRED',
'GIPS_VER=3480',
],
-
+
'cflags_mozilla': [
],
-
+
}],
- ['OS=="mac"', {
+ ['OS=="mac" or os_bsd==1', {
'include_dirs': [
],
-
+
'sources': [
# SIPSTACK
'./src/sipcc/core/sipstack/sip_platform_task.c',
-
-@@ -746,24 +759,23 @@
+
+@@ -792,24 +805,23 @@
'./src/sipcc/cpr/darwin/cpr_darwin_timers_using_select.c',
'./src/sipcc/cpr/darwin/cpr_darwin_tst.h',
'./src/sipcc/cpr/darwin/cpr_darwin_types.h',
],
-
+
'defines' : [
'SIP_OS_OSX',
@@ -571,12 +624,12 @@ index f0cbf870..ba0f801 100644
- '_DARWIN_C_SOURCE',
'NO_NSPR_10_SUPPORT',
],
-
+
'cflags_mozilla': [
],
}],
],
-
+
diff --git media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_ipc.c media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_ipc.c
index a7c47e1..4f191de 100644
--- media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_ipc.c
@@ -611,7 +664,7 @@ diff --git media/webrtc/signaling/test/Makefile.in media/webrtc/signaling/test/M
index a30e330..cfbd8a3 100644
--- media/webrtc/signaling/test/Makefile.in
+++ media/webrtc/signaling/test/Makefile.in
-@@ -22,32 +22,32 @@ LIBS = \
+@@ -22,17 +22,17 @@ LIBS = \
$(DEPTH)/media/webrtc/signalingtest/signaling_ecc/$(LIB_PREFIX)ecc.$(LIB_SUFFIX) \
$(DEPTH)/media/webrtc/signalingtest/signaling_sipcc/$(LIB_PREFIX)sipcc.$(LIB_SUFFIX) \
$(DEPTH)/layout/media/$(LIB_PREFIX)gkmedias.$(LIB_SUFFIX) \
@@ -620,7 +673,7 @@ index a30e330..cfbd8a3 100644
$(NULL)
ifdef MOZ_SYDNEYAUDIO
--ifeq ($(OS_ARCH),Linux)
+-ifeq ($(OS_TARGET),Linux)
+ifneq (,$(filter Linux DragonFly FreeBSD NetBSD OpenBSD,$(OS_TARGET)))
LIBS += \
$(MOZ_ALSA_LIBS) \
@@ -628,22 +681,25 @@ index a30e330..cfbd8a3 100644
endif
endif
- ifeq (gtk2,$(MOZ_WIDGET_TOOLKIT))
+ ifeq ($(OS_TARGET),Android)
+ LIBS += \
+@@ -76,17 +76,17 @@ endif
+ ifeq (qt,$(MOZ_WIDGET_TOOLKIT))
LIBS += \
$(XLIBS) \
- $(MOZ_GTK2_LIBS) \
- -lgthread-2.0 \
+ $(TK_LIBS) \
+ $(MOZ_PANGO_LIBS) \
$(NULL)
endif
--ifeq ($(OS_ARCH),Linux)
+-ifeq ($(OS_TARGET),Linux)
+ifneq (,$(filter Linux DragonFly FreeBSD NetBSD OpenBSD,$(OS_TARGET)))
LIBS += \
$(MOZ_CAIRO_OSLIBS) \
$(NULL)
endif
- ifeq ($(OS_ARCH),Darwin)
+ ifeq ($(OS_TARGET),Darwin)
LIBS += \
-framework AudioToolbox \
diff --git media/webrtc/trunk/build/common.gypi media/webrtc/trunk/build/common.gypi
@@ -750,7 +806,7 @@ diff --git media/webrtc/trunk/src/build/common.gypi media/webrtc/trunk/src/build
index 9ca9f7c..d5c4ab9 100644
--- media/webrtc/trunk/src/build/common.gypi
+++ media/webrtc/trunk/src/build/common.gypi
-@@ -101,16 +101,23 @@
+@@ -101,16 +101,21 @@
'enable_protobuf%': 1,
'include_tests%': 1,
@@ -760,10 +816,8 @@ index 9ca9f7c..d5c4ab9 100644
'clang_use_chrome_plugins%': 0,
}],
+ ['OS=="linux" or OS=="solaris" or os_bsd==1', {
-+ 'include_alsa_audio%': 1,
+ 'include_v4l2_video_capture%': 1,
+ }, {
-+ 'include_alsa_audio%': 0,
+ 'include_v4l2_video_capture%': 0,
+ }],
], # conditions
@@ -774,7 +828,7 @@ index 9ca9f7c..d5c4ab9 100644
'..','../..',
],
'defines': [
-@@ -174,16 +181,28 @@
+@@ -176,16 +181,28 @@
'defines': [
'WEBRTC_LINUX',
'WEBRTC_THREAD_RR',
@@ -803,68 +857,6 @@ index 9ca9f7c..d5c4ab9 100644
'WEBRTC_CLOCK_TYPE_REALTIME',
],
}],
-diff --git media/webrtc/trunk/src/modules/audio_device/main/source/audio_device.gypi media/webrtc/trunk/src/modules/audio_device/main/source/audio_device.gypi
-index 8457737..4d0f322 100644
---- media/webrtc/trunk/src/modules/audio_device/main/source/audio_device.gypi
-+++ media/webrtc/trunk/src/modules/audio_device/main/source/audio_device.gypi
-@@ -41,21 +41,25 @@
- 'audio_device_utility.h',
- 'audio_device_impl.cc',
- 'audio_device_impl.h',
- 'audio_device_config.h',
- 'dummy/audio_device_dummy.h',
- 'dummy/audio_device_utility_dummy.h',
- ],
- 'conditions': [
-- ['OS=="linux"', {
-+ ['include_alsa_audio==1', {
- 'include_dirs': [
- 'linux',
- ],
-- }], # OS==linux
-+ 'defines': [
-+ # avoiding pointless ifdef churn
-+ 'WEBRTC_LINUX',
-+ ],
-+ }], # include_alsa_audio==1
- ['OS=="mac"', {
- 'include_dirs': [
- 'mac',
- ],
- }], # OS==mac
- ['OS=="win"', {
- 'include_dirs': [
- 'win',
-@@ -111,24 +115,26 @@
- 'link_settings': {
- 'libraries': [
- '-llog',
- '-lOpenSLES',
- ],
- },
- }],
- ['OS=="linux"', {
-- 'defines': [
-- 'LINUX_ALSA',
-- ],
- 'link_settings': {
- 'libraries': [
- '-ldl',
- ],
- },
-+ }],
-+ ['include_alsa_audio==1', {
-+ 'defines': [
-+ 'LINUX_ALSA',
-+ ],
- 'conditions': [
- ['include_pulse_audio==1', {
- 'defines': [
- 'LINUX_PULSE',
- ],
- 'sources': [
- 'linux/audio_device_pulse_linux.cc',
- 'linux/audio_device_pulse_linux.h',
diff --git media/webrtc/trunk/src/modules/audio_device/main/source/audio_device_utility.cc media/webrtc/trunk/src/modules/audio_device/main/source/audio_device_utility.cc
index 203f09a..0b0b70e 100644
--- media/webrtc/trunk/src/modules/audio_device/main/source/audio_device_utility.cc
@@ -1341,7 +1333,7 @@ diff --git media/webrtc/trunk/src/modules/video_capture/main/source/video_captur
index 0a9765e..8d4bbf4 100644
--- media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi
+++ media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi
-@@ -50,17 +50,17 @@
+@@ -55,17 +55,17 @@
['include_internal_video_capture==0', {
'sources': [
'External/device_info_external.cc',
@@ -1360,7 +1352,7 @@ index 0a9765e..8d4bbf4 100644
'Linux/video_capture_linux.h',
'Linux/device_info_linux.cc',
'Linux/video_capture_linux.cc',
-@@ -157,31 +157,35 @@
+@@ -162,31 +162,35 @@
'../interface',
],
'sources': [
@@ -1798,7 +1790,7 @@ index 6334490..852ebaa 100644
namespace webrtc {
extern "C"
-@@ -116,16 +125,28 @@ ThreadPosix::ThreadPosix(ThreadRunFunction func, ThreadObj obj,
+@@ -116,16 +125,30 @@ ThreadPosix::ThreadPosix(ThreadRunFunction func, ThreadObj obj,
}
}
@@ -1811,6 +1803,8 @@ index 6334490..852ebaa 100644
+ return _lwp_self();
+#elif defined(__DragonFly__)
+ return lwp_gettid();
++#elif defined(__OpenBSD__)
++ return reinterpret_cast<uintptr_t> (pthread_self());
+#elif defined(__FreeBSD__)
+# if __FreeBSD_version > 900030
+ return pthread_getthreadid_np();
@@ -1827,7 +1821,7 @@ index 6334490..852ebaa 100644
int ThreadPosix::Construct()
{
int result = 0;
-@@ -154,16 +175,17 @@ ThreadPosix::~ThreadPosix()
+@@ -154,16 +177,17 @@ ThreadPosix::~ThreadPosix()
{
pthread_attr_destroy(&_attr);
delete _event;
@@ -1845,7 +1839,7 @@ index 6334490..852ebaa 100644
#endif
{
if (!_runFunction)
-@@ -229,31 +251,39 @@ bool ThreadPosix::Start(unsigned int& /*threadID*/)
+@@ -229,31 +253,39 @@ bool ThreadPosix::Start(unsigned int& /*threadID*/)
{
return false;
}
@@ -1887,7 +1881,7 @@ index 6334490..852ebaa 100644
#else
// "Normal" Linux.
const int result = sched_setaffinity(_pid,
-@@ -340,16 +370,20 @@ void ThreadPosix::Run()
+@@ -340,16 +372,20 @@ void ThreadPosix::Run()
#endif
// The event the Start() is waiting for.
_event->Set();
@@ -1908,6 +1902,29 @@ index 6334490..852ebaa 100644
WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1,
"Thread without name started");
}
+diff --git media/webrtc/trunk/src/system_wrappers/source/trace_posix.cc media/webrtc/trunk/src/system_wrappers/source/trace_posix.cc
+index f3a5306..d9c2810 100644
+--- media/webrtc/trunk/src/system_wrappers/source/trace_posix.cc
++++ media/webrtc/trunk/src/system_wrappers/source/trace_posix.cc
+@@ -52,17 +52,17 @@ WebRtc_Word32 TracePosix::AddTime(char* traceMessage,
+ {
+ struct timeval systemTimeHighRes;
+ if (gettimeofday(&systemTimeHighRes, 0) == -1)
+ {
+ return -1;
+ }
+ struct tm buffer;
+ const struct tm* systemTime =
+- localtime_r(&systemTimeHighRes.tv_sec, &buffer);
++ localtime_r((const time_t *)(&systemTimeHighRes.tv_sec), &buffer);
+
+ const WebRtc_UWord32 ms_time = systemTimeHighRes.tv_usec / 1000;
+ WebRtc_UWord32 prevTickCount = 0;
+ if (level == kTraceApiCall)
+ {
+ prevTickCount = _prevTickCount;
+ _prevTickCount = ms_time;
+ } else {
diff --git media/webrtc/trunk/src/video_engine/vie_defines.h media/webrtc/trunk/src/video_engine/vie_defines.h
index 2cc18cc7..2c042a0 100644
--- media/webrtc/trunk/src/video_engine/vie_defines.h
@@ -1996,7 +2013,7 @@ diff --git media/webrtc/trunk/src/voice_engine/voice_engine_defines.h media/webr
index 7d4c729..4104719 100644
--- media/webrtc/trunk/src/voice_engine/voice_engine_defines.h
+++ media/webrtc/trunk/src/voice_engine/voice_engine_defines.h
-@@ -434,41 +434,44 @@ namespace webrtc
+@@ -437,41 +437,44 @@ namespace webrtc
#else
#define ANDROID_NOT_SUPPORTED(stat)
@@ -2042,7 +2059,7 @@ index 7d4c729..4104719 100644
#define TRUE 1
#define SOCKADDR_IN struct sockaddr_in
#define UINT unsigned int
-@@ -576,13 +579,13 @@ namespace webrtc
+@@ -579,13 +582,13 @@ namespace webrtc
// Defines
// ----------------------------------------------------------------------------
diff --git a/www/firefox/files/patch-bug810716 b/www/firefox/files/patch-bug810716
new file mode 100644
index 000000000000..8c08e9a66986
--- /dev/null
+++ b/www/firefox/files/patch-bug810716
@@ -0,0 +1,68 @@
+diff --git configure.in configure.in
+index 2084be9..eb6eeb2 100644
+--- configure.in
++++ configure.in
+@@ -3369,14 +3369,19 @@ fi
+ AC_CACHE_CHECK(
+ [for res_ninit()],
+ ac_cv_func_res_ninit,
+- [AC_TRY_LINK([
++ [AC_TRY_RUN([
+ #ifdef linux
+ #define _BSD_SOURCE 1
+ #endif
++ #include <sys/types.h>
++ #include <netinet/in.h>
++ #include <arpa/nameser.h>
+ #include <resolv.h>
+- ],
+- [int foo = res_ninit(&_res);],
++ int main(int argc, char **argv){
++ int foo = res_ninit(&_res);
++ }],
+ [ac_cv_func_res_ninit=yes],
++ [ac_cv_func_res_ninit=no],
+ [ac_cv_func_res_ninit=no])
+ ])
+
+diff --git extensions/auth/nsAuthGSSAPI.cpp extensions/auth/nsAuthGSSAPI.cpp
+index e828beb..6444246 100644
+--- extensions/auth/nsAuthGSSAPI.cpp
++++ extensions/auth/nsAuthGSSAPI.cpp
+@@ -39,6 +39,9 @@ typedef KLStatus (*KLCacheHasValidTickets_type)(
+ #endif
+
+ #if defined(HAVE_RES_NINIT)
++#include <sys/types.h>
++#include <netinet/in.h>
++#include <arpa/nameser.h>
+ #include <resolv.h>
+ #endif
+
+diff --git js/src/configure.in js/src/configure.in
+index e25f569..b9722f9 100644
+--- js/src/configure.in
++++ js/src/configure.in
+@@ -2797,14 +2797,19 @@ fi
+ AC_CACHE_CHECK(
+ [for res_ninit()],
+ ac_cv_func_res_ninit,
+- [AC_TRY_LINK([
++ [AC_TRY_RUN([
+ #ifdef linux
+ #define _BSD_SOURCE 1
+ #endif
++ #include <sys/types.h>
++ #include <netinet/in.h>
++ #include <arpa/nameser.h>
+ #include <resolv.h>
+- ],
+- [int foo = res_ninit(&_res);],
++ int main(int argc, char **argv){
++ int foo = res_ninit(&_res);
++ }],
+ [ac_cv_func_res_ninit=yes],
++ [ac_cv_func_res_ninit=no],
+ [ac_cv_func_res_ninit=no])
+ ])
+
diff --git a/www/firefox/files/patch-bug817267 b/www/firefox/files/patch-bug817267
deleted file mode 100644
index 84c77f9e8ac5..000000000000
--- a/www/firefox/files/patch-bug817267
+++ /dev/null
@@ -1,36 +0,0 @@
-commit faafeb1
-Author: Jan Beich <jbeich@tormail.org>
-Date: Sat Dec 1 21:25:24 2012 -0500
-
- Bug 817267 - dirfd() is a macro on some BSDs, fix build there. r=yoric
----
- dom/system/OSFileConstants.cpp | 9 +++++++--
- 1 file changed, 7 insertions(+), 2 deletions(-)
-
-diff --git dom/system/OSFileConstants.cpp dom/system/OSFileConstants.cpp
-index 75a41dc..63fc6b1 100644
---- dom/system/OSFileConstants.cpp
-+++ dom/system/OSFileConstants.cpp
-@@ -41,6 +41,11 @@
- #include "OSFileConstants.h"
- #include "nsIOSFileConstantsService.h"
-
-+#if defined(__DragonFly__) || defined(__FreeBSD__) \
-+ || defined(__NetBSD__) || defined(__OpenBSD__)
-+#define __dd_fd dd_fd
-+#endif
-+
- /**
- * This module defines the basic libc constants (error numbers, open modes,
- * etc.) used by OS.File and possibly other OS-bound JavaScript libraries.
-@@ -383,8 +388,8 @@ static dom::ConstantSpec gLibcProperties[] =
- { "OSFILE_OFFSETOF_DIRENT_D_TYPE", INT_TO_JSVAL(offsetof (struct dirent, d_type)) },
- #endif // defined(DT_UNKNOWN)
-
-- // Under MacOS X, |dirfd| is a macro rather than a function, so we
-- // need a little help to get it to work
-+ // Under MacOS X and BSDs, |dirfd| is a macro rather than a
-+ // function, so we need a little help to get it to work
- #if defined(dirfd)
- { "OSFILE_SIZEOF_DIR", INT_TO_JSVAL(sizeof (DIR)) },
-
diff --git a/www/firefox/files/patch-bug817481 b/www/firefox/files/patch-bug817481
deleted file mode 100644
index d2155017b565..000000000000
--- a/www/firefox/files/patch-bug817481
+++ /dev/null
@@ -1,26 +0,0 @@
-commit 93d56d2
-Author: Makoto Kato <m_kato@ga2.so-net.ne.jp>
-Date: Mon Dec 3 17:01:16 2012 +0900
-
- Bug 817481 - Build failure on WebRTC unit test with --with-system-libvpx. r=jesup
----
- media/webrtc/signaling/test/Makefile.in | 6 ++++++
- 1 file changed, 6 insertions(+)
-
-diff --git media/webrtc/signaling/test/Makefile.in media/webrtc/signaling/test/Makefile.in
-index 81a38ff..e10e869 100644
---- media/webrtc/signaling/test/Makefile.in
-+++ media/webrtc/signaling/test/Makefile.in
-@@ -34,6 +34,12 @@ LIBS += \
- endif
- endif
-
-+ifdef MOZ_NATIVE_LIBVPX
-+LIBS += \
-+ $(MOZ_LIBVPX_LIBS) \
-+ $(NULL)
-+endif
-+
- ifeq (gtk2,$(MOZ_WIDGET_TOOLKIT))
- LIBS += \
- $(XLIBS) \
diff --git a/www/firefox/files/patch-bug824317 b/www/firefox/files/patch-bug824317
new file mode 100644
index 000000000000..9568450015d5
--- /dev/null
+++ b/www/firefox/files/patch-bug824317
@@ -0,0 +1,14 @@
+diff --git a/xpcom/string/public/nsAlgorithm.h b/xpcom/string/public/nsAlgorithm.h
+index fa50194a..c5f5737 100644
+--- xpcom/string/public/nsAlgorithm.h
++++ xpcom/string/public/nsAlgorithm.h
+@@ -42,7 +42,8 @@ NS_MAX( const T& a, const T& b )
+ return a > b ? a : b;
+ }
+
+-#if defined(_MSC_VER) && (_MSC_VER < 1600)
++#if (defined(_MSC_VER) && (_MSC_VER < 1600)) || \
++ (defined(_GLIBCXX_USE_LONG_LONG) && (!_GLIBCXX_USE_C99 || _GLIBCXX_USE_C99_LONG_LONG_DYNAMIC))
+ namespace std {
+ inline
+ long long
diff --git a/www/firefox/files/patch-bug826985 b/www/firefox/files/patch-bug826985
index 22f98fd20720..e7df887723f7 100644
--- a/www/firefox/files/patch-bug826985
+++ b/www/firefox/files/patch-bug826985
@@ -1,106 +1,83 @@
-commit d18000b
+commit 8024d93
Author: Henrik Gulbrandsen <henrik@gulbra.net>
Date: Fri Jan 4 13:49:22 2013 +0100
Bug 826985 - Support more video formats for WebRTC via libv4l2 on Linux.
---
- configure.in | 13 ++++++
- .../main/source/Linux/device_info_linux.cc | 30 ++++++++------
- .../main/source/Linux/video_capture_linux.cc | 47 ++++++++++++----------
- .../video_capture/main/source/video_capture.gypi | 1 +
- toolkit/library/Makefile.in | 3 ++
- 5 files changed, 60 insertions(+), 34 deletions(-)
+ configure.in | 7 +++++++
+ media/webrtc/signaling/test/Makefile.in | 1 +
+ .../modules/video_capture/main/source/Linux/device_info_linux.cc | 17 +++++++++++++++++
+ .../modules/video_capture/main/source/Linux/video_capture_linux.cc | 16 +++++++++++++++-
+ .../webrtc/modules/video_capture/main/source/video_capture.gypi | 11 +++++++++++
+ toolkit/library/Makefile.in | 1 +
+ 6 files changed, 52 insertions(+), 1 deletion(-)
diff --git configure.in configure.in
-index 6d05f9c..297615f 100644
+index 55e4cd1..76567b3 100644
--- configure.in
+++ configure.in
-@@ -5270,6 +5270,17 @@ if test -n "$MOZ_WEBRTC"; then
- MOZ_VP8=1
+@@ -5238,6 +5238,9 @@ if test -n "$MOZ_WEBRTC"; then
MOZ_VP8_ENCODER=1
MOZ_VP8_ERROR_CONCEALMENT=1
-+ dnl use libv4l on Linux to support more cameras
-+ case "$target" in
-+ *-android*|*-linuxandroid*)
-+ ;;
-+ *-linux*|*-dragonfly*|*-freebsd*|*-netbsd*|*-openbsd*)
-+ MOZ_WEBRTC_LIBV4L=1
-+ PKG_CHECK_MODULES(MOZ_LIBV4L2, libv4l2, ,
-+ [echo "$MOZ_LIBV4L2_PKG_ERRORS"
-+ AC_MSG_ERROR([WebRTC on Linux needs libv4l2 for video format conversion.])])
-+ ;;
-+ esac
- dnl enable once Signaling lands
- MOZ_WEBRTC_SIGNALING=1
- AC_DEFINE(MOZ_WEBRTC_SIGNALING)
-@@ -5288,6 +5299,7 @@ fi
- AC_SUBST(MOZ_WEBRTC)
- AC_SUBST(MOZ_WEBRTC_SIGNALING)
- AC_SUBST(MOZ_PEERCONNECTION)
-+AC_SUBST(MOZ_WEBRTC_LIBV4L)
- AC_SUBST(MOZ_WEBRTC_IN_LIBXUL)
- AC_SUBST(MOZ_SCTP)
- AC_SUBST(MOZ_SRTP)
+
++ dnl with libv4l2 we can support more cameras
++ PKG_CHECK_MODULES(MOZ_LIBV4L2, libv4l2)
++
+ dnl OpenSLES is only available in Android 2.3 and later; we'll change this
+ dnl hard dependency to a dynamic load with graceful runtime failure before
+ dnl we make --enable-webrtc on by default in Android (bug 815905)
+@@ -8981,6 +8984,10 @@ elif test "${OS_TARGET}" = "Android"; then
+ fi
+ fi
+
++if test -n "$MOZ_LIBV4L2_LIBS"; then
++ EXTRA_GYP_DEFINES="$EXTRA_GYP_DEFINES -D use_libv4l2=1"
++fi
++
+ if test -n "$MOZ_WEBRTC"; then
+ AC_MSG_RESULT("generating WebRTC Makefiles...")
+
+diff --git media/webrtc/signaling/test/Makefile.in media/webrtc/signaling/test/Makefile.in
+index b483cd1..f1dd1f0 100644
+--- media/webrtc/signaling/test/Makefile.in
++++ media/webrtc/signaling/test/Makefile.in
+@@ -17,6 +17,7 @@ LIBS = \
+ $(NSPR_LIBS) \
+ $(NSS_LIBS) \
+ $(REALTIME_LIBS) \
++ $(MOZ_LIBV4L2_LIBS) \
+ $(DEPTH)/xpcom/glue/$(LIB_PREFIX)xpcomglue_s.$(LIB_SUFFIX) \
+ $(DEPTH)/media/mtransport/standalone/$(LIB_PREFIX)mtransport_s.$(LIB_SUFFIX) \
+ $(DEPTH)/media/webrtc/signalingtest/signaling_ecc/$(LIB_PREFIX)ecc.$(LIB_SUFFIX) \
diff --git media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc
-index 653ee16..270f064 100644
+index 239a292..bab496c 100644
--- media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc
+++ media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc
-@@ -26,6 +26,7 @@
+@@ -26,11 +26,23 @@
#else
#include <linux/videodev2.h>
#endif
++#ifdef HAVE_LIBV4L2
+#include <libv4l2.h>
++#endif
#include "ref_count.h"
#include "trace.h"
-@@ -68,9 +69,9 @@ WebRtc_UWord32 DeviceInfoLinux::NumberOfDevices()
- for (int n = 0; n < 64; n++)
- {
- sprintf(device, "/dev/video%d", n);
-- if ((fd = open(device, O_RDONLY)) != -1)
-+ if ((fd = v4l2_open(device, O_RDONLY)) != -1)
- {
-- close(fd);
-+ v4l2_close(fd);
- count++;
- }
- }
-@@ -97,14 +98,14 @@ WebRtc_Word32 DeviceInfoLinux::GetDeviceName(
- for (int n = 0; n < 64; n++)
- {
- sprintf(device, "/dev/video%d", n);
-- if ((fd = open(device, O_RDONLY)) != -1)
-+ if ((fd = v4l2_open(device, O_RDONLY)) != -1)
- {
- if (count == deviceNumber) {
- // Found the device
- found = true;
- break;
- } else {
-- close(fd);
-+ v4l2_close(fd);
- count++;
- }
- }
-@@ -115,21 +116,26 @@ WebRtc_Word32 DeviceInfoLinux::GetDeviceName(
- // query device capabilities
- struct v4l2_capability cap;
-- if (ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0)
-+ if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
- "error in querying the device capability for device %s. errno = %d",
- device, errno);
-- close(fd);
-+ v4l2_close(fd);
- return -1;
- }
-- close(fd);
-+ v4l2_close(fd);
-
- char cameraName[64];
++#ifdef HAVE_LIBV4L2
++#define open v4l2_open
++#define close v4l2_close
++#define dup v4l2_dup
++#define ioctl v4l2_ioctl
++#define mmap v4l2_mmap
++#define munmap v4l2_munmap
++#endif
++
+ namespace webrtc
+ {
+ namespace videocapturemodule
+@@ -130,6 +142,11 @@ WebRtc_Word32 DeviceInfoLinux::GetDeviceName(
memset(deviceNameUTF8, 0, deviceNameLength);
memcpy(cameraName, cap.card, sizeof(cap.card));
@@ -112,259 +89,76 @@ index 653ee16..270f064 100644
if (deviceNameLength >= strlen(cameraName))
{
memcpy(deviceNameUTF8, cameraName, strlen(cameraName));
-@@ -181,13 +187,13 @@ WebRtc_Word32 DeviceInfoLinux::CreateCapabilityMap(
- for (int n = 0; n < 64; ++n)
- {
- sprintf(device, "/dev/video%d", n);
-- fd = open(device, O_RDONLY);
-+ fd = v4l2_open(device, O_RDONLY);
- if (fd == -1)
- continue;
-
- // query device capabilities
- struct v4l2_capability cap;
-- if (ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
-+ if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
- {
- if (cap.bus_info[0] != 0)
- {
-@@ -209,7 +215,7 @@ WebRtc_Word32 DeviceInfoLinux::CreateCapabilityMap(
- }
- }
- }
-- close(fd); // close since this is not the matching device
-+ v4l2_close(fd); // close since this is not the matching device
- }
-
- if (!found)
-@@ -228,7 +234,7 @@ WebRtc_Word32 DeviceInfoLinux::CreateCapabilityMap(
- }
-
- int size = FillCapabilityMap(fd);
-- close(fd);
-+ v4l2_close(fd);
-
- // Store the new used device name
- _lastUsedDeviceNameLength = deviceUniqueIdUTF8Length;
-@@ -282,7 +288,7 @@ WebRtc_Word32 DeviceInfoLinux::FillCapabilityMap(int fd)
- video_fmt.fmt.pix.width = size[i][0];
- video_fmt.fmt.pix.height = size[i][1];
-
-- if (ioctl(fd, VIDIOC_TRY_FMT, &video_fmt) >= 0)
-+ if (v4l2_ioctl(fd, VIDIOC_TRY_FMT, &video_fmt) >= 0)
- {
- if ((video_fmt.fmt.pix.width == size[i][0])
- && (video_fmt.fmt.pix.height == size[i][1]))
diff --git media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc
-index 12df1b3..4ddc9d4 100644
+index 12df1b3..e9863ba 100644
--- media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc
+++ media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc
-@@ -25,6 +25,7 @@
+@@ -25,6 +25,9 @@
#else
#include <linux/videodev2.h>
#endif
++#ifdef HAVE_LIBV4L2
+#include <libv4l2.h>
++#endif
#include <new>
-@@ -79,11 +82,11 @@ WebRtc_Word32 VideoCaptureModuleV4L2::Init(const char* deviceUniqueIdUTF8)
- for (n = 0; n < 64; n++)
- {
- sprintf(device, "/dev/video%d", n);
-- if ((fd = open(device, O_RDONLY)) != -1)
-+ if ((fd = v4l2_open(device, O_RDONLY)) != -1)
- {
- // query device capabilities
- struct v4l2_capability cap;
-- if (ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
-+ if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
- {
- if (cap.bus_info[0] != 0)
- {
-@@ -91,13 +94,13 @@ WebRtc_Word32 VideoCaptureModuleV4L2::Init(const char* deviceUniqueIdUTF8)
- (const char*) deviceUniqueIdUTF8,
- strlen((const char*) deviceUniqueIdUTF8)) == 0) //match with device id
- {
-- close(fd);
-+ v4l2_close(fd);
- found = true;
- break; // fd matches with device unique id supplied
- }
- }
- }
-- close(fd); // close since this is not the matching device
-+ v4l2_close(fd); // close since this is not the matching device
- }
- }
- if (!found)
-@@ -117,7 +120,7 @@ VideoCaptureModuleV4L2::~VideoCaptureModuleV4L2()
- delete _captureCritSect;
- }
- if (_deviceFd != -1)
-- close(_deviceFd);
-+ v4l2_close(_deviceFd);
- }
-
- WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
-@@ -142,7 +145,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
- char device[20];
- sprintf(device, "/dev/video%d", (int) _deviceId);
-
-- if ((_deviceFd = open(device, O_RDWR | O_NONBLOCK, 0)) < 0)
-+ if ((_deviceFd = v4l2_open(device, O_RDWR | O_NONBLOCK, 0)) < 0)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
- "error in opening %s errono = %d", device, errno);
-@@ -175,7 +178,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
- for (int i = 0; i < nFormats; i++)
- {
- video_fmt.fmt.pix.pixelformat = fmts[i];
-- if (ioctl(_deviceFd, VIDIOC_TRY_FMT, &video_fmt) < 0)
-+ if (v4l2_ioctl(_deviceFd, VIDIOC_TRY_FMT, &video_fmt) < 0)
- {
- continue;
- }
-@@ -200,7 +203,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
- _captureVideoType = kVideoMJPEG;
-
- //set format and frame size now
-- if (ioctl(_deviceFd, VIDIOC_S_FMT, &video_fmt) < 0)
-+ if (v4l2_ioctl(_deviceFd, VIDIOC_S_FMT, &video_fmt) < 0)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
- "error in VIDIOC_S_FMT, errno = %d", errno);
-@@ -217,7 +220,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
- struct v4l2_streamparm streamparms;
- memset(&streamparms, 0, sizeof(streamparms));
- streamparms.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-- if (ioctl(_deviceFd, VIDIOC_G_PARM, &streamparms) < 0) {
-+ if (v4l2_ioctl(_deviceFd, VIDIOC_G_PARM, &streamparms) < 0) {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
- "error in VIDIOC_G_PARM errno = %d", errno);
- driver_framerate_support = false;
-@@ -230,7 +233,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
- streamparms.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- streamparms.parm.capture.timeperframe.numerator = 1;
- streamparms.parm.capture.timeperframe.denominator = capability.maxFPS;
-- if (ioctl(_deviceFd, VIDIOC_S_PARM, &streamparms) < 0) {
-+ if (v4l2_ioctl(_deviceFd, VIDIOC_S_PARM, &streamparms) < 0) {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
- "Failed to set the framerate. errno=%d", errno);
- driver_framerate_support = false;
-@@ -268,7 +271,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
- // Needed to start UVC camera - from the uvcview application
- enum v4l2_buf_type type;
- type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-- if (ioctl(_deviceFd, VIDIOC_STREAMON, &type) == -1)
-+ if (v4l2_ioctl(_deviceFd, VIDIOC_STREAMON, &type) == -1)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
- "Failed to turn on stream");
-@@ -303,7 +306,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StopCapture()
- _captureThread = NULL;
-
- DeAllocateVideoBuffers();
-- close(_deviceFd);
-+ v4l2_close(_deviceFd);
- _deviceFd = -1;
- }
-
-@@ -321,7 +324,7 @@ bool VideoCaptureModuleV4L2::AllocateVideoBuffers()
- rbuffer.memory = V4L2_MEMORY_MMAP;
- rbuffer.count = kNoOfV4L2Bufffers;
-
-- if (ioctl(_deviceFd, VIDIOC_REQBUFS, &rbuffer) < 0)
-+ if (v4l2_ioctl(_deviceFd, VIDIOC_REQBUFS, &rbuffer) < 0)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
- "Could not get buffers from device. errno = %d", errno);
-@@ -344,24 +347,24 @@ bool VideoCaptureModuleV4L2::AllocateVideoBuffers()
- buffer.memory = V4L2_MEMORY_MMAP;
- buffer.index = i;
-
-- if (ioctl(_deviceFd, VIDIOC_QUERYBUF, &buffer) < 0)
-+ if (v4l2_ioctl(_deviceFd, VIDIOC_QUERYBUF, &buffer) < 0)
- {
- return false;
- }
-
-- _pool[i].start = mmap(NULL, buffer.length, PROT_READ | PROT_WRITE, MAP_SHARED,
-+ _pool[i].start = v4l2_mmap(NULL, buffer.length, PROT_READ | PROT_WRITE, MAP_SHARED,
- _deviceFd, buffer.m.offset);
-
- if (MAP_FAILED == _pool[i].start)
- {
- for (unsigned int j = 0; j < i; j++)
-- munmap(_pool[j].start, _pool[j].length);
-+ v4l2_munmap(_pool[j].start, _pool[j].length);
- return false;
- }
-
- _pool[i].length = buffer.length;
-
-- if (ioctl(_deviceFd, VIDIOC_QBUF, &buffer) < 0)
-+ if (v4l2_ioctl(_deviceFd, VIDIOC_QBUF, &buffer) < 0)
- {
- return false;
- }
-@@ -373,14 +376,14 @@ bool VideoCaptureModuleV4L2::DeAllocateVideoBuffers()
+@@ -26,6 +31,15 @@
+ #include "critical_section_wrapper.h"
+ #include "video_capture_linux.h"
+
++#ifdef HAVE_LIBV4L2
++#define open v4l2_open
++#define close v4l2_close
++#define dup v4l2_dup
++#define ioctl v4l2_ioctl
++#define mmap v4l2_mmap
++#define munmap v4l2_munmap
++#endif
++
+ namespace webrtc
{
- // unmap buffers
- for (int i = 0; i < _buffersAllocatedByDevice; i++)
-- munmap(_pool[i].start, _pool[i].length);
-+ v4l2_munmap(_pool[i].start, _pool[i].length);
-
- delete[] _pool;
-
- // turn off stream
- enum v4l2_buf_type type;
- type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-- if (ioctl(_deviceFd, VIDIOC_STREAMOFF, &type) < 0)
-+ if (v4l2_ioctl(_deviceFd, VIDIOC_STREAMOFF, &type) < 0)
- {
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
- "VIDIOC_STREAMOFF error. errno: %d", errno);
-@@ -438,7 +441,7 @@ bool VideoCaptureModuleV4L2::CaptureProcess()
- buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- buf.memory = V4L2_MEMORY_MMAP;
- // dequeue a buffer - repeat until dequeued properly!
-- while (ioctl(_deviceFd, VIDIOC_DQBUF, &buf) < 0)
-+ while (v4l2_ioctl(_deviceFd, VIDIOC_DQBUF, &buf) < 0)
- {
- if (errno != EINTR)
- {
-@@ -457,7 +460,7 @@ bool VideoCaptureModuleV4L2::CaptureProcess()
- IncomingFrame((unsigned char*) _pool[buf.index].start,
- buf.bytesused, frameInfo);
- // enqueue the buffer again
-- if (ioctl(_deviceFd, VIDIOC_QBUF, &buf) == -1)
-+ if (v4l2_ioctl(_deviceFd, VIDIOC_QBUF, &buf) == -1)
- {
- WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceVideoCapture, _id,
- "Failed to enqueue capture buffer");
+ namespace videocapturemodule
diff --git media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi
-index 8d38102..3e8f76b 100644
+index d46b5aa..e452223 100644
--- media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi
+++ media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi
-@@ -179,6 +179,7 @@
- 'libraries': [
- '-lXext',
- '-lX11',
-+ '-lv4l2',
+@@ -7,6 +7,9 @@
+ # be found in the AUTHORS file in the root of the source tree.
+
+ {
++ 'variables': {
++ 'use_libv4l2%': 0,
++ },
+ 'targets': [
+ {
+ 'target_name': 'video_capture_module',
+@@ -49,6 +52,16 @@
+ }, { # include_internal_video_capture == 1
+ 'conditions': [
+ ['include_v4l2_video_capture==1', {
++ 'conditions': [
++ ['use_libv4l2==1', {
++ 'defines': [
++ 'HAVE_LIBV4L2',
++ ],
++ 'libraries': [
++ '-lv4l2',
++ ],
++ }],
++ ],
+ 'include_dirs': [
+ 'linux',
],
- }],
- ['OS=="linux"', {
diff --git toolkit/library/Makefile.in toolkit/library/Makefile.in
-index 0440c26..8f6c735 100644
+index 9c16ffa..1db3794 100644
--- toolkit/library/Makefile.in
+++ toolkit/library/Makefile.in
-@@ -411,6 +411,9 @@ EXTRA_DSO_LDOPTS += \
- $(DEPTH)/media/webrtc/signaling/signaling_sipcc/$(LIB_PREFIX)sipcc.$(LIB_SUFFIX) \
- $(NULL)
- endif
-+ifdef MOZ_WEBRTC_LIBV4L
+@@ -405,6 +405,7 @@ endif
+ EXTRA_DSO_LDOPTS += $(call EXPAND_LIBNAME_PATH,gkmedias,$(DIST)/lib)
+
+ ifdef MOZ_WEBRTC
+EXTRA_DSO_LDOPTS += $(MOZ_LIBV4L2_LIBS)
-+endif
- ifdef MOZ_WEBRTC_IN_LIBXUL
- include $(topsrcdir)/media/webrtc/shared_libs.mk
- EXTRA_DSO_LDOPTS += $(WEBRTC_LIBS)
+ ifdef MOZ_PEERCONNECTION
+ COMPONENT_LIBS += peerconnection
+ endif
diff --git a/www/firefox/files/patch-bug827521 b/www/firefox/files/patch-bug827521
new file mode 100644
index 000000000000..a9f76176c801
--- /dev/null
+++ b/www/firefox/files/patch-bug827521
@@ -0,0 +1,147 @@
+commit ab46441
+Author: Graeme McCutcheon <graememcc_firefox@graeme-online.co.uk>
+Date: Thu Jan 10 14:37:30 2013 +0000
+
+ Bug 827521 - Work around spurious operator ambiguity errors in buggy versions of Clang. r=longsonr
+---
+ .../svg/content/src/SVGAnimatedPreserveAspectRatio.cpp | 17 ++++++++---------
+ .../svg/content/src/SVGAnimatedPreserveAspectRatio.h | 7 +++----
+ content/svg/content/src/SVGPreserveAspectRatio.h | 17 +++++++++++++----
+ 3 files changed, 24 insertions(+), 17 deletions(-)
+
+diff --git content/svg/content/src/SVGAnimatedPreserveAspectRatio.cpp content/svg/content/src/SVGAnimatedPreserveAspectRatio.cpp
+index 6593461..56956b2 100644
+--- content/svg/content/src/SVGAnimatedPreserveAspectRatio.cpp
++++ content/svg/content/src/SVGAnimatedPreserveAspectRatio.cpp
+@@ -54,7 +54,7 @@ GetAlignForString(const nsAString &aAlignString)
+ {
+ for (uint32_t i = 0 ; i < ArrayLength(sAlignStrings) ; i++) {
+ if (aAlignString.EqualsASCII(sAlignStrings[i])) {
+- return (i + SVG_PRESERVEASPECTRATIO_NONE);
++ return (i + SVG_ALIGN_MIN_VALID);
+ }
+ }
+
+@@ -65,12 +65,11 @@ static void
+ GetAlignString(nsAString& aAlignString, uint16_t aAlign)
+ {
+ NS_ASSERTION(
+- aAlign >= SVG_PRESERVEASPECTRATIO_NONE &&
+- aAlign <= SVG_PRESERVEASPECTRATIO_XMAXYMAX,
++ aAlign >= SVG_ALIGN_MIN_VALID && aAlign <= SVG_ALIGN_MAX_VALID,
+ "Unknown align");
+
+ aAlignString.AssignASCII(
+- sAlignStrings[aAlign - SVG_PRESERVEASPECTRATIO_NONE]);
++ sAlignStrings[aAlign - SVG_ALIGN_MIN_VALID]);
+ }
+
+ static uint16_t
+@@ -78,7 +77,7 @@ GetMeetOrSliceForString(const nsAString &aMeetOrSlice)
+ {
+ for (uint32_t i = 0 ; i < ArrayLength(sMeetOrSliceStrings) ; i++) {
+ if (aMeetOrSlice.EqualsASCII(sMeetOrSliceStrings[i])) {
+- return (i + SVG_MEETORSLICE_MEET);
++ return (i + SVG_MEETORSLICE_MIN_VALID);
+ }
+ }
+
+@@ -89,12 +88,12 @@ static void
+ GetMeetOrSliceString(nsAString& aMeetOrSliceString, uint16_t aMeetOrSlice)
+ {
+ NS_ASSERTION(
+- aMeetOrSlice >= SVG_MEETORSLICE_MEET &&
+- aMeetOrSlice <= SVG_MEETORSLICE_SLICE,
++ aMeetOrSlice >= SVG_MEETORSLICE_MIN_VALID &&
++ aMeetOrSlice <= SVG_MEETORSLICE_MAX_VALID,
+ "Unknown meetOrSlice");
+
+ aMeetOrSliceString.AssignASCII(
+- sMeetOrSliceStrings[aMeetOrSlice - SVG_MEETORSLICE_MEET]);
++ sMeetOrSliceStrings[aMeetOrSlice - SVG_MEETORSLICE_MIN_VALID]);
+ }
+
+ already_AddRefed<DOMSVGPreserveAspectRatio>
+@@ -226,7 +225,7 @@ SVGAnimatedPreserveAspectRatio::GetBaseValueString(
+ GetAlignString(tmpString, mBaseVal.mAlign);
+ aValueAsString.Append(tmpString);
+
+- if (mBaseVal.mAlign != SVG_PRESERVEASPECTRATIO_NONE) {
++ if (mBaseVal.mAlign != uint8_t(SVG_PRESERVEASPECTRATIO_NONE)) {
+
+ aValueAsString.AppendLiteral(" ");
+ GetMeetOrSliceString(tmpString, mBaseVal.mMeetOrSlice);
+diff --git content/svg/content/src/SVGAnimatedPreserveAspectRatio.h content/svg/content/src/SVGAnimatedPreserveAspectRatio.h
+index 61cfba7..b08fb60 100644
+--- content/svg/content/src/SVGAnimatedPreserveAspectRatio.h
++++ content/svg/content/src/SVGAnimatedPreserveAspectRatio.h
+@@ -42,8 +42,7 @@ public:
+ void SetBaseValue(const SVGPreserveAspectRatio &aValue,
+ nsSVGElement *aSVGElement);
+ nsresult SetBaseAlign(uint16_t aAlign, nsSVGElement *aSVGElement) {
+- if (aAlign < SVG_PRESERVEASPECTRATIO_NONE ||
+- aAlign > SVG_PRESERVEASPECTRATIO_XMAXYMAX) {
++ if (aAlign < SVG_ALIGN_MIN_VALID || aAlign > SVG_ALIGN_MAX_VALID) {
+ return NS_ERROR_FAILURE;
+ }
+ SetBaseValue(SVGPreserveAspectRatio(
+@@ -53,8 +52,8 @@ public:
+ return NS_OK;
+ }
+ nsresult SetBaseMeetOrSlice(uint16_t aMeetOrSlice, nsSVGElement *aSVGElement) {
+- if (aMeetOrSlice < SVG_MEETORSLICE_MEET ||
+- aMeetOrSlice > SVG_MEETORSLICE_SLICE) {
++ if (aMeetOrSlice < SVG_MEETORSLICE_MIN_VALID ||
++ aMeetOrSlice > SVG_MEETORSLICE_MAX_VALID) {
+ return NS_ERROR_FAILURE;
+ }
+ SetBaseValue(SVGPreserveAspectRatio(
+diff --git content/svg/content/src/SVGPreserveAspectRatio.h content/svg/content/src/SVGPreserveAspectRatio.h
+index 066ad52..ebe724e 100644
+--- content/svg/content/src/SVGPreserveAspectRatio.h
++++ content/svg/content/src/SVGPreserveAspectRatio.h
+@@ -28,6 +28,11 @@ enum SVGAlign MOZ_ENUM_TYPE(uint8_t) {
+ SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10
+ };
+
++// These constants represent the range of valid enum values for the <align>
++// parameter. They exclude the sentinel _UNKNOWN value.
++const uint16_t SVG_ALIGN_MIN_VALID = SVG_PRESERVEASPECTRATIO_NONE;
++const uint16_t SVG_ALIGN_MAX_VALID = SVG_PRESERVEASPECTRATIO_XMAXYMAX;
++
+ // Meet-or-slice Types
+ enum SVGMeetOrSlice MOZ_ENUM_TYPE(uint8_t) {
+ SVG_MEETORSLICE_UNKNOWN = 0,
+@@ -35,6 +40,11 @@ enum SVGMeetOrSlice MOZ_ENUM_TYPE(uint8_t) {
+ SVG_MEETORSLICE_SLICE = 2
+ };
+
++// These constants represent the range of valid enum values for the
++// <meetOrSlice> parameter. They exclude the sentinel _UNKNOWN value.
++const uint16_t SVG_MEETORSLICE_MIN_VALID = SVG_MEETORSLICE_MEET;
++const uint16_t SVG_MEETORSLICE_MAX_VALID = SVG_MEETORSLICE_SLICE;
++
+ class SVGAnimatedPreserveAspectRatio;
+
+ class SVGPreserveAspectRatio MOZ_FINAL
+@@ -57,8 +67,7 @@ public:
+ {}
+
+ nsresult SetAlign(uint16_t aAlign) {
+- if (aAlign < SVG_PRESERVEASPECTRATIO_NONE ||
+- aAlign > SVG_PRESERVEASPECTRATIO_XMAXYMAX)
++ if (aAlign < SVG_ALIGN_MIN_VALID || aAlign > SVG_ALIGN_MAX_VALID)
+ return NS_ERROR_FAILURE;
+ mAlign = static_cast<uint8_t>(aAlign);
+ return NS_OK;
+@@ -69,8 +78,8 @@ public:
+ }
+
+ nsresult SetMeetOrSlice(uint16_t aMeetOrSlice) {
+- if (aMeetOrSlice < SVG_MEETORSLICE_MEET ||
+- aMeetOrSlice > SVG_MEETORSLICE_SLICE)
++ if (aMeetOrSlice < SVG_MEETORSLICE_MIN_VALID ||
++ aMeetOrSlice > SVG_MEETORSLICE_MAX_VALID)
+ return NS_ERROR_FAILURE;
+ mMeetOrSlice = static_cast<uint8_t>(aMeetOrSlice);
+ return NS_OK;
diff --git a/www/firefox/files/patch-bug836824 b/www/firefox/files/patch-bug836824
new file mode 100644
index 000000000000..807015baa616
--- /dev/null
+++ b/www/firefox/files/patch-bug836824
@@ -0,0 +1,33 @@
+commit 35107a0 (HEAD)
+Author: Paul Adenot <paul@paul.cx>
+Date: Mon Feb 4 20:21:19 2013 +0100
+
+ Bug 836824 - libsoundtouch fails to build due to __get_cpuid() invocation, if you don't have xcode command line tools. r=
+---
+ media/libsoundtouch/moz-libsoundtouch.patch | 24 ++++++++++++++++++++++++
+ media/libsoundtouch/src/cpu_detect_x86.cpp | 5 ++++-
+ 2 files changed, 28 insertions(+), 1 deletion(-)
+
+diff --git media/libsoundtouch/src/cpu_detect_x86.cpp media/libsoundtouch/src/cpu_detect_x86.cpp
+index a42008e..7a31aa9 100644
+--- media/libsoundtouch/src/cpu_detect_x86.cpp
++++ media/libsoundtouch/src/cpu_detect_x86.cpp
+@@ -101,7 +101,7 @@ uint detectCPUextensions(void)
+
+ uint res = 0;
+
+-#if defined(__GNUC__)
++#if defined(__GNUC__) && defined(HAVE_CPUID_H)
+ // GCC version of cpuid. Requires GCC 4.3.0 or later for __cpuid intrinsic support.
+ uint eax, ebx, ecx, edx; // unsigned int is the standard type. uint is defined by the compiler and not guaranteed to be portable.
+
+@@ -112,6 +112,9 @@ uint detectCPUextensions(void)
+ if (edx & bit_SSE) res = res | SUPPORT_SSE;
+ if (edx & bit_SSE2) res = res | SUPPORT_SSE2;
+
++#elif defined(__GNUC__)
++ // No cpuid.h --> no cpuid support
++ return 0;
+ #else
+ // Window / VS version of cpuid. Notice that Visual Studio 2005 or later required
+ // for __cpuid intrinsic support.
diff --git a/www/firefox/files/patch-bug844818 b/www/firefox/files/patch-bug844818
new file mode 100644
index 000000000000..cf796b639134
--- /dev/null
+++ b/www/firefox/files/patch-bug844818
@@ -0,0 +1,126 @@
+diff --git configure.in configure.in
+index 7cd6e17..a1dbdf7 100644
+--- configure.in
++++ configure.in
+@@ -9106,6 +9106,18 @@ elif test "${OS_TARGET}" = "Android"; th
+ fi
+ fi
+
++# Keep libcubeb and audio_device backends in sync
++if test -n "$MOZ_ALSA"; then
++ EXTRA_GYP_DEFINES="$EXTRA_GYP_DEFINES -D include_alsa_audio=1"
++else
++ EXTRA_GYP_DEFINES="$EXTRA_GYP_DEFINES -D include_alsa_audio=0"
++fi
++if test -n "$MOZ_PULSEAUDIO"; then
++ EXTRA_GYP_DEFINES="$EXTRA_GYP_DEFINES -D include_pulse_audio=1"
++else
++ EXTRA_GYP_DEFINES="$EXTRA_GYP_DEFINES -D include_pulse_audio=0"
++fi
++
+ # Don't try to compile sse4.1 code if toolchain doesn't support
+ if test -z "$HAVE_TOOLCHAIN_SUPPORT_MSSE4_1"; then
+ EXTRA_GYP_DEFINES="$EXTRA_GYP_DEFINES -D yuv_disable_asm=1"
+diff --git media/webrtc/trunk/src/modules/audio_device/main/source/audio_device.gypi media/webrtc/trunk/src/modules/audio_device/main/source/audio_device.gypi
+index 8457737..dfc83ff 100644
+--- media/webrtc/trunk/src/modules/audio_device/main/source/audio_device.gypi
++++ media/webrtc/trunk/src/modules/audio_device/main/source/audio_device.gypi
+@@ -45,11 +45,15 @@
+ 'dummy/audio_device_utility_dummy.h',
+ ],
+ 'conditions': [
+- ['OS=="linux"', {
++ ['include_alsa_audio==1 or include_pulse_audio==1', {
+ 'include_dirs': [
+ 'linux',
+ ],
+- }], # OS==linux
++ 'defines': [
++ # avoid pointless rename
++ 'WEBRTC_LINUX',
++ ],
++ }], # include_alsa_audio==1 or include_pulse_audio==1
+ ['OS=="mac"', {
+ 'include_dirs': [
+ 'mac',
+@@ -74,14 +78,8 @@
+ }],
+ ['include_internal_audio_device==1', {
+ 'sources': [
+- 'linux/alsasymboltable_linux.cc',
+- 'linux/alsasymboltable_linux.h',
+- 'linux/audio_device_alsa_linux.cc',
+- 'linux/audio_device_alsa_linux.h',
+ 'linux/audio_device_utility_linux.cc',
+ 'linux/audio_device_utility_linux.h',
+- 'linux/audio_mixer_manager_alsa_linux.cc',
+- 'linux/audio_mixer_manager_alsa_linux.h',
+ 'linux/latebindingsymboltable_linux.cc',
+ 'linux/latebindingsymboltable_linux.h',
+ 'mac/audio_device_mac.cc',
+@@ -116,28 +114,36 @@
+ },
+ }],
+ ['OS=="linux"', {
+- 'defines': [
+- 'LINUX_ALSA',
+- ],
+ 'link_settings': {
+ 'libraries': [
+ '-ldl',
+ ],
+ },
+- 'conditions': [
+- ['include_pulse_audio==1', {
+- 'defines': [
+- 'LINUX_PULSE',
+- ],
+- 'sources': [
+- 'linux/audio_device_pulse_linux.cc',
+- 'linux/audio_device_pulse_linux.h',
+- 'linux/audio_mixer_manager_pulse_linux.cc',
+- 'linux/audio_mixer_manager_pulse_linux.h',
+- 'linux/pulseaudiosymboltable_linux.cc',
+- 'linux/pulseaudiosymboltable_linux.h',
+- ],
+- }],
++ }],
++ ['include_alsa_audio==1', {
++ 'defines': [
++ 'LINUX_ALSA',
++ ],
++ 'sources': [
++ 'linux/alsasymboltable_linux.cc',
++ 'linux/alsasymboltable_linux.h',
++ 'linux/audio_device_alsa_linux.cc',
++ 'linux/audio_device_alsa_linux.h',
++ 'linux/audio_mixer_manager_alsa_linux.cc',
++ 'linux/audio_mixer_manager_alsa_linux.h',
++ ],
++ }],
++ ['include_pulse_audio==1', {
++ 'defines': [
++ 'LINUX_PULSE',
++ ],
++ 'sources': [
++ 'linux/audio_device_pulse_linux.cc',
++ 'linux/audio_device_pulse_linux.h',
++ 'linux/audio_mixer_manager_pulse_linux.cc',
++ 'linux/audio_mixer_manager_pulse_linux.h',
++ 'linux/pulseaudiosymboltable_linux.cc',
++ 'linux/pulseaudiosymboltable_linux.h',
+ ],
+ }],
+ ['OS=="mac"', {
+diff --git media/webrtc/webrtc_config.gypi media/webrtc/webrtc_config.gypi
+index b504d3d..e2eb127 100644
+--- media/webrtc/webrtc_config.gypi
++++ media/webrtc/webrtc_config.gypi
+@@ -9,7 +9,6 @@
+ 'include_internal_video_render': 0,
+ 'clang_use_chrome_plugins': 0,
+ 'enable_protobuf': 0,
+- 'include_pulse_audio': 0,
+ 'include_tests': 0,
+ 'use_system_libjpeg': 1,
+ 'use_system_libvpx': 1,
diff --git a/www/firefox/files/patch-content-media-AudioStream.cpp b/www/firefox/files/patch-content-media-AudioStream.cpp
deleted file mode 100644
index cfb10e53f2a8..000000000000
--- a/www/firefox/files/patch-content-media-AudioStream.cpp
+++ /dev/null
@@ -1,11 +0,0 @@
---- content/media/AudioStream.cpp~
-+++ content/media/AudioStream.cpp
-@@ -298,7 +298,7 @@ static int PrefChanged(const char* aPref, void* aClosure)
- gVolumeScale = NS_MAX<double>(0, PR_strtod(utf8.get(), nullptr));
- }
- } else if (strcmp(aPref, PREF_USE_CUBEB) == 0) {
--#ifdef MOZ_WIDGET_GONK
-+#if defined(MOZ_WIDGET_GONK) || defined(__FreeBSD__) && __FreeBSD_version < 800097
- bool value = Preferences::GetBool(aPref, false);
- #else
- bool value = Preferences::GetBool(aPref, true);
diff --git a/www/firefox/files/patch-gfx-ots-include-opentype-sanitiser.h b/www/firefox/files/patch-gfx-ots-include-opentype-sanitiser.h
deleted file mode 100644
index 306756daa7e0..000000000000
--- a/www/firefox/files/patch-gfx-ots-include-opentype-sanitiser.h
+++ /dev/null
@@ -1,18 +0,0 @@
-diff --git gfx/ots/include/opentype-sanitiser.h gfx/ots/include/opentype-sanitiser.h
-index f42822e..1a5a699 100644
---- gfx/ots/include/opentype-sanitiser.h
-+++ gfx/ots/include/opentype-sanitiser.h
-@@ -44,6 +44,13 @@ typedef unsigned __int64 uint64_t;
- #include <stdint.h>
- #endif
-
-+#ifdef __FreeBSD__
-+# include <osreldate.h>
-+# if __FreeBSD_version < 800067
-+# include <sys/types.h> // for off_t
-+# endif
-+#endif
-+
- #include <algorithm> // for std::min
- #include <cassert>
- #include <cstddef>
diff --git a/www/firefox/files/patch-ipc-chromium-src-base-platform_thread_posix.cc b/www/firefox/files/patch-ipc-chromium-src-base-platform_thread_posix.cc
deleted file mode 100644
index a1e2dfb828f8..000000000000
--- a/www/firefox/files/patch-ipc-chromium-src-base-platform_thread_posix.cc
+++ /dev/null
@@ -1,16 +0,0 @@
---- ipc/chromium/src/base/platform_thread_posix.cc~
-+++ ipc/chromium/src/base/platform_thread_posix.cc
-@@ -16,7 +16,13 @@
- #include <sys/prctl.h>
- #elif defined(OS_FREEBSD)
- #include <sys/param.h>
-+#if __FreeBSD_version > 802500
- #include <sys/thr.h>
-+#else
-+_Pragma("GCC visibility push(default)")
-+extern "C" int thr_self(long *);
-+_Pragma("GCC visibility pop")
-+#endif
- #endif
-
- #if !defined(OS_MACOSX)
diff --git a/www/firefox/files/patch-js-src-js-confdefs.h.in b/www/firefox/files/patch-js-src-js-confdefs.h.in
deleted file mode 100644
index cb032237b2cc..000000000000
--- a/www/firefox/files/patch-js-src-js-confdefs.h.in
+++ /dev/null
@@ -1,10 +0,0 @@
---- js/src/js-confdefs.h.in~
-+++ js/src/js-confdefs.h.in
-@@ -12,6 +12,7 @@
- * C++ implementations should define these macros only when __STDC_LIMIT_MACROS
- * is defined before <stdint.h> is included. */
- #define __STDC_LIMIT_MACROS
-+#define __STDC_CONSTANT_MACROS
-
- #endif /* _JS_CONFDEFS_H_ */
-
diff --git a/www/firefox/files/patch-media-webrtc-trunk-src-modules-audio_device-main-source-linux-latebindingsymboltable_linux.cc b/www/firefox/files/patch-media-webrtc-trunk-src-modules-audio_device-main-source-linux-latebindingsymboltable_linux.cc
deleted file mode 100644
index 401aedb6ef8f..000000000000
--- a/www/firefox/files/patch-media-webrtc-trunk-src-modules-audio_device-main-source-linux-latebindingsymboltable_linux.cc
+++ /dev/null
@@ -1,37 +0,0 @@
---- media/webrtc/trunk/src/modules/audio_device/main/source/linux/latebindingsymboltable_linux.cc~
-+++ media/webrtc/trunk/src/modules/audio_device/main/source/linux/latebindingsymboltable_linux.cc
-@@ -31,6 +31,10 @@
- #include <dlfcn.h>
- #endif
-
-+#ifdef __FreeBSD__
-+#include <osreldate.h>
-+#endif
-+
- // TODO(grunell): Either put inside webrtc namespace or use webrtc:: instead.
- using namespace webrtc;
-
-@@ -38,7 +42,11 @@ namespace webrtc_adm_linux {
-
- inline static const char *GetDllError() {
- #ifdef WEBRTC_LINUX
-+#if __FreeBSD_version < 800505
-+ const char *err = dlerror();
-+#else
- char *err = dlerror();
-+#endif
- if (err) {
- return err;
- } else {
-@@ -78,7 +86,11 @@ static bool LoadSymbol(DllHandle handle,
- void **symbol) {
- #ifdef WEBRTC_LINUX
- *symbol = dlsym(handle, symbol_name);
-+#if __FreeBSD_version < 800505
-+ const char *err = dlerror();
-+#else
- char *err = dlerror();
-+#endif
- if (err) {
- WEBRTC_TRACE(kTraceError, kTraceAudioDevice, -1,
- "Error loading symbol %s : %d", symbol_name, err);
diff --git a/www/firefox/files/patch-media-webrtc-trunk-src-system_wrappers-source-spreadsortlib-spreadsort.hpp b/www/firefox/files/patch-media-webrtc-trunk-src-system_wrappers-source-spreadsortlib-spreadsort.hpp
index 922f913334c0..1d76d119c5a2 100644
--- a/www/firefox/files/patch-media-webrtc-trunk-src-system_wrappers-source-spreadsortlib-spreadsort.hpp
+++ b/www/firefox/files/patch-media-webrtc-trunk-src-system_wrappers-source-spreadsortlib-spreadsort.hpp
@@ -3,7 +3,7 @@
@@ -21,6 +21,13 @@ Scott McMurray
#include "constants.hpp"
#include <cstring>
-
+
+#ifdef __FreeBSD__
+# include <osreldate.h>
+# if __FreeBSD_version < 900506
@@ -13,4 +13,4 @@
+
namespace boost {
namespace detail {
- //This only works on unsigned data types
+ //This only works on unsigned data types
diff --git a/www/firefox/files/patch-media-webrtc-trunk-src-system_wrappers-source-thread_posix.cc b/www/firefox/files/patch-media-webrtc-trunk-src-system_wrappers-source-thread_posix.cc
deleted file mode 100644
index ad54b06424f4..000000000000
--- a/www/firefox/files/patch-media-webrtc-trunk-src-system_wrappers-source-thread_posix.cc
+++ /dev/null
@@ -1,16 +0,0 @@
---- media/webrtc/trunk/src/system_wrappers/source/thread_posix.cc~
-+++ media/webrtc/trunk/src/system_wrappers/source/thread_posix.cc
-@@ -62,7 +62,13 @@
- #include <lwp.h>
- #elif defined(__FreeBSD__)
- #include <sys/param.h>
-+#if __FreeBSD_version > 802500
- #include <sys/thr.h>
-+#else
-+_Pragma("GCC visibility push(default)")
-+extern "C" int thr_self(long *);
-+_Pragma("GCC visibility pop")
-+#endif
- #endif
-
- #if defined(WEBRTC_BSD) && !defined(__NetBSD__)
diff --git a/www/firefox/files/patch-python-psutil-psutil-_psutil_bsd.c b/www/firefox/files/patch-python-psutil-psutil-_psutil_bsd.c
deleted file mode 100644
index 3eddeeec9238..000000000000
--- a/www/firefox/files/patch-python-psutil-psutil-_psutil_bsd.c
+++ /dev/null
@@ -1,13 +0,0 @@
---- python/psutil/psutil/_psutil_bsd.c.orig 2012-08-16 23:07:37.000000000 +0800
-+++ python/psutil/psutil/_psutil_bsd.c 2012-09-27 14:50:20.843763756 +0800
-@@ -1376,8 +1376,10 @@
- strlcat(opts, ",noclusterr", sizeof(opts));
- if (flags & MNT_NOCLUSTERW)
- strlcat(opts, ",noclusterw", sizeof(opts));
-+#if __FreeBSD_version >= 800000
- if (flags & MNT_NFS4ACLS)
- strlcat(opts, ",nfs4acls", sizeof(opts));
-+#endif
-
- py_tuple = Py_BuildValue("(ssss)", fs[i].f_mntfromname, // device
- fs[i].f_mntonname, // mount point
diff --git a/www/firefox/files/patch-z-bug815916 b/www/firefox/files/patch-z-bug815916
deleted file mode 100644
index 8ca886e2e839..000000000000
--- a/www/firefox/files/patch-z-bug815916
+++ /dev/null
@@ -1,27 +0,0 @@
---- media/webrtc/signaling/test/Makefile.in~
-+++ media/webrtc/signaling/test/Makefile.in
-@@ -34,12 +34,24 @@ LIBS += \
- endif
- endif
-
-+ifdef MOZ_NATIVE_JPEG
-+LIBS += \
-+ $(MOZ_JPEG_LIBS) \
-+ $(NULL)
-+endif
-+
- ifdef MOZ_NATIVE_LIBVPX
- LIBS += \
- $(MOZ_LIBVPX_LIBS) \
- $(NULL)
- endif
-
-+ifndef MOZ_TREE_PIXMAN
-+LIBS += \
-+ $(MOZ_PIXMAN_LIBS) \
-+ $(NULL)
-+endif
-+
- ifeq (gtk2,$(MOZ_WIDGET_TOOLKIT))
- LIBS += \
- $(XLIBS) \
diff --git a/www/firefox/pkg-message b/www/firefox/pkg-message
index b282c9ce33a1..33841ae90f29 100644
--- a/www/firefox/pkg-message
+++ b/www/firefox/pkg-message
@@ -17,7 +17,7 @@ The SSH server on remote_host must allow pub key authentication.
Firefox and HTML5
Certain functions used to display HTML5 elements need the sem module
-on 7.x and 8.x releases.
+only on 8.x releases.
If your Firefox crashes with the following message while viewing a
HTML5 page: