diff options
author | flo <flo@FreeBSD.org> | 2013-04-04 04:27:48 +0800 |
---|---|---|
committer | flo <flo@FreeBSD.org> | 2013-04-04 04:27:48 +0800 |
commit | 0150240fa08cbc859bbd979041e4e48f4b7700db (patch) | |
tree | fc7673f01258f369254c78eaa2111a667c2fd1f7 /www/firefox | |
parent | 104fe6e6b31270527f5f6fc15ae0d04ab9452e3d (diff) | |
download | freebsd-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')
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: |