Bug 575946: Implement File.slice. r=khuey sr=biesi a=beltzner
authorJonas Sicking <jonas@sicking.cc>
Wed, 13 Oct 2010 16:25:33 -0700 (2010-10-13)
changeset 55459 1b3947ed93c6ee9b1c5cbfcfb057ea4d8d915ce2
parent 55458 0c9ae492cf5f51c9d16e7e224bf42f4b7a45e2c6
child 55460 3c762301b7194a643c2e1eadb69ff93d2a0f7b3d
push id16267
push usersicking@mozilla.com
push dateWed, 13 Oct 2010 23:26:39 +0000 (2010-10-13)
treeherdermozilla-central@1b3947ed93c6 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerskhuey, biesi, beltzner
bugs575946
milestone2.0b8pre
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 575946: Implement File.slice. r=khuey sr=biesi a=beltzner
content/base/public/nsDOMFile.h
content/base/public/nsIDOMFile.idl
content/base/public/nsIDOMFileReader.idl
content/base/src/nsDOMFile.cpp
content/base/src/nsDOMFileReader.cpp
content/base/src/nsDOMFileReader.h
content/base/src/nsFileDataProtocolHandler.cpp
content/base/src/nsFileDataProtocolHandler.h
content/base/src/nsFormData.cpp
content/base/src/nsFormData.h
content/base/test/Makefile.in
content/base/test/test_fileapi_slice.html
content/html/content/public/nsFormSubmission.h
content/html/content/src/nsFormSubmission.cpp
dom/base/nsDOMClassInfo.cpp
dom/base/nsDOMClassInfoClasses.h
dom/base/nsDOMClassInfoID.h
dom/base/nsGlobalWindow.cpp
dom/indexedDB/IDBEvents.cpp
dom/interfaces/base/nsIDOMWindow2.idl
netwerk/base/public/nsIFileStreams.idl
netwerk/base/public/nsNetUtil.h
netwerk/base/src/nsFileStreams.cpp
netwerk/base/src/nsFileStreams.h
netwerk/build/nsNetCID.h
netwerk/build/nsNetModule.cpp
netwerk/test/unit/data/image.png
netwerk/test/unit/test_file_partial_inputstream.js
--- a/content/base/public/nsDOMFile.h
+++ b/content/base/public/nsDOMFile.h
@@ -44,76 +44,136 @@
 #include "nsIDOMFileList.h"
 #include "nsIDOMFileError.h"
 #include "nsIInputStream.h"
 #include "nsCOMArray.h"
 #include "nsCOMPtr.h"
 #include "mozilla/AutoRestore.h"
 #include "nsString.h"
 #include "nsIXMLHttpRequest.h"
+#include "prmem.h"
+#include "nsAutoPtr.h"
 
 class nsIFile;
 class nsIInputStream;
+class nsIClassInfo;
 
 class nsDOMFile : public nsIDOMFile,
                   public nsIXHRSendable,
                   public nsICharsetDetectionObserver
 {
 public:
   NS_DECL_ISUPPORTS
+  NS_DECL_NSIDOMBLOB
   NS_DECL_NSIDOMFILE
   NS_DECL_NSIXHRSENDABLE
 
   nsDOMFile(nsIFile *aFile, const nsAString& aContentType)
     : mFile(aFile),
-      mContentType(aContentType)
+      mContentType(aContentType),
+      mIsFullFile(true)
   {}
 
   nsDOMFile(nsIFile *aFile)
-    : mFile(aFile)
+    : mFile(aFile),
+      mIsFullFile(true)
   {}
 
+  nsDOMFile(const nsDOMFile* aOther, PRUint64 aStart, PRUint64 aLength,
+            const nsAString& aContentType)
+    : mFile(aOther->mFile),
+      mStart(aOther->mIsFullFile ? aStart :
+                                   (aOther->mStart + aStart)),
+      mLength(aLength),
+      mContentType(aContentType),
+      mIsFullFile(false)
+  {
+    NS_ASSERTION(mFile, "must have file");
+    // Ensure non-null mContentType
+    mContentType.SetIsVoid(PR_FALSE);
+  }
+
   virtual ~nsDOMFile() {}
 
   // from nsICharsetDetectionObserver
   NS_IMETHOD Notify(const char *aCharset, nsDetectionConfident aConf);
 
-private:
+protected:
   nsCOMPtr<nsIFile> mFile;
+
+  // start and length in 
+  PRUint64 mStart;
+  PRUint64 mLength;
+
   nsString mContentType;
+  
+  bool mIsFullFile;
+
+  // Used during charset detection
   nsCString mCharset;
-
   nsresult GuessCharset(nsIInputStream *aStream,
                         nsACString &aCharset);
   nsresult ConvertStream(nsIInputStream *aStream, const char *aCharset,
                          nsAString &aResult);
 };
 
 class nsDOMMemoryFile : public nsDOMFile
 {
 public:
   nsDOMMemoryFile(void *aMemoryBuffer,
                   PRUint64 aLength,
                   const nsAString& aName,
                   const nsAString& aContentType)
     : nsDOMFile(nsnull, aContentType),
-      mInternalData(aMemoryBuffer), mLength(aLength), mName(aName)
-  { }
+      mDataOwner(new DataOwner(aMemoryBuffer)),
+      mName(aName)
+  {
+    mStart = 0;
+    mLength = aLength;
+  }
 
-  ~nsDOMMemoryFile();
+  nsDOMMemoryFile(const nsDOMMemoryFile* aOther, PRUint64 aStart,
+                  PRUint64 aLength, const nsAString& aContentType)
+    : nsDOMFile(nsnull, aContentType),
+      mDataOwner(aOther->mDataOwner)
+  {
+    NS_ASSERTION(mDataOwner && mDataOwner->mData, "must have data");
+
+    mIsFullFile = false;
+    mStart = aOther->mStart + aStart;
+    mLength = aLength;
+
+    // Ensure non-null mContentType
+    mContentType.SetIsVoid(PR_FALSE);
+  }
 
   NS_IMETHOD GetName(nsAString&);
   NS_IMETHOD GetSize(PRUint64*);
   NS_IMETHOD GetInternalStream(nsIInputStream**);
-  NS_IMETHOD GetMozFullPath(nsAString&);
   NS_IMETHOD GetMozFullPathInternal(nsAString&);
+  NS_IMETHOD Slice(PRUint64 aStart, PRUint64 aLength,
+                   const nsAString& aContentType, nsIDOMBlob **aBlob);
 
 protected:
-  void* mInternalData;
-  PRUint64 mLength;
+  class DataOwner {
+  public:
+    NS_INLINE_DECL_REFCOUNTING(DataOwner)
+    DataOwner(void* aMemoryBuffer)
+      : mData(aMemoryBuffer)
+    {
+    }
+    ~DataOwner() {
+      PR_Free(mData);
+    }
+    void* mData;
+  };
+
+  // Used when backed by a memory store
+  nsRefPtr<DataOwner> mDataOwner;
+
   nsString mName;
 };
 
 class nsDOMFileList : public nsIDOMFileList
 {
 public:
   NS_DECL_ISUPPORTS
   NS_DECL_NSIDOMFILELIST
@@ -158,17 +218,17 @@ public:
   nsDOMFileError(PRUint16 aErrorCode) : mCode(aErrorCode) {}
 
 private:
   PRUint16 mCode;
 };
 
 class NS_STACK_CLASS nsDOMFileInternalUrlHolder {
 public:
-  nsDOMFileInternalUrlHolder(nsIDOMFile* aFile, nsIPrincipal* aPrincipal
+  nsDOMFileInternalUrlHolder(nsIDOMBlob* aFile, nsIPrincipal* aPrincipal
                              MOZILLA_GUARD_OBJECT_NOTIFIER_PARAM);
   ~nsDOMFileInternalUrlHolder();
   nsAutoString mUrl;
 private:
   MOZILLA_DECL_USE_GUARD_OBJECT_NOTIFIER
 };
 
 #endif
--- a/content/base/public/nsIDOMFile.idl
+++ b/content/base/public/nsIDOMFile.idl
@@ -36,32 +36,43 @@
  * ***** END LICENSE BLOCK ***** */
 
 #include "domstubs.idl"
 
 interface nsIDOMFileError;
 interface nsIInputStream;
 interface nsIURI;
 interface nsIPrincipal;
+interface nsIDOMBlob;
 
-[scriptable, uuid(414e5d40-c831-4b28-acdc-8ff02d1a317d)]
-interface nsIDOMFile : nsISupports
+[scriptable, uuid(5822776a-049c-4de7-adb6-dd9efc39d082)]
+interface nsIDOMBlob : nsISupports
 {
-  //fileName and fileSize are now deprecated attributes
-  readonly attribute DOMString fileName;
-  readonly attribute unsigned long long fileSize;
-
-  readonly attribute DOMString name;
-  readonly attribute DOMString mozFullPath;
   readonly attribute unsigned long long size;
   readonly attribute DOMString type;
 
-  DOMString getAsText(in DOMString encoding); // raises(FileException) on retrieval
-  DOMString getAsDataURL();             // raises(FileException) on retrieval
-  DOMString getAsBinary();              // raises(FileException) on retrieval
+  nsIDOMBlob slice(in unsigned long long start,
+                   in unsigned long long length,
+                   [optional] in DOMString contentType);
 
   [noscript] readonly attribute nsIInputStream internalStream;
   // The caller is responsible for releasing the internalUrl from the
   // moz-filedata: protocol handler
   [noscript] DOMString getInternalUrl(in nsIPrincipal principal);
+};
+
+[scriptable, uuid(ae1405b0-e411-481e-9606-b29ec7982687)]
+interface nsIDOMFile : nsIDOMBlob
+{
+  readonly attribute DOMString name;
+  readonly attribute DOMString mozFullPath;
+
   // This performs no security checks!
   [noscript] readonly attribute DOMString mozFullPathInternal;
+
+  // These are all deprecated and not in spec. Will be removed in a future
+  // release
+  readonly attribute DOMString fileName;
+  readonly attribute unsigned long long fileSize;
+  DOMString getAsText(in DOMString encoding); // raises(FileException) on retrieval
+  DOMString getAsDataURL();             // raises(FileException) on retrieval
+  DOMString getAsBinary();              // raises(FileException) on retrieval
 };
--- a/content/base/public/nsIDOMFileReader.idl
+++ b/content/base/public/nsIDOMFileReader.idl
@@ -33,25 +33,25 @@
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 #include "nsIDOMEventTarget.idl"
 
 interface nsIDOMEventListener;
-interface nsIDOMFile;
+interface nsIDOMBlob;
 interface nsIDOMFileError;
 
-[scriptable, uuid(5db0ce80-de44-40c0-a346-e28aac4aa978)]
+[scriptable, uuid(71c32f16-ea5d-415e-9303-0db981c17bed)]
 interface nsIDOMFileReader : nsISupports 
 {
-  void readAsBinaryString(in nsIDOMFile filedata);
-  void readAsText(in nsIDOMFile filedata, [optional] in DOMString encoding);
-  void readAsDataURL(in nsIDOMFile file);
+  void readAsBinaryString(in nsIDOMBlob filedata);
+  void readAsText(in nsIDOMBlob filedata, [optional] in DOMString encoding);
+  void readAsDataURL(in nsIDOMBlob file);
 
   void abort();
 
   const unsigned short EMPTY = 0;
   const unsigned short LOADING = 1;
   const unsigned short DONE = 2;
   readonly attribute unsigned short readyState;
 
--- a/content/base/src/nsDOMFile.cpp
+++ b/content/base/src/nsDOMFile.cpp
@@ -57,30 +57,36 @@
 #include "nsISeekableStream.h"
 #include "nsIUnicharInputStream.h"
 #include "nsIUnicodeDecoder.h"
 #include "nsNetCID.h"
 #include "nsNetUtil.h"
 #include "nsIUUIDGenerator.h"
 #include "nsFileDataProtocolHandler.h"
 #include "nsStringStream.h"
+#include "CheckedInt.h"
 
 #include "plbase64.h"
 #include "prmem.h"
 
+using namespace mozilla;
+
 // nsDOMFile implementation
 
 DOMCI_DATA(File, nsDOMFile)
+DOMCI_DATA(Blob, nsDOMFile)
 
 NS_INTERFACE_MAP_BEGIN(nsDOMFile)
   NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMFile)
-  NS_INTERFACE_MAP_ENTRY(nsIDOMFile)
+  NS_INTERFACE_MAP_ENTRY(nsIDOMBlob)
+  NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIDOMFile, mIsFullFile)
   NS_INTERFACE_MAP_ENTRY(nsIXHRSendable)
   NS_INTERFACE_MAP_ENTRY(nsICharsetDetectionObserver)
-  NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(File)
+  NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO_CONDITIONAL(File, mIsFullFile)
+  NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO_CONDITIONAL(Blob, !mIsFullFile)
 NS_INTERFACE_MAP_END
 
 NS_IMPL_ADDREF(nsDOMFile)
 NS_IMPL_RELEASE(nsDOMFile)
 
 static nsresult
 DOMFileResult(nsresult rv)
 {
@@ -105,55 +111,63 @@ NS_IMETHODIMP
 nsDOMFile::GetFileSize(PRUint64 *aFileSize)
 {
   return GetSize(aFileSize);
 }
 
 NS_IMETHODIMP
 nsDOMFile::GetName(nsAString &aFileName)
 {
+  NS_ASSERTION(mIsFullFile, "Should only be called on files");
   return mFile->GetLeafName(aFileName);
 }
 
 NS_IMETHODIMP
 nsDOMFile::GetMozFullPath(nsAString &aFileName)
 {
+  NS_ASSERTION(mIsFullFile, "Should only be called on files");
   if (nsContentUtils::IsCallerTrustedForCapability("UniversalFileRead")) {
     return GetMozFullPathInternal(aFileName);
   }
   aFileName.Truncate();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsDOMFile::GetMozFullPathInternal(nsAString &aFilename)
 {
+  NS_ASSERTION(mIsFullFile, "Should only be called on files");
   return mFile->GetPath(aFilename);
 }
 
 NS_IMETHODIMP
 nsDOMFile::GetSize(PRUint64 *aFileSize)
 {
-  PRInt64 fileSize;
-  nsresult rv = mFile->GetFileSize(&fileSize);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  if (fileSize < 0) {
-    return NS_ERROR_FAILURE;
+  if (mIsFullFile) {
+    PRInt64 fileSize;
+    nsresult rv = mFile->GetFileSize(&fileSize);
+    NS_ENSURE_SUCCESS(rv, rv);
+  
+    if (fileSize < 0) {
+      return NS_ERROR_FAILURE;
+    }
+  
+    *aFileSize = fileSize;
   }
-
-  *aFileSize = fileSize;
+  else {
+    *aFileSize = mLength;
+  }
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsDOMFile::GetType(nsAString &aType)
 {
-  if (!mContentType.Length()) {
+  if (mContentType.IsEmpty() && mFile && mIsFullFile) {
     nsresult rv;
     nsCOMPtr<nsIMIMEService> mimeService =
       do_GetService(NS_MIMESERVICE_CONTRACTID, &rv);
     NS_ENSURE_SUCCESS(rv, rv);
 
     nsCAutoString mimeType;
     rv = mimeService->GetTypeFromFile(mFile, mimeType);
     if (NS_FAILED(rv)) {
@@ -164,22 +178,59 @@ nsDOMFile::GetType(nsAString &aType)
     AppendUTF8toUTF16(mimeType, mContentType);
   }
 
   aType = mContentType;
 
   return NS_OK;
 }
 
+// Makes sure that aStart and aStart + aLength is less then or equal to aSize
+void
+ClampToSize(PRUint64 aSize, PRUint64& aStart, PRUint64& aLength)
+{
+  if (aStart > aSize) {
+    aStart = aLength = 0;
+  }
+  CheckedUint64 endOffset = aStart;
+  endOffset += aLength;
+  if (!endOffset.valid() || endOffset.value() > aSize) {
+    aLength = aSize - aStart;
+  }
+}
+
+NS_IMETHODIMP
+nsDOMFile::Slice(PRUint64 aStart, PRUint64 aLength,
+                 const nsAString& aContentType, nsIDOMBlob **aBlob)
+{
+  *aBlob = nsnull;
+
+  // Truncate aLength and aStart so that we stay within this file.
+  PRUint64 thisLength;
+  nsresult rv = GetSize(&thisLength);
+  NS_ENSURE_SUCCESS(rv, rv);
+  ClampToSize(thisLength, aStart, aLength);
+  
+  // Create the new file
+  NS_ADDREF(*aBlob = new nsDOMFile(this, aStart, aLength, aContentType));
+  
+  return NS_OK;
+}
+
 NS_IMETHODIMP
 nsDOMFile::GetInternalStream(nsIInputStream **aStream)
 {
-  return NS_NewLocalFileInputStream(aStream, mFile, -1, -1,
-                                    nsIFileInputStream::CLOSE_ON_EOF |
-                                    nsIFileInputStream::REOPEN_ON_REWIND);
+  return mIsFullFile ?
+    NS_NewLocalFileInputStream(aStream, mFile, -1, -1,
+                               nsIFileInputStream::CLOSE_ON_EOF |
+                               nsIFileInputStream::REOPEN_ON_REWIND) :
+    NS_NewPartialLocalFileInputStream(aStream, mFile, mStart, mLength,
+                                      -1, -1,
+                                      nsIFileInputStream::CLOSE_ON_EOF |
+                                      nsIFileInputStream::REOPEN_ON_REWIND);
 }
 
 NS_IMETHODIMP
 nsDOMFile::GetInternalUrl(nsIPrincipal* aPrincipal, nsAString& aURL)
 {
   NS_ENSURE_STATE(aPrincipal);
 
   nsresult rv;
@@ -476,57 +527,64 @@ nsDOMFile::ConvertStream(nsIInputStream 
     aResult.Append(result);
     rv = unicharStream->ReadString(8192, result, &numChars);
   }
 
   return rv;
 }
 
 // nsDOMMemoryFile Implementation
-nsDOMMemoryFile::~nsDOMMemoryFile()
-{
-  PR_Free(mInternalData);
-}
-
 NS_IMETHODIMP
 nsDOMMemoryFile::GetName(nsAString &aFileName)
 {
+  NS_ASSERTION(mIsFullFile, "Should only be called on files");
   aFileName = mName;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsDOMMemoryFile::GetSize(PRUint64 *aFileSize)
 {
   *aFileSize = mLength;
   return NS_OK;
 }
 
 NS_IMETHODIMP
+nsDOMMemoryFile::Slice(PRUint64 aStart, PRUint64 aLength,
+                       const nsAString& aContentType, nsIDOMBlob **aBlob)
+{
+  *aBlob = nsnull;
+
+  // Truncate aLength and aStart so that we stay within this file.
+  ClampToSize(mLength, aStart, aLength);
+
+  // Create the new file
+  NS_ADDREF(*aBlob = new nsDOMMemoryFile(this, aStart, aLength, aContentType));
+  
+  return NS_OK;
+}
+
+NS_IMETHODIMP
 nsDOMMemoryFile::GetInternalStream(nsIInputStream **aStream)
 {
   if (mLength > PR_INT32_MAX)
     return NS_ERROR_FAILURE;
 
-  PRInt32 l = mLength;
-
-  return NS_NewByteInputStream(aStream, (const char*)mInternalData, l);
-}
-
-NS_IMETHODIMP
-nsDOMMemoryFile::GetMozFullPath(nsAString &aFileName)
-{
-  aFileName.Truncate();
-  return NS_OK;
+  return NS_NewByteInputStream(aStream,
+                               static_cast<const char*>(mDataOwner->mData) +
+                               mStart,
+                               (PRInt32)mLength);
 }
 
 NS_IMETHODIMP
 nsDOMMemoryFile::GetMozFullPathInternal(nsAString &aFilename)
 {
-  return GetName(aFilename);
+  NS_ASSERTION(mIsFullFile, "Should only be called on files");
+  aFilename.Truncate();
+  return NS_OK;
 }
 
 // nsDOMFileList implementation
 
 DOMCI_DATA(FileList, nsDOMFileList)
 
 NS_INTERFACE_MAP_BEGIN(nsDOMFileList)
   NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMFileList)
@@ -568,17 +626,17 @@ NS_IMPL_RELEASE(nsDOMFileError)
 
 NS_IMETHODIMP
 nsDOMFileError::GetCode(PRUint16* aCode)
 {
   *aCode = mCode;
   return NS_OK;
 }
 
-nsDOMFileInternalUrlHolder::nsDOMFileInternalUrlHolder(nsIDOMFile* aFile,
+nsDOMFileInternalUrlHolder::nsDOMFileInternalUrlHolder(nsIDOMBlob* aFile,
                                                        nsIPrincipal* aPrincipal
                                                        MOZILLA_GUARD_OBJECT_NOTIFIER_PARAM_IN_IMPL) {
   MOZILLA_GUARD_OBJECT_NOTIFIER_INIT;
   aFile->GetInternalUrl(aPrincipal, mUrl);
 }
  
 nsDOMFileInternalUrlHolder::~nsDOMFileInternalUrlHolder() {
   if (!mUrl.IsEmpty()) {
--- a/content/base/src/nsDOMFileReader.cpp
+++ b/content/base/src/nsDOMFileReader.cpp
@@ -259,30 +259,30 @@ nsDOMFileReader::GetResult(nsAString& aR
 NS_IMETHODIMP
 nsDOMFileReader::GetError(nsIDOMFileError** aError)
 {
   NS_IF_ADDREF(*aError = mError);
   return NS_OK;
 }
 
 NS_IMETHODIMP
-nsDOMFileReader::ReadAsBinaryString(nsIDOMFile* aFile)
+nsDOMFileReader::ReadAsBinaryString(nsIDOMBlob* aFile)
 {
   return ReadFileContent(aFile, EmptyString(), FILE_AS_BINARY);
 }
 
 NS_IMETHODIMP
-nsDOMFileReader::ReadAsText(nsIDOMFile* aFile,
+nsDOMFileReader::ReadAsText(nsIDOMBlob* aFile,
                             const nsAString &aCharset)
 {
   return ReadFileContent(aFile, aCharset, FILE_AS_TEXT);
 }
 
 NS_IMETHODIMP
-nsDOMFileReader::ReadAsDataURL(nsIDOMFile* aFile)
+nsDOMFileReader::ReadAsDataURL(nsIDOMBlob* aFile)
 {
   return ReadFileContent(aFile, EmptyString(), FILE_AS_DATAURL);
 }
 
 NS_IMETHODIMP
 nsDOMFileReader::Abort()
 {
   if (mReadyState != nsIDOMFileReader::LOADING)
@@ -478,17 +478,17 @@ nsDOMFileReader::OnStopRequest(nsIReques
   DispatchProgressEvent(NS_LITERAL_STRING(LOADEND_STR));
 
   return NS_OK;
 }
 
 // Helper methods
 
 nsresult
-nsDOMFileReader::ReadFileContent(nsIDOMFile* aFile,
+nsDOMFileReader::ReadFileContent(nsIDOMBlob* aFile,
                                  const nsAString &aCharset,
                                  eDataFormat aDataFormat)
 {
   nsresult rv;
   NS_ENSURE_TRUE(aFile, NS_ERROR_NULL_POINTER);
 
   //Implicit abort to clear any other activity going on
   Abort();
@@ -604,17 +604,17 @@ nsDOMFileReader::GetAsText(const nsACStr
   NS_ENSURE_SUCCESS(rv, rv);
 
   rv = ConvertStream(aFileData, aDataLen, charset.get(), aResult);
 
   return NS_OK;
 }
 
 nsresult
-nsDOMFileReader::GetAsDataURL(nsIDOMFile *aFile,
+nsDOMFileReader::GetAsDataURL(nsIDOMBlob *aFile,
                               const char *aFileData,
                               PRUint32 aDataLen,
                               nsAString& aResult)
 {
   aResult.AssignLiteral("data:");
 
   nsresult rv;
   nsString contentType;
--- a/content/base/src/nsDOMFileReader.h
+++ b/content/base/src/nsDOMFileReader.h
@@ -112,33 +112,33 @@ public:
 
 protected:
   enum eDataFormat {
     FILE_AS_BINARY,
     FILE_AS_TEXT,
     FILE_AS_DATAURL
   };
 
-  nsresult ReadFileContent(nsIDOMFile *aFile, const nsAString &aCharset, eDataFormat aDataFormat); 
+  nsresult ReadFileContent(nsIDOMBlob *aFile, const nsAString &aCharset, eDataFormat aDataFormat); 
   nsresult GetAsText(const nsACString &aCharset,
                      const char *aFileData, PRUint32 aDataLen, nsAString &aResult);
-  nsresult GetAsDataURL(nsIDOMFile *aFile, const char *aFileData, PRUint32 aDataLen, nsAString &aResult); 
+  nsresult GetAsDataURL(nsIDOMBlob *aFile, const char *aFileData, PRUint32 aDataLen, nsAString &aResult); 
   nsresult GuessCharset(const char *aFileData, PRUint32 aDataLen, nsACString &aCharset); 
   nsresult ConvertStream(const char *aFileData, PRUint32 aDataLen, const char *aCharset, nsAString &aResult); 
   void DispatchError(nsresult rv);
   void StartProgressEventTimer();
 
   void FreeFileData() {
     PR_Free(mFileData);
     mFileData = nsnull;
     mDataLen = 0;
   }
 
   char *mFileData;
-  nsCOMPtr<nsIDOMFile> mFile;
+  nsCOMPtr<nsIDOMBlob> mFile;
   nsCString mCharset;
   PRUint32 mDataLen;
 
   eDataFormat mDataFormat;
 
   nsString mResult;
   PRUint16 mReadyState;
 
--- a/content/base/src/nsFileDataProtocolHandler.cpp
+++ b/content/base/src/nsFileDataProtocolHandler.cpp
@@ -50,25 +50,25 @@
 #include "nsIProgrammingLanguage.h"
 
 static NS_DEFINE_CID(kSimpleURICID, NS_SIMPLEURI_CID);
 
 // -----------------------------------------------------------------------
 // Hash table
 struct FileDataInfo
 {
-  nsCOMPtr<nsIDOMFile> mFile;
+  nsCOMPtr<nsIDOMBlob> mFile;
   nsCOMPtr<nsIPrincipal> mPrincipal;
 };
 
 static nsClassHashtable<nsCStringHashKey, FileDataInfo>* gFileDataTable;
 
 void
 nsFileDataProtocolHandler::AddFileDataEntry(nsACString& aUri,
-					    nsIDOMFile* aFile,
+					    nsIDOMBlob* aFile,
                                             nsIPrincipal* aPrincipal)
 {
   if (!gFileDataTable) {
     gFileDataTable = new nsClassHashtable<nsCStringHashKey, FileDataInfo>;
     gFileDataTable->Init();
   }
 
   FileDataInfo* info = new FileDataInfo;
--- a/content/base/src/nsFileDataProtocolHandler.h
+++ b/content/base/src/nsFileDataProtocolHandler.h
@@ -36,34 +36,34 @@
 
 #ifndef nsFileDataProtocolHandler_h___
 #define nsFileDataProtocolHandler_h___
 
 #include "nsIProtocolHandler.h"
 
 #define FILEDATA_SCHEME "moz-filedata"
 
-class nsIDOMFile;
+class nsIDOMBlob;
 class nsIPrincipal;
 
 class nsFileDataProtocolHandler : public nsIProtocolHandler
 {
 public:
   NS_DECL_ISUPPORTS
 
   // nsIProtocolHandler methods:
   NS_DECL_NSIPROTOCOLHANDLER
 
   // nsFileDataProtocolHandler methods:
   nsFileDataProtocolHandler() {}
   virtual ~nsFileDataProtocolHandler() {}
 
   // Methods for managing uri->file mapping
   static void AddFileDataEntry(nsACString& aUri,
-			       nsIDOMFile* aFile,
+			       nsIDOMBlob* aFile,
                                nsIPrincipal* aPrincipal);
   static void RemoveFileDataEntry(nsACString& aUri);
   
 };
 
 #define NS_FILEDATAPROTOCOLHANDLER_CID \
 { 0xb43964aa, 0xa078, 0x44b2, \
   { 0xb0, 0x6b, 0xfd, 0x4d, 0x1b, 0x17, 0x2e, 0x66 } }
--- a/content/base/src/nsFormData.cpp
+++ b/content/base/src/nsFormData.cpp
@@ -80,21 +80,21 @@ nsFormData::AddNameValuePair(const nsASt
   data->stringValue = aValue;
   data->valueIsFile = PR_FALSE;
 
   return NS_OK;
 }
 
 nsresult
 nsFormData::AddNameFilePair(const nsAString& aName,
-                            nsIDOMFile* aFile)
+                            nsIDOMBlob* aBlob)
 {
   FormDataTuple* data = mFormData.AppendElement();
   data->name = aName;
-  data->fileValue = aFile;
+  data->fileValue = aBlob;
   data->valueIsFile = PR_TRUE;
 
   return NS_OK;
 }
 
 // -------------------------------------------------------------------------
 // nsIDOMFormData
 
@@ -109,19 +109,19 @@ nsFormData::Append(const nsAString& aNam
       dataType == nsIDataType::VTYPE_INTERFACE_IS) {
     nsCOMPtr<nsISupports> supports;
     nsID *iid;
     rv = aValue->GetAsInterface(&iid, getter_AddRefs(supports));
     NS_ENSURE_SUCCESS(rv, rv);
 
     nsMemory::Free(iid);
 
-    nsCOMPtr<nsIDOMFile> domFile = do_QueryInterface(supports);
-    if (domFile) {
-      return AddNameFilePair(aName, domFile);
+    nsCOMPtr<nsIDOMBlob> domBlob = do_QueryInterface(supports);
+    if (domBlob) {
+      return AddNameFilePair(aName, domBlob);
     }
   }
 
   PRUnichar* stringData = nsnull;
   PRUint32 stringLen = 0;
   rv = aValue->GetAsWStringWithSize(&stringLen, &stringData);
   NS_ENSURE_SUCCESS(rv, rv);
 
--- a/content/base/src/nsFormData.h
+++ b/content/base/src/nsFormData.h
@@ -58,25 +58,25 @@ public:
   NS_DECL_NSIXHRSENDABLE
 
   // nsFormSubmission
   virtual nsresult GetEncodedSubmission(nsIURI* aURI,
                                         nsIInputStream** aPostDataStream);
   virtual nsresult AddNameValuePair(const nsAString& aName,
                                     const nsAString& aValue);
   virtual nsresult AddNameFilePair(const nsAString& aName,
-                                   nsIDOMFile* aFile);
+                                   nsIDOMBlob* aBlob);
 
   NS_IMETHOD Initialize(nsISupports* aOwner, JSContext* aCx, JSObject* aObj,
                         PRUint32 aArgc, jsval* aArgv);
 private:
   struct FormDataTuple
   {
     nsString name;
     nsString stringValue;
-    nsCOMPtr<nsIDOMFile> fileValue;
+    nsCOMPtr<nsIDOMBlob> fileValue;
     PRBool valueIsFile;
   };
   
   nsTArray<FormDataTuple> mFormData;
 };
 
 #endif // nsFormData_h__
--- a/content/base/test/Makefile.in
+++ b/content/base/test/Makefile.in
@@ -143,16 +143,17 @@ include $(topsrcdir)/config/rules.mk
 		file_bug326337_multipart.txt \
 		file_bug326337_multipart.txt^headers^ \
 		test_bug333198.html \
 		test_bug402150.html \
 		test_bug402150.html^headers^ \
 		test_bug401662.html \
 		test_bug403852.html \
 		test_fileapi.html \
+		test_fileapi_slice.html \
 		test_bug403868.xml \
 		test_bug405182.html \
 		test_bug403841.html \
 		test_bug409380.html \
 		test_bug410229.html \
 		test_bug413974.html \
 		test_bug415860.html \
 		test_bug414190.html \
new file mode 100644
--- /dev/null
+++ b/content/base/test/test_fileapi_slice.html
@@ -0,0 +1,405 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=575946
+-->
+  <title>Test for Bug 575946</title>
+  <script type="text/javascript" src="/MochiKit/packed.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=575946">Mozilla Bug 575946</a>
+<p id="display">
+  <canvas id=canvas width=1000 height=1000 hidden></canvas>
+  <canvas id=testcanvas hidden></canvas>
+  <input id="fileList" type="file"></input>
+</p>
+<div id="content" style="display: none">
+</div>
+
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var fileNum = 1;
+var testRanCounter = 0;
+var expectedTestCount = 0;
+SimpleTest.waitForExplicitFinish();
+
+// Create files containing data we'll test with. We'll want long
+// strings to ensure they span multiple buffers while loading
+
+// Create a decent-sized image
+cx = $("canvas").getContext('2d');
+var s = cx.canvas.width;
+var grad = cx.createLinearGradient(0, 0, s-1, s-1);
+for (i = 0; i < 0.95; i += .1) {
+  grad.addColorStop(i, "white");
+  grad.addColorStop(i + .05, "black");
+}
+grad.addColorStop(1, "white");
+cx.fillStyle = grad;
+cx.fillRect(0, 0, s-1, s-1);
+cx.fillStyle = "rgba(200, 0, 0, 0.9)";
+cx.fillRect(.1 * s, .1 * s, .7 * s, .7 * s);
+cx.strokeStyle = "rgba(0, 0, 130, 0.5)";
+cx.lineWidth = .14 * s;
+cx.beginPath();
+cx.arc(.6 * s, .6 * s, .3 * s, 0, Math.PI*2, true);
+cx.stroke();
+cx.closePath();
+cx.fillStyle = "rgb(0, 255, 0)";
+cx.beginPath();
+cx.arc(.1 * s, .8 * s, .1 * s, 0, Math.PI*2, true);
+cx.fill();
+cx.closePath();
+
+
+var fileData =
+  atob(cx.canvas.toDataURL("image/png").substring("data:text/png;base64,".length + 1));
+var memFile = cx.canvas.mozGetAsFile("image/png");
+var fileFile = createFileWithData(fileData);
+var size = fileData.length;
+
+// This might fail if we dramatically improve the png encoder. If that happens
+// please increase the complexity or size of the image generated above to ensure
+// that we're testing with files that are large enough.
+ok(size > 65536, "test data sufficiently large");
+
+
+// Test that basic properties work
+function testBasics(file, size, type) {
+  is(file.type, type, "mozGetAsFile type");
+  is(file.size, size, "file is correct size");
+  ok(file instanceof File, "file is a File");
+  ok(file instanceof Blob, "file is also a Blob");
+  
+  var slice = file.slice(0, size);
+  is(slice.type, "", "full-size type");
+  is(slice.size, size, "full-size size");
+  ok(slice instanceof Blob, "slice is a Blob");
+  ok(!(slice instanceof File), "slice is not a File");
+  
+  slice = file.slice(0, 1234);
+  is(slice.type, "", "sized type");
+  is(slice.size, 1234, "sized size");
+  ok(slice instanceof Blob, "slice is a Blob");
+  ok(!(slice instanceof File), "slice is not a File");
+  
+  slice = file.slice(size-500, 1000);
+  is(slice.type, "", "end-sized type");
+  is(slice.size, 500, "end-sized size");
+  
+  slice = file.slice(size+500, 1000);
+  is(slice.type, "", "sized type");
+  is(slice.size, 0, "sized size");
+
+  slice = file.slice(0, 0);
+  is(slice.type, "", "sized type");
+  is(slice.size, 0, "sized size");
+
+  slice = file.slice(1000, 0);
+  is(slice.type, "", "sized type");
+  is(slice.size, 0, "sized size");
+  
+  slice = file.slice(0, size, "foo/bar");
+  is(slice.type, "foo/bar", "full-size foo/bar type");
+  is(slice.size, size, "full-size foo/bar size");
+
+  slice = file.slice(0, 5432, "foo/bar");
+  is(slice.type, "foo/bar", "sized foo/bar type");
+  is(slice.size, 5432, "sized foo/bar size");
+  
+  is(slice.slice(0, 10).type, "", "slice-slice type");
+  is(slice.slice(0, 10).size, 10, "slice-slice size");
+  is(slice.slice(0, 10, "hello/world").type, "hello/world", "slice-slice hello/world type");
+  is(slice.slice(0, 10, "hello/world").size, 10, "slice-slice hello/world type");
+}
+
+testBasics(memFile, size, "image/png");
+testBasics(fileFile, size, "");
+
+
+// Test reading various slices
+
+// Full file
+testFile(memFile, fileData, "mem file");
+testFile(fileFile, fileData, "file file");
+
+// Simple slice
+testFile(memFile.slice(0, 33000), fileData.substr(0, 33000), "mem file slice");
+testFile(fileFile.slice(0, 33000), fileData.substr(0, 33000), "file file slice");
+
+// Simple slice not starting at beginning
+testFile(memFile.slice(1000, 33000), fileData.substr(1000, 33000), "mem file slice starting at non-zero");
+testFile(fileFile.slice(1000, 33000), fileData.substr(1000, 33000), "file file slice starting at non-zero");
+
+// Slice of slice
+var memSlice = memFile.slice(0, 40000);
+var fileSlice = fileFile.slice(0, 40000);
+testFile(memSlice.slice(5000, 37000), fileData.substr(5000, 35000), "mem file slice slice");
+testFile(fileSlice.slice(5000, 37000), fileData.substr(5000, 35000), "file file slice slice");
+
+// ...of slice of slice
+memSlice = memSlice.slice(5000, 37000).slice(400, 300);
+fileSlice = fileSlice.slice(5000, 37000).slice(400, 300);
+gc();
+testFile(memSlice, fileData.substr(5400, 300), "mem file slice slice slice");
+testFile(fileSlice, fileData.substr(5400, 300), "file file slice slice slice");
+
+// empty slice
+testFile(memFile.slice(4711, 0), "", "mem file empty slice");
+testFile(fileFile.slice(4711, 0), "", "file file empty slice");
+testFile(memFile.slice(0, 0), "", "mem file empty slice");
+testFile(fileFile.slice(0, 0), "", "file file empty slice");
+
+// slice at end
+testFile(memFile.slice(size-1000, 1000), fileData.substr(size-1000, 1000), "mem file slice at end");
+testFile(fileFile.slice(size-1000, 1000), fileData.substr(size-1000, 1000), "file file slice at end");
+
+// slice across end
+testFile(memFile.slice(size-500, 1000), fileData.substr(size-500, 500), "mem file slice across end");
+testFile(fileFile.slice(size-500, 1000), fileData.substr(size-500, 500), "file file slice across end");
+
+// slice past end
+testFile(memFile.slice(size, 1000), "", "mem file slice past end");
+testFile(fileFile.slice(size, 1000), "", "file file slice past end");
+testFile(memFile.slice(size + 1000, 1000), "", "mem file slice past end");
+testFile(fileFile.slice(size + 1000, 1000), "", "file file slice past end");
+
+
+// Try loading directly from slice into an image
+var testBinaryData = "";
+for (var i = 0; i < 256; i++) {
+  testBinaryData += String.fromCharCode(i);
+}
+while (testBinaryData.length < 20000) {
+  testBinaryData += testBinaryData;
+}
+function imageLoadHandler(event) {
+  var origcanvas = $("canvas");
+  var testcanvas = $("testcanvas");
+  var image = event.target;
+  is(image.naturalWidth, origcanvas.width, "width correct");
+  is(image.naturalHeight, origcanvas.height, "height correct");
+
+  testcanvas.width = origcanvas.width;
+  testcanvas.height = origcanvas.height;
+  testcanvas.getContext("2d").drawImage(image, 0, 0);
+  is(testcanvas.toDataURL("image/png"), origcanvas.toDataURL("image/png"),
+     "correct image data");
+
+  testHasRun();
+}
+
+// image in the middle
+var imgfile = createFileWithData(testBinaryData + fileData + testBinaryData);
+is(imgfile.size, size + testBinaryData.length * 2, "correct file size");
+var img = new Image;
+img.src = createBlobURL(imgfile.slice(testBinaryData.length, size));
+img.onload = imageLoadHandler;
+expectedTestCount++;
+
+// image at start
+var imgfile = createFileWithData(fileData + testBinaryData);
+is(imgfile.size, size + testBinaryData.length, "correct file size");
+var img = new Image;
+img.src = createBlobURL(imgfile.slice(0, size));
+img.onload = imageLoadHandler;
+expectedTestCount++;
+
+// image at end
+var imgfile = createFileWithData(testBinaryData + fileData);
+is(imgfile.size, size + testBinaryData.length, "correct file size");
+var img = new Image;
+img.src = createBlobURL(imgfile.slice(testBinaryData.length, size));
+img.onload = imageLoadHandler;
+expectedTestCount++;
+
+// image past end
+var imgfile = createFileWithData(testBinaryData + fileData);
+is(imgfile.size, size + testBinaryData.length, "correct file size");
+var img = new Image;
+img.src = createBlobURL(imgfile.slice(testBinaryData.length, size + 1000));
+img.onload = imageLoadHandler;
+expectedTestCount++;
+
+
+// Utility functions
+function testFile(file, contents, test) {
+  // Load file using FileReader
+  var r = new FileReader();
+  r.onload = getFileReaderLoadHandler(contents, contents.length, "FileReader.readAsBinaryString of " + test);
+  r.readAsBinaryString(file);
+  expectedTestCount++;
+
+  // Load file using createBlobURL and XMLHttpRequest
+  var xhr = new XMLHttpRequest;
+  xhr.open("GET", createBlobURL(file));
+  xhr.onload = getXHRLoadHandler(contents, contents.length, false,
+                                 "XMLHttpRequest load of " + test);
+  xhr.overrideMimeType('text/plain; charset=x-user-defined');
+  xhr.send();
+  expectedTestCount++;
+
+  // Send file to server using FormData and XMLHttpRequest
+  xhr = new XMLHttpRequest();
+  xhr.onload = function(event) {
+    checkMPSubmission(JSON.parse(event.target.responseText),
+                      [{ name: "hello", value: "world"},
+                       { name: "myfile",
+                         value: contents,
+                         fileName: file.name || "",
+                         contentType: file.type || "application/octet-stream" }]);
+    testHasRun();
+  }
+  xhr.open("POST", "../../html/content/test/form_submit_server.sjs");
+  var fd = new FormData;
+  fd.append("hello", "world");
+  fd.append("myfile", file);
+  xhr.send(fd);
+  expectedTestCount++;
+
+  // Send file to server using plain XMLHttpRequest
+  var xhr = new XMLHttpRequest;
+  xhr.open("POST", "file_XHRSendData.sjs");
+  xhr.onload = function (event) {
+    is(event.target.getResponseHeader("Result-Content-Type"),
+       file.type ? file.type : null,
+       "request content-type in XMLHttpRequest send of " + test);
+    is(event.target.getResponseHeader("Result-Content-Length"),
+       file.size,
+       "request content-length in XMLHttpRequest send of " + test);
+  };
+  xhr.addEventListener("load",
+                       getXHRLoadHandler(contents, contents.length, true,
+                                         "XMLHttpRequest send of " + test),
+                       false);
+  xhr.overrideMimeType('text/plain; charset=x-user-defined');
+  xhr.send(file);
+  expectedTestCount++;
+}
+
+function getFileReaderLoadHandler(expectedResult, expectedLength, testName) {
+  return function (event) {
+    is(event.target.readyState, FileReader.DONE,
+       "readyState in test " + testName);
+    is(event.target.error, null,
+       "no error in test " + testName);
+    is(event.target.result, expectedResult,
+       "result in test " + testName);
+    is(event.lengthComputable, true,
+       "lengthComputable in test " + testName);
+    is(event.loaded, expectedLength,
+       "lengthComputable in test " + testName);
+    is(event.total, expectedLength,
+       "lengthComputable in test " + testName);
+    testHasRun();
+  }
+}
+
+function getXHRLoadHandler(expectedResult, expectedLength, statusWorking, testName) {
+  return function (event) {
+    is(event.target.readyState, 4,
+       "readyState in test " + testName);
+    if (statusWorking) {
+      is(event.target.status, 200,
+         "no error in test " + testName);
+    }
+    else {
+      todo(event.target.status, 200,
+           "no error in test " + testName);
+    }
+    is(convertXHRBinary(event.target.responseText), expectedResult,
+       "result in test " + testName);
+    is(event.lengthComputable, true,
+       "lengthComputable in test " + testName);
+    is(event.loaded, expectedLength,
+       "lengthComputable in test " + testName);
+    is(event.total, expectedLength,
+       "lengthComputable in test " + testName);
+
+    testHasRun();
+  }
+}
+
+function convertXHRBinary(s) {
+  var res = "";
+  for (var i = 0; i < s.length; ++i) {
+    res += String.fromCharCode(s.charCodeAt(i) & 255);
+  }
+  return res;
+}
+
+function testHasRun() {
+ //alert(testRanCounter);
+ ++testRanCounter;
+ if (testRanCounter == expectedTestCount) {
+    SimpleTest.finish();
+  }
+}
+
+function createFileWithData(fileData) {
+  netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+  var dirSvc = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties);
+  var testFile = dirSvc.get("ProfD", Components.interfaces.nsIFile);
+  testFile.append("fileAPItestfile2-" + fileNum);
+  fileNum++;
+  var outStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
+  outStream.init(testFile, 0x02 | 0x08 | 0x20, // write, create, truncate
+                 0666, 0);
+  outStream.write(fileData, fileData.length);
+  outStream.close();
+
+  var fileList = document.getElementById('fileList');
+  fileList.value = testFile.path;
+
+  return fileList.files[0];
+}
+
+function gc() {
+  netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+  window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+        .getInterface(Components.interfaces.nsIDOMWindowUtils)
+        .garbageCollect();
+}
+
+function checkMPSubmission(sub, expected) {
+  function getPropCount(o) {
+    var x, l = 0;
+    for (x in o) ++l;
+    return l;
+  }
+
+  is(sub.length, expected.length,
+     "Correct number of items");
+  var i;
+  for (i = 0; i < expected.length; ++i) {
+    if (!("fileName" in expected[i])) {
+      is(sub[i].headers["Content-Disposition"],
+         "form-data; name=\"" + expected[i].name + "\"",
+         "Correct name");
+      is (getPropCount(sub[i].headers), 1,
+          "Wrong number of headers");
+    }
+    else {
+      is(sub[i].headers["Content-Disposition"],
+         "form-data; name=\"" + expected[i].name + "\"; filename=\"" +
+           expected[i].fileName + "\"",
+         "Correct name");
+      is(sub[i].headers["Content-Type"],
+         expected[i].contentType,
+         "Correct content type");
+      is (getPropCount(sub[i].headers), 2,
+          "Wrong number of headers");
+    }
+    is(sub[i].body,
+       expected[i].value,
+       "Correct value");
+  }
+}
+
+</script>
+</pre>
+</body> </html>
--- a/content/html/content/public/nsFormSubmission.h
+++ b/content/html/content/public/nsFormSubmission.h
@@ -47,17 +47,17 @@ class nsGenericHTMLElement;
 class nsILinkHandler;
 class nsIContent;
 class nsIFormControl;
 class nsIDOMHTMLElement;
 class nsIDocShell;
 class nsIRequest;
 class nsISaveAsCharset;
 class nsIMultiplexInputStream;
-class nsIDOMFile;
+class nsIDOMBlob;
 
 /**
  * Class for form submissions; encompasses the function to call to submit as
  * well as the form submission name/value pairs
  */
 class nsFormSubmission
 {
 public:
@@ -74,20 +74,20 @@ public:
    */
   virtual nsresult AddNameValuePair(const nsAString& aName,
                                     const nsAString& aValue) = 0;
 
   /**
    * Submit a name/file pair
    *
    * @param aName the name of the parameter
-   * @param aFile the file to submit
+   * @param aBlob the file to submit
    */
   virtual nsresult AddNameFilePair(const nsAString& aName,
-                                   nsIDOMFile* aFile) = 0;
+                                   nsIDOMBlob* aBlob) = 0;
   
   /**
    * Reports whether the instance supports AddIsindex().
    *
    * @return true if supported.
    */
   virtual PRBool SupportsIsindexSubmission()
   {
@@ -183,17 +183,17 @@ public:
    */
   nsFSMultipartFormData(const nsACString& aCharset,
                         nsIContent* aOriginatingElement);
   ~nsFSMultipartFormData();
  
   virtual nsresult AddNameValuePair(const nsAString& aName,
                                     const nsAString& aValue);
   virtual nsresult AddNameFilePair(const nsAString& aName,
-                                   nsIDOMFile* aFile);
+                                   nsIDOMBlob* aBlob);
   virtual nsresult GetEncodedSubmission(nsIURI* aURI,
                                         nsIInputStream** aPostDataStream);
 
   void GetContentType(nsACString& aContentType)
   {
     aContentType =
       NS_LITERAL_CSTRING("multipart/form-data; boundary=") + mBoundary;
   }
--- a/content/html/content/src/nsFormSubmission.cpp
+++ b/content/html/content/src/nsFormSubmission.cpp
@@ -104,17 +104,17 @@ public:
       mDocument(aDocument),
       mWarnedFileControl(PR_FALSE)
   {
   }
 
   virtual nsresult AddNameValuePair(const nsAString& aName,
                                     const nsAString& aValue);
   virtual nsresult AddNameFilePair(const nsAString& aName,
-                                   nsIDOMFile* aFile);
+                                   nsIDOMBlob* aBlob);
   virtual nsresult GetEncodedSubmission(nsIURI* aURI,
                                         nsIInputStream** aPostDataStream);
 
   virtual PRBool SupportsIsindexSubmission()
   {
     return PR_TRUE;
   }
 
@@ -190,26 +190,27 @@ nsFSURLEncoded::AddIsindex(const nsAStri
     mQueryString += NS_LITERAL_CSTRING("&isindex=") + convValue;
   }
 
   return NS_OK;
 }
 
 nsresult
 nsFSURLEncoded::AddNameFilePair(const nsAString& aName,
-                                nsIDOMFile* aFile)
+                                nsIDOMBlob* aBlob)
 {
   if (!mWarnedFileControl) {
     SendJSWarning(mDocument, "ForgotFileEnctypeWarning", nsnull, 0);
     mWarnedFileControl = PR_TRUE;
   }
 
   nsAutoString filename;
-  if (aFile) {
-    aFile->GetName(filename);
+  nsCOMPtr<nsIDOMFile> file = do_QueryInterface(aBlob);
+  if (file) {
+    file->GetName(filename);
   }
 
   return AddNameValuePair(aName, filename);
 }
 
 static void
 HandleMailtoSubject(nsCString& aPath) {
 
@@ -463,48 +464,51 @@ nsFSMultipartFormData::AddNameValuePair(
                  + nameStr + NS_LITERAL_CSTRING("\"" CRLF CRLF)
                  + valueStr + NS_LITERAL_CSTRING(CRLF);
 
   return NS_OK;
 }
 
 nsresult
 nsFSMultipartFormData::AddNameFilePair(const nsAString& aName,
-                                       nsIDOMFile* aFile)
+                                       nsIDOMBlob* aBlob)
 {
   // Encode the control name
   nsCAutoString nameStr;
   nsresult rv = EncodeVal(aName, nameStr);
   NS_ENSURE_SUCCESS(rv, rv);
 
   nsCString filenameStr;
   nsAutoString contentType;
   nsCOMPtr<nsIInputStream> fileStream;
-  if (aFile) {
+  if (aBlob) {
     // Get and encode the filename
     nsAutoString filename;
-    rv = aFile->GetName(filename);
-    NS_ENSURE_SUCCESS(rv, rv);
+    nsCOMPtr<nsIDOMFile> file = do_QueryInterface(aBlob);
+    if (file) {
+      rv = file->GetName(filename);
+      NS_ENSURE_SUCCESS(rv, rv);
+    }
     nsCAutoString encodedFileName;
     rv = EncodeVal(filename, encodedFileName);
     NS_ENSURE_SUCCESS(rv, rv);
   
     filenameStr.Adopt(nsLinebreakConverter::
                       ConvertLineBreaks(encodedFileName.get(),
                                         nsLinebreakConverter::eLinebreakAny,
                                         nsLinebreakConverter::eLinebreakNet));
   
     // Get content type
-    rv = aFile->GetType(contentType);
+    rv = aBlob->GetType(contentType);
     if (NS_FAILED(rv) || contentType.IsEmpty()) {
       contentType.AssignLiteral("application/octet-stream");
     }
   
     // Get input stream
-    rv = aFile->GetInternalStream(getter_AddRefs(fileStream));
+    rv = aBlob->GetInternalStream(getter_AddRefs(fileStream));
     NS_ENSURE_SUCCESS(rv, rv);
     if (fileStream) {
       // Create buffered stream (for efficiency)
       nsCOMPtr<nsIInputStream> bufferedStream;
       rv = NS_NewBufferedInputStream(getter_AddRefs(bufferedStream),
                                      fileStream, 8192);
       NS_ENSURE_SUCCESS(rv, rv);
   
@@ -595,17 +599,17 @@ public:
   nsFSTextPlain(const nsACString& aCharset, nsIContent* aOriginatingElement)
     : nsEncodingFormSubmission(aCharset, aOriginatingElement)
   {
   }
 
   virtual nsresult AddNameValuePair(const nsAString& aName,
                                     const nsAString& aValue);
   virtual nsresult AddNameFilePair(const nsAString& aName,
-                                   nsIDOMFile* aFile);
+                                   nsIDOMBlob* aBlob);
   virtual nsresult GetEncodedSubmission(nsIURI* aURI,
                                         nsIInputStream** aPostDataStream);
 
 private:
   nsString mBody;
 };
 
 nsresult
@@ -618,21 +622,22 @@ nsFSTextPlain::AddNameValuePair(const ns
   mBody.Append(aName + NS_LITERAL_STRING("=") + aValue +
                NS_LITERAL_STRING(CRLF));
 
   return NS_OK;
 }
 
 nsresult
 nsFSTextPlain::AddNameFilePair(const nsAString& aName,
-                               nsIDOMFile* aFile)
+                               nsIDOMBlob* aBlob)
 {
   nsAutoString filename;
-  if (aFile) {
-    aFile->GetName(filename);
+  nsCOMPtr<nsIDOMFile> file = do_QueryInterface(aBlob);
+  if (file) {
+    file->GetName(filename);
   }
     
   AddNameValuePair(aName, filename);
   return NS_OK;
 }
 
 nsresult
 nsFSTextPlain::GetEncodedSubmission(nsIURI* aURI,
--- a/dom/base/nsDOMClassInfo.cpp
+++ b/dom/base/nsDOMClassInfo.cpp
@@ -1317,16 +1317,18 @@ static nsDOMClassInfoData sClassInfoData
 
   NS_DEFINE_CLASSINFO_DATA(CommandEvent, nsDOMGenericSH,
                            DOM_DEFAULT_SCRIPTABLE_FLAGS)
   NS_DEFINE_CLASSINFO_DATA(OfflineResourceList, nsOfflineResourceListSH,
                            ARRAY_SCRIPTABLE_FLAGS)
 
   NS_DEFINE_CLASSINFO_DATA(FileList, nsFileListSH,
                            ARRAY_SCRIPTABLE_FLAGS)
+  NS_DEFINE_CLASSINFO_DATA(Blob, nsDOMGenericSH,
+                           DOM_DEFAULT_SCRIPTABLE_FLAGS)
   NS_DEFINE_CLASSINFO_DATA(File, nsDOMGenericSH,
                            DOM_DEFAULT_SCRIPTABLE_FLAGS)
   NS_DEFINE_CLASSINFO_DATA(FileException, nsDOMGenericSH,
                            DOM_DEFAULT_SCRIPTABLE_FLAGS)
   NS_DEFINE_CLASSINFO_DATA(FileError, nsDOMGenericSH,
                            DOM_DEFAULT_SCRIPTABLE_FLAGS)
   NS_DEFINE_CLASSINFO_DATA(FileReader, nsEventTargetSH,
                            EVENTTARGET_SCRIPTABLE_FLAGS)
@@ -3825,17 +3827,22 @@ nsDOMClassInfo::Init()
   DOM_CLASSINFO_MAP_BEGIN(FileList, nsIDOMFileList)
     DOM_CLASSINFO_MAP_ENTRY(nsIDOMFileList)
   DOM_CLASSINFO_MAP_END
 
   DOM_CLASSINFO_MAP_BEGIN(FileError, nsIDOMFileError)
     DOM_CLASSINFO_MAP_ENTRY(nsIDOMFileError)
   DOM_CLASSINFO_MAP_END
 
+  DOM_CLASSINFO_MAP_BEGIN(Blob, nsIDOMBlob)
+    DOM_CLASSINFO_MAP_ENTRY(nsIDOMBlob)
+  DOM_CLASSINFO_MAP_END
+
   DOM_CLASSINFO_MAP_BEGIN(File, nsIDOMFile)
+    DOM_CLASSINFO_MAP_ENTRY(nsIDOMBlob)
     DOM_CLASSINFO_MAP_ENTRY(nsIDOMFile)
   DOM_CLASSINFO_MAP_END
 
   DOM_CLASSINFO_MAP_BEGIN(FileException, nsIDOMFileException)
     DOM_CLASSINFO_MAP_ENTRY(nsIDOMFileException)
     DOM_CLASSINFO_MAP_ENTRY(nsIException)
   DOM_CLASSINFO_MAP_END
 
--- a/dom/base/nsDOMClassInfoClasses.h
+++ b/dom/base/nsDOMClassInfoClasses.h
@@ -397,16 +397,17 @@ DOMCI_CLASS(ClientRectList)
 DOMCI_CLASS(SVGForeignObjectElement)
 #endif
 
 DOMCI_CLASS(XULCommandEvent)
 DOMCI_CLASS(CommandEvent)
 DOMCI_CLASS(OfflineResourceList)
 
 DOMCI_CLASS(FileList)
+DOMCI_CLASS(Blob)
 DOMCI_CLASS(File)
 DOMCI_CLASS(FileException)
 DOMCI_CLASS(FileError)
 DOMCI_CLASS(FileReader)
 
 // DOM modal content window class, almost identical to Window
 DOMCI_CLASS(ModalContentWindow)
 DOMCI_CLASS(InnerModalContentWindow)
--- a/dom/base/nsDOMClassInfoID.h
+++ b/dom/base/nsDOMClassInfoID.h
@@ -160,15 +160,26 @@ NS_GetDOMClassInfoInstance(nsDOMClassInf
       aIID.Equals(NS_GET_IID(nsXPCClassInfo))) {                              \
     foundInterface = NS_GetDOMClassInfoInstance(eDOMClassInfo_##_class##_id); \
     if (!foundInterface) {                                                    \
       *aInstancePtr = nsnull;                                                 \
       return NS_ERROR_OUT_OF_MEMORY;                                          \
     }                                                                         \
   } else
 
+#define NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO_CONDITIONAL(_class, condition)   \
+  if ((condition) &&                                                          \
+      (aIID.Equals(NS_GET_IID(nsIClassInfo)) ||                               \
+       aIID.Equals(NS_GET_IID(nsXPCClassInfo)))) {                            \
+    foundInterface = NS_GetDOMClassInfoInstance(eDOMClassInfo_##_class##_id); \
+    if (!foundInterface) {                                                    \
+      *aInstancePtr = nsnull;                                                 \
+      return NS_ERROR_OUT_OF_MEMORY;                                          \
+    }                                                                         \
+  } else
+
 #else
 
 // See nsIDOMClassInfo.h
 
 #endif // _IMPL_NS_LAYOUT
 
 #endif // nsDOMClassInfoID_h__
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -3059,25 +3059,25 @@ nsGlobalWindow::GetApplicationCache(nsID
   }
 
   NS_IF_ADDREF(*aApplicationCache = mApplicationCache);
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
-nsGlobalWindow::CreateBlobURL(nsIDOMFile* aFile, nsAString& aURL)
-{
-  FORWARD_TO_INNER(CreateBlobURL, (aFile, aURL), NS_ERROR_UNEXPECTED);
+nsGlobalWindow::CreateBlobURL(nsIDOMBlob* aBlob, nsAString& aURL)
+{
+  FORWARD_TO_INNER(CreateBlobURL, (aBlob, aURL), NS_ERROR_UNEXPECTED);
 
   NS_ENSURE_STATE(mDoc);
 
-  NS_ENSURE_ARG_POINTER(aFile);
-
-  nsresult rv = aFile->GetInternalUrl(mDoc->NodePrincipal(), aURL);
+  NS_ENSURE_ARG_POINTER(aBlob);
+
+  nsresult rv = aBlob->GetInternalUrl(mDoc->NodePrincipal(), aURL);
   NS_ENSURE_SUCCESS(rv, rv);
 
   mDoc->RegisterFileDataUri(NS_LossyConvertUTF16toASCII(aURL));
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
--- a/dom/indexedDB/IDBEvents.cpp
+++ b/dom/indexedDB/IDBEvents.cpp
@@ -46,26 +46,16 @@
 #include "nsContentUtils.h"
 #include "nsDOMClassInfo.h"
 #include "nsJSON.h"
 #include "nsThreadUtils.h"
 
 #include "IDBRequest.h"
 #include "IDBTransaction.h"
 
-#define NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO_CONDITIONAL(_class, _condition)  \
-  if ((_condition) && (aIID.Equals(NS_GET_IID(nsIClassInfo)) ||               \
-                       aIID.Equals(NS_GET_IID(nsXPCClassInfo)))) {            \
-    foundInterface = NS_GetDOMClassInfoInstance(eDOMClassInfo_##_class##_id); \
-    if (!foundInterface) {                                                    \
-      *aInstancePtr = nsnull;                                                 \
-      return NS_ERROR_OUT_OF_MEMORY;                                          \
-    }                                                                         \
-  } else
-
 USING_INDEXEDDB_NAMESPACE
 
 namespace {
 
 template<class Class>
 inline
 nsIDOMEvent*
 idomevent_cast(Class* aClassPtr)
--- a/dom/interfaces/base/nsIDOMWindow2.idl
+++ b/dom/interfaces/base/nsIDOMWindow2.idl
@@ -33,19 +33,19 @@
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 #include "nsIDOMWindow.idl"
 
 interface nsIDOMOfflineResourceList;
-interface nsIDOMFile;
+interface nsIDOMBlob;
 
-[scriptable, uuid(63239526-27b0-44ff-be4e-ee1c8ee2212e)]
+[scriptable, uuid(efff0d88-3b94-4375-bdeb-676a847ecd7d)]
 interface nsIDOMWindow2 : nsIDOMWindow
 {
   /**
    * Get the window root for this window. This is useful for hooking
    * up event listeners to this window and every other window nested
    * in the window root.
    */
   [noscript] readonly attribute nsIDOMEventTarget windowRoot;
@@ -54,11 +54,11 @@ interface nsIDOMWindow2 : nsIDOMWindow
    * Get the application cache object for this window.
    */
   readonly attribute nsIDOMOfflineResourceList applicationCache;
 
   /**
    * Create and revoke blob urls. createBlobURL will always return a new URL
    * with the lifetime of the current Document.
    */
-  DOMString createBlobURL(in nsIDOMFile file);
+  DOMString createBlobURL(in nsIDOMBlob blob);
   void revokeBlobURL(in DOMString URL);
 };
--- a/netwerk/base/public/nsIFileStreams.idl
+++ b/netwerk/base/public/nsIFileStreams.idl
@@ -98,8 +98,39 @@ interface nsIFileOutputStream : nsIOutpu
      * @param perm          file mode bits listed in prio.h or -1 to
      *                      use the default permissions (0664)
      * @param behaviorFlags flags specifying various behaviors of the class
      *        (currently none supported)
      */
     void init(in nsIFile file, in long ioFlags, in long perm,
               in long behaviorFlags);
 };
+
+/**
+ * An input stream that allows you to read from a slice of a file.
+ */
+[scriptable, uuid(3ce03a2f-97f7-4375-b6bb-1788a60cad3b)]
+interface nsIPartialFileInputStream : nsISupports
+{
+    /**
+     * Initialize with a file and new start/end positions. Both start and
+     * start+length must be smaller than the size of the file. Not doing so
+     * will lead to undefined behavior.
+     * You must initialize the stream, and only initialize it once, before it
+     * can be used.
+     * 
+     * @param file          file to read from (must QI to nsILocalFile)
+     * @param start         start offset of slice to read. Must be smaller
+     *                      than the size of the file.
+     * @param length        length of slice to read. Must be small enough that
+     *                      start+length is smaller than the size of the file.
+     * @param ioFlags       file open flags listed in prio.h (see
+     *                      PR_Open documentation) or -1 to open the
+     *                      file in default mode (PR_RDONLY).
+     * @param perm          file mode bits listed in prio.h or -1 to
+     *                      use the default value (0)
+     * @param behaviorFlags flags specifying various behaviors of the class
+     *        (see enumerations in nsIFileInputStream)
+     */
+    void init(in nsIFile file, in unsigned long long start,
+              in unsigned long long length,
+              in long ioFlags, in long perm, in long behaviorFlags);
+};
--- a/netwerk/base/public/nsNetUtil.h
+++ b/netwerk/base/public/nsNetUtil.h
@@ -956,16 +956,36 @@ NS_NewLocalFileInputStream(nsIInputStrea
         rv = in->Init(file, ioFlags, perm, behaviorFlags);
         if (NS_SUCCEEDED(rv))
             NS_ADDREF(*result = in);  // cannot use nsCOMPtr::swap
     }
     return rv;
 }
 
 inline nsresult
+NS_NewPartialLocalFileInputStream(nsIInputStream **result,
+                                  nsIFile         *file,
+                                  PRUint64         offset,
+                                  PRUint64         length,
+                                  PRInt32          ioFlags       = -1,
+                                  PRInt32          perm          = -1,
+                                  PRInt32          behaviorFlags = 0)
+{
+    nsresult rv;
+    nsCOMPtr<nsIPartialFileInputStream> in =
+        do_CreateInstance(NS_PARTIALLOCALFILEINPUTSTREAM_CONTRACTID, &rv);
+    if (NS_SUCCEEDED(rv)) {
+        rv = in->Init(file, offset, length, ioFlags, perm, behaviorFlags);
+        if (NS_SUCCEEDED(rv))
+            rv = CallQueryInterface(in, result);
+    }
+    return rv;
+}
+
+inline nsresult
 NS_NewLocalFileOutputStream(nsIOutputStream **result,
                             nsIFile          *file,
                             PRInt32           ioFlags       = -1,
                             PRInt32           perm          = -1,
                             PRInt32           behaviorFlags = 0)
 {
     nsresult rv;
     nsCOMPtr<nsIFileOutputStream> out =
--- a/netwerk/base/src/nsFileStreams.cpp
+++ b/netwerk/base/src/nsFileStreams.cpp
@@ -168,17 +168,17 @@ nsFileStream::SetEOF()
 #endif
 
     return NS_OK;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // nsFileInputStream
 
-NS_IMPL_ISUPPORTS_INHERITED3(nsFileInputStream, 
+NS_IMPL_ISUPPORTS_INHERITED3(nsFileInputStream,
                              nsFileStream,
                              nsIInputStream,
                              nsIFileInputStream,
                              nsILineInputStream)
 
 nsresult
 nsFileInputStream::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult)
 {
@@ -326,16 +326,20 @@ nsFileInputStream::ReadLine(nsACString& 
 NS_IMETHODIMP
 nsFileInputStream::ReadSegments(nsWriteSegmentFun aWriter, void* aClosure,
                                 PRUint32 aCount, PRUint32* aResult)
 {
     // ReadSegments is not implemented because it would be inefficient when
     // the writer does not consume all data.  If you want to call ReadSegments,
     // wrap a BufferedInputStream around the file stream.  That will call
     // Read().
+
+    // If this is ever implemented you might need to modify
+    // nsPartialFileInputStream::ReadSegments
+
     return NS_ERROR_NOT_IMPLEMENTED;
 }
 
 NS_IMETHODIMP
 nsFileInputStream::IsNonBlocking(PRBool *aNonBlocking)
 {
     *aNonBlocking = PR_FALSE;
     return NS_OK;
@@ -355,16 +359,125 @@ nsFileInputStream::Seek(PRInt32 aWhence,
             return NS_BASE_STREAM_CLOSED;
         }
     }
 
     return nsFileStream::Seek(aWhence, aOffset);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
+// nsPartialFileInputStream
+
+// Don't forward to nsFileInputStream as we don't want to QI to
+// nsIFileInputStream
+NS_IMPL_ISUPPORTS_INHERITED3(nsPartialFileInputStream,
+                             nsFileStream,
+                             nsIInputStream,
+                             nsIPartialFileInputStream,
+                             nsILineInputStream)
+
+nsresult
+nsPartialFileInputStream::Create(nsISupports *aOuter, REFNSIID aIID,
+                                 void **aResult)
+{
+    NS_ENSURE_NO_AGGREGATION(aOuter);
+
+    nsPartialFileInputStream* stream = new nsPartialFileInputStream();
+
+    NS_ADDREF(stream);
+    nsresult rv = stream->QueryInterface(aIID, aResult);
+    NS_RELEASE(stream);
+    return rv;
+}
+
+NS_IMETHODIMP
+nsPartialFileInputStream::Init(nsIFile* aFile, PRUint64 aStart,
+                               PRUint64 aLength, PRInt32 aIOFlags,
+                               PRInt32 aPerm, PRInt32 aBehaviorFlags)
+{
+    mStart = aStart;
+    mLength = aLength;
+    mPosition = 0;
+
+    nsresult rv = nsFileInputStream::Init(aFile, aIOFlags, aPerm,
+                                          aBehaviorFlags);
+    NS_ENSURE_SUCCESS(rv, rv);
+    
+    return nsFileInputStream::Seek(NS_SEEK_SET, mStart);
+}
+
+NS_IMETHODIMP
+nsPartialFileInputStream::Tell(PRInt64 *aResult)
+{
+    PRInt64 tell;
+    nsresult rv = nsFileInputStream::Tell(&tell);
+    if (NS_SUCCEEDED(rv)) {
+        *aResult = tell - mStart;
+    }
+    return rv;
+}
+
+NS_IMETHODIMP
+nsPartialFileInputStream::Available(PRUint32* aResult)
+{
+    PRUint32 available;
+    nsresult rv = nsFileInputStream::Available(&available);
+    if (NS_SUCCEEDED(rv)) {
+        *aResult = TruncateSize(available);
+    }
+    return rv;
+}
+
+NS_IMETHODIMP
+nsPartialFileInputStream::Read(char* aBuf, PRUint32 aCount, PRUint32* aResult)
+{
+    PRUint32 readsize = TruncateSize(aCount);
+    if (readsize == 0 && mBehaviorFlags & CLOSE_ON_EOF) {
+        Close();
+        *aResult = 0;
+        return NS_OK;
+    }
+
+    nsresult rv = nsFileInputStream::Read(aBuf, readsize, aResult);
+    if (NS_SUCCEEDED(rv)) {
+        mPosition += readsize;
+    }
+    return rv;
+}
+
+NS_IMETHODIMP
+nsPartialFileInputStream::Seek(PRInt32 aWhence, PRInt64 aOffset)
+{
+    PRInt64 offset;
+    switch (aWhence) {
+        case NS_SEEK_SET:
+            offset = mStart + aOffset;
+            break;
+        case NS_SEEK_CUR:
+            offset = mStart + mPosition + aOffset;
+            break;
+        case NS_SEEK_END:
+            offset = mStart + mLength + aOffset;
+            break;
+        default:
+            return NS_ERROR_ILLEGAL_VALUE;
+    }
+
+    if (offset < (PRInt64)mStart || offset > (PRInt64)(mStart + mLength)) {
+        return NS_ERROR_INVALID_ARG;
+    }
+
+    nsresult rv = nsFileInputStream::Seek(NS_SEEK_SET, offset);
+    if (NS_SUCCEEDED(rv)) {
+        mPosition = offset - mStart;
+    }
+    return rv;
+}
+
+////////////////////////////////////////////////////////////////////////////////
 // nsFileOutputStream
 
 NS_IMPL_ISUPPORTS_INHERITED2(nsFileOutputStream, 
                              nsFileStream,
                              nsIOutputStream,
                              nsIFileOutputStream)
  
 nsresult
--- a/netwerk/base/src/nsFileStreams.h
+++ b/netwerk/base/src/nsFileStreams.h
@@ -132,16 +132,43 @@ protected:
     /**
      * Reopen the file (for OPEN_ON_READ only!)
      */
     nsresult Reopen() { return Open(mFile, mIOFlags, mPerm); }
 };
 
 ////////////////////////////////////////////////////////////////////////////////
 
+class nsPartialFileInputStream : public nsFileInputStream,
+                                 public nsIPartialFileInputStream
+{
+public:
+    NS_DECL_ISUPPORTS_INHERITED
+    NS_DECL_NSIPARTIALFILEINPUTSTREAM
+
+    NS_IMETHOD Tell(PRInt64 *aResult);
+    NS_IMETHOD Available(PRUint32 *aResult);
+    NS_IMETHOD Read(char* aBuf, PRUint32 aCount, PRUint32* aResult);
+    NS_IMETHOD Seek(PRInt32 aWhence, PRInt64 aOffset);
+
+    static nsresult
+    Create(nsISupports *aOuter, REFNSIID aIID, void **aResult);
+
+private:
+    PRUint32 TruncateSize(PRUint32 aSize) {
+          return (PRUint32)PR_MIN(mLength - mPosition, (PRUint64)aSize);
+    }
+
+    PRUint64 mStart;
+    PRUint64 mLength;
+    PRUint64 mPosition;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
 class nsFileOutputStream : public nsFileStream,
                            public nsIFileOutputStream
 {
 public:
     NS_DECL_ISUPPORTS_INHERITED
     NS_DECL_NSIOUTPUTSTREAM
     NS_DECL_NSIFILEOUTPUTSTREAM
 
--- a/netwerk/build/nsNetCID.h
+++ b/netwerk/build/nsNetCID.h
@@ -398,16 +398,28 @@
 #define NS_LOCALFILEOUTPUTSTREAM_CID                 \
 { /* c272fee0-c7e9-11d3-8cda-0060b0fc14a3 */         \
     0xc272fee0,                                      \
     0xc7e9,                                          \
     0x11d3,                                          \
     {0x8c, 0xda, 0x00, 0x60, 0xb0, 0xfc, 0x14, 0xa3} \
 }
 
+#define NS_PARTIALLOCALFILEINPUTSTREAM_CLASSNAME \
+    "nsPartialFileInputStream"
+#define NS_PARTIALLOCALFILEINPUTSTREAM_CONTRACTID \
+    "@mozilla.org/network/partial-file-input-stream;1"
+#define NS_PARTIALLOCALFILEINPUTSTREAM_CID           \
+{ /* 8738afd6-162a-418d-a99b-75b3a6b10a56 */         \
+    0x8738afd6,                                      \
+    0x162a,                                          \
+    0x418d,                                          \
+    {0xa9, 0x9b, 0x75, 0xb3, 0xa6, 0xb1, 0x0a, 0x56} \
+}
+
 #define NS_BUFFEREDINPUTSTREAM_CLASSNAME \
     "nsBufferedInputStream"
 #define NS_BUFFEREDINPUTSTREAM_CONTRACTID \
     "@mozilla.org/network/buffered-input-stream;1"
 #define NS_BUFFEREDINPUTSTREAM_CID                   \
 { /* 9226888e-da08-11d3-8cda-0060b0fc14a3 */         \
     0x9226888e,                                      \
     0xda08,                                          \
--- a/netwerk/build/nsNetModule.cpp
+++ b/netwerk/build/nsNetModule.cpp
@@ -629,16 +629,17 @@ NS_DEFINE_NAMED_CID(NS_UNICHARSTREAMLOAD
 NS_DEFINE_NAMED_CID(NS_DOWNLOADER_CID);
 NS_DEFINE_NAMED_CID(NS_SYNCSTREAMLISTENER_CID);
 NS_DEFINE_NAMED_CID(NS_REQUESTOBSERVERPROXY_CID);
 NS_DEFINE_NAMED_CID(NS_SIMPLESTREAMLISTENER_CID);
 NS_DEFINE_NAMED_CID(NS_STREAMLISTENERTEE_CID);
 NS_DEFINE_NAMED_CID(NS_LOADGROUP_CID);
 NS_DEFINE_NAMED_CID(NS_LOCALFILEINPUTSTREAM_CID);
 NS_DEFINE_NAMED_CID(NS_LOCALFILEOUTPUTSTREAM_CID);
+NS_DEFINE_NAMED_CID(NS_PARTIALLOCALFILEINPUTSTREAM_CID);
 NS_DEFINE_NAMED_CID(NS_SAFELOCALFILEOUTPUTSTREAM_CID);
 NS_DEFINE_NAMED_CID(NS_URICHECKER_CID);
 NS_DEFINE_NAMED_CID(NS_INCREMENTALDOWNLOAD_CID);
 NS_DEFINE_NAMED_CID(NS_STDURLPARSER_CID);
 NS_DEFINE_NAMED_CID(NS_NOAUTHURLPARSER_CID);
 NS_DEFINE_NAMED_CID(NS_AUTHURLPARSER_CID);
 NS_DEFINE_NAMED_CID(NS_STANDARDURL_CID);
 NS_DEFINE_NAMED_CID(NS_BUFFEREDINPUTSTREAM_CID);
@@ -749,16 +750,17 @@ static const mozilla::Module::CIDEntry k
     { &kNS_DOWNLOADER_CID, false, NULL, nsDownloaderConstructor },
     { &kNS_SYNCSTREAMLISTENER_CID, false, NULL, nsSyncStreamListenerConstructor },
     { &kNS_REQUESTOBSERVERPROXY_CID, false, NULL, nsRequestObserverProxyConstructor },
     { &kNS_SIMPLESTREAMLISTENER_CID, false, NULL, nsSimpleStreamListenerConstructor },
     { &kNS_STREAMLISTENERTEE_CID, false, NULL, nsStreamListenerTeeConstructor },
     { &kNS_LOADGROUP_CID, false, NULL, nsLoadGroupConstructor },
     { &kNS_LOCALFILEINPUTSTREAM_CID, false, NULL, nsFileInputStream::Create },
     { &kNS_LOCALFILEOUTPUTSTREAM_CID, false, NULL, nsFileOutputStream::Create },
+    { &kNS_PARTIALLOCALFILEINPUTSTREAM_CID, false, NULL, nsPartialFileInputStream::Create },
     { &kNS_SAFELOCALFILEOUTPUTSTREAM_CID, false, NULL, nsSafeFileOutputStreamConstructor },
     { &kNS_URICHECKER_CID, false, NULL, nsURICheckerConstructor },
     { &kNS_INCREMENTALDOWNLOAD_CID, false, NULL, net_NewIncrementalDownload },
     { &kNS_STDURLPARSER_CID, false, NULL, nsStdURLParserConstructor },
     { &kNS_NOAUTHURLPARSER_CID, false, NULL, nsNoAuthURLParserConstructor },
     { &kNS_AUTHURLPARSER_CID, false, NULL, nsAuthURLParserConstructor },
     { &kNS_STANDARDURL_CID, false, NULL, nsStandardURLConstructor },
     { &kNS_BUFFEREDINPUTSTREAM_CID, false, NULL, nsBufferedInputStream::Create },
@@ -871,16 +873,17 @@ static const mozilla::Module::ContractID
     { NS_DOWNLOADER_CONTRACTID, &kNS_DOWNLOADER_CID },
     { NS_SYNCSTREAMLISTENER_CONTRACTID, &kNS_SYNCSTREAMLISTENER_CID },
     { NS_REQUESTOBSERVERPROXY_CONTRACTID, &kNS_REQUESTOBSERVERPROXY_CID },
     { NS_SIMPLESTREAMLISTENER_CONTRACTID, &kNS_SIMPLESTREAMLISTENER_CID },
     { NS_STREAMLISTENERTEE_CONTRACTID, &kNS_STREAMLISTENERTEE_CID },
     { NS_LOADGROUP_CONTRACTID, &kNS_LOADGROUP_CID },
     { NS_LOCALFILEINPUTSTREAM_CONTRACTID, &kNS_LOCALFILEINPUTSTREAM_CID },
     { NS_LOCALFILEOUTPUTSTREAM_CONTRACTID, &kNS_LOCALFILEOUTPUTSTREAM_CID },
+    { NS_PARTIALLOCALFILEINPUTSTREAM_CONTRACTID, &kNS_PARTIALLOCALFILEINPUTSTREAM_CID },
     { NS_SAFELOCALFILEOUTPUTSTREAM_CONTRACTID, &kNS_SAFELOCALFILEOUTPUTSTREAM_CID },
     { NS_URICHECKER_CONTRACT_ID, &kNS_URICHECKER_CID },
     { NS_INCREMENTALDOWNLOAD_CONTRACTID, &kNS_INCREMENTALDOWNLOAD_CID },
     { NS_STDURLPARSER_CONTRACTID, &kNS_STDURLPARSER_CID },
     { NS_NOAUTHURLPARSER_CONTRACTID, &kNS_NOAUTHURLPARSER_CID },
     { NS_AUTHURLPARSER_CONTRACTID, &kNS_AUTHURLPARSER_CID },
     { NS_STANDARDURL_CONTRACTID, &kNS_STANDARDURL_CID },
     { NS_BUFFEREDINPUTSTREAM_CONTRACTID, &kNS_BUFFEREDINPUTSTREAM_CID },
new file mode 100644
index 0000000000000000000000000000000000000000..e0c5d3d6a1b305a48e1bffbcbe7405bc8b611bb7
GIT binary patch
literal 102591
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%0Dk2=G7>9R&AbLCJ!!P0#Z%9wDT?$O5i`kt_*ZQ
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%0A;1M
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
Qo`~=qvv(yn;>ooC0}bz&*Z=?k
new file mode 100644
--- /dev/null
+++ b/netwerk/test/unit/test_file_partial_inputstream.js
@@ -0,0 +1,556 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is Mats Palmgren.
+ * Portions created by the Initial Developer are Copyright (C) 2007
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Mats Palmgren <mats.palmgren@bredband.net>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+// Test nsIPartialFileInputStream
+// NOTE! These tests often use do_check_true(a == b) rather than
+//       do_check_eq(a, b) to avoid outputting characters which confuse
+//       the console
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const CC = Components.Constructor;
+const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1",
+                             "nsIBinaryInputStream",
+                             "setInputStream");
+const PR_RDONLY = 0x1;  // see prio.h
+
+// We need the profile directory so the test harness will clean up our test
+// files.
+do_get_profile();
+
+var binary_test_file_name = "data/image.png";
+var text_test_file_name = "test_file_partial_inputstream.js";
+// This is a global variable since if it's passed as an argument stack traces
+// become unreadable.
+var test_file_data;
+
+function run_test()
+{
+  if ("@mozilla.org/windows-registry-key;1" in Components.classes) {
+    do_check_eq("file creation fails randomly", "file creation fails randomly");
+    return;
+  }
+  // Binary tests
+  let binaryFile = do_get_file(binary_test_file_name);
+  let size = binaryFile.fileSize;
+  // Want to make sure we're working with a large enough file
+  dump("**** binary file size is: " + size + " ****\n");
+  do_check_true(size > 65536);
+
+  let binaryStream = new BinaryInputStream(new_file_input_stream(binaryFile));
+  test_file_data = "";
+  while ((avail = binaryStream.available()) > 0) {
+    test_file_data += binaryStream.readBytes(avail);
+  }
+  do_check_eq(test_file_data.length, size);
+  binaryStream.close();
+
+  test_binary_portion(0, 10);
+  test_binary_portion(0, 20000);
+  test_binary_portion(0, size);
+  test_binary_portion(20000, 10);
+  test_binary_portion(20000, 20000);
+  test_binary_portion(20000, size-20000);
+  test_binary_portion(size-10, 10);
+  test_binary_portion(size-20000, 20000);
+  test_binary_portion(0, 0);
+  test_binary_portion(20000, 0);
+  test_binary_portion(size-1, 1);
+
+
+  // Text-file tests
+  let textFile = do_get_file(binary_test_file_name);
+  size = textFile.fileSize;
+  // Want to make sure we're working with a large enough file
+  dump("**** text file size is: " + size + " ****\n");
+  do_check_true(size > 7000);
+
+  let textStream = new BinaryInputStream(new_file_input_stream(textFile));
+  test_file_data = "";
+  while ((avail = textStream.available()) > 0)
+    test_file_data += textStream.readBytes(avail);
+  do_check_eq(test_file_data.length, size);
+  textStream.close();
+
+  test_text_portion(0, 100);
+  test_text_portion(0, size);
+  test_text_portion(5000, 1000);
+  test_text_portion(size-10, 10);
+  test_text_portion(size-5000, 5000);
+  test_text_portion(10, 0);
+  test_text_portion(size-1, 1);
+
+  // Test auto-closing files
+  // Test behavior when *not* autoclosing
+  let tempFile = create_temp_file("01234567890123456789");
+  let tempInputStream = new_partial_file_input_stream(tempFile, 5, 10);
+  tempInputStream.QueryInterface(Ci.nsILineInputStream);
+  do_check_eq(read_line_stream(tempInputStream)[1], "5678901234");
+  try {
+    // This fails on some platforms
+    tempFile.remove(false);
+  }
+  catch (ex) {
+  }
+  tempInputStream.QueryInterface(Ci.nsISeekableStream);
+  tempInputStream.seek(SET, 1);
+  do_check_eq(read_line_stream(tempInputStream)[1], "678901234");
+
+  // Test removing the file when autoclosing
+  tempFile = create_temp_file("01234567890123456789");
+  tempInputStream = new_partial_file_input_stream(tempFile, 5, 10,
+						  Ci.nsIFileInputStream.CLOSE_ON_EOF |
+						  Ci.nsIFileInputStream.REOPEN_ON_REWIND);
+  tempInputStream.QueryInterface(Ci.nsILineInputStream);
+  do_check_eq(read_line_stream(tempInputStream)[1], "5678901234");
+  tempFile.remove(false);
+  tempInputStream.QueryInterface(Ci.nsISeekableStream);
+  try {
+    // The seek should reopen the file, which should fail.
+    tempInputStream.seek(SET, 1);
+    do_check_true(false);
+  }
+  catch (ex) {
+  }
+
+  // Test editing the file when autoclosing
+  tempFile = create_temp_file("01234567890123456789");
+  tempInputStream = new_partial_file_input_stream(tempFile, 5, 10,
+						  Ci.nsIFileInputStream.CLOSE_ON_EOF |
+						  Ci.nsIFileInputStream.REOPEN_ON_REWIND);
+  tempInputStream.QueryInterface(Ci.nsILineInputStream);
+  do_check_eq(read_line_stream(tempInputStream)[1], "5678901234");
+  let ostream = Cc["@mozilla.org/network/file-output-stream;1"].
+                createInstance(Ci.nsIFileOutputStream);
+  ostream.init(tempFile, 0x02 | 0x08 | 0x20, // write, create, truncate
+               0666, 0);
+  let newData = "abcdefghijklmnopqrstuvwxyz";
+  ostream.write(newData, newData.length);
+  ostream.close();
+  tempInputStream.QueryInterface(Ci.nsISeekableStream);
+  tempInputStream.seek(SET, 1);
+  do_check_eq(read_line_stream(tempInputStream)[1], newData.substr(6,9));
+
+  // Test auto-delete and auto-close together
+  tempFile = create_temp_file("01234567890123456789");
+  tempInputStream = new_partial_file_input_stream(tempFile, 5, 10,
+						  Ci.nsIFileInputStream.CLOSE_ON_EOF |
+						  Ci.nsIFileInputStream.DELETE_ON_CLOSE);
+  tempInputStream.QueryInterface(Ci.nsILineInputStream);
+  do_check_eq(read_line_stream(tempInputStream)[1], "5678901234");
+  do_check_false(tempFile.exists());
+}
+
+function test_binary_portion(start, length) {
+  let subFile = create_temp_file(test_file_data.substr(start, length));
+  do_check_eq(subFile.fileSize, length);
+
+  let streamTests = [
+    test_4k_read,
+    test_max_read,
+    test_seek,
+    test_seek_then_read,
+  ];
+
+  for each(test in streamTests) {
+    let fileStream = new_file_input_stream(subFile);
+    let partialStream = new_partial_file_input_stream(do_get_file(binary_test_file_name),
+                                                      start, length);
+    test(fileStream, partialStream, length);
+    fileStream.close();
+    partialStream.close();
+  }
+}
+
+function test_4k_read(fileStreamA, fileStreamB) {
+  fileStreamA.QueryInterface(Ci.nsISeekableStream);
+  fileStreamB.QueryInterface(Ci.nsISeekableStream);
+  let streamA = new BinaryInputStream(fileStreamA);
+  let streamB = new BinaryInputStream(fileStreamB);
+
+  while(1) {
+    do_check_eq(fileStreamA.tell(), fileStreamB.tell());
+
+    let availA = streamA.available();
+    let availB = streamB.available();
+    do_check_eq(availA, availB);
+    if (availA == 0)
+      return;
+
+    let readSize = availA > 4096 ? 4096 : availA;
+
+    do_check_true(streamA.readBytes(readSize) ==
+                  streamB.readBytes(readSize));
+  }
+}
+
+function test_max_read(fileStreamA, fileStreamB) {
+  fileStreamA.QueryInterface(Ci.nsISeekableStream);
+  fileStreamB.QueryInterface(Ci.nsISeekableStream);
+  let streamA = new BinaryInputStream(fileStreamA);
+  let streamB = new BinaryInputStream(fileStreamB);
+
+  while(1) {
+    do_check_eq(fileStreamA.tell(), fileStreamB.tell());
+
+    let availA = streamA.available();
+    let availB = streamB.available();
+    do_check_eq(availA, availB);
+    if (availA == 0)
+      return;
+
+    do_check_true(streamA.readBytes(availA) ==
+                  streamB.readBytes(availB));
+  }
+}
+
+const SET = Ci.nsISeekableStream.NS_SEEK_SET;
+const CUR = Ci.nsISeekableStream.NS_SEEK_CUR;
+const END = Ci.nsISeekableStream.NS_SEEK_END;
+function test_seek(dummy, partialFileStream, size) {
+  // We can't test the "real" filestream here as our existing file streams
+  // are very broken and allows searching past the end of the file.
+
+  partialFileStream.QueryInterface(Ci.nsISeekableStream);
+
+  tests = [
+    [SET, 0],
+    [SET, 5],
+    [SET, 1000],
+    [SET, size-10],
+    [SET, size-5],
+    [SET, size-1],
+    [SET, size],
+    [SET, size+10],
+    [SET, 0],
+    [CUR, 5],
+    [CUR, -5],
+    [SET, 5000],
+    [CUR, -100],
+    [CUR, 200],
+    [CUR, -5000],
+    [CUR, 5000],
+    [CUR, size * 2],
+    [SET, 1],
+    [CUR, -1],
+    [CUR, -1],
+    [CUR, -1],
+    [CUR, -1],
+    [CUR, -1],
+    [SET, size-1],
+    [CUR, 1],
+    [CUR, 1],
+    [CUR, 1],
+    [CUR, 1],
+    [CUR, 1],
+    [END, 0],
+    [END, -1],
+    [END, -5],
+    [END, -1000],
+    [END, -size+10],
+    [END, -size+5],
+    [END, -size+1],
+    [END, -size],
+    [END, -size-10],
+    [END, 10],
+    [CUR, 10],
+    [CUR, 10],
+    [CUR, 100],
+    [CUR, 1000],
+    [END, -1000],
+    [CUR, 100],
+    [CUR, 900],
+    [CUR, 100],
+    [CUR, 100],
+  ];
+
+  let pos = 0;
+  for each(test in tests) {
+    let didThrow = false;
+    try {
+      partialFileStream.seek(test[0], test[1]);
+    }
+    catch (ex) {
+      didThrow = true;
+    }
+
+    let newPos = test[0] == SET ? test[1] :
+                 test[0] == CUR ? pos + test[1] :
+                 size + test[1];
+    if (newPos > size || newPos < 0) {
+      do_check_true(didThrow);
+    }
+    else {
+      do_check_false(didThrow);
+      pos = newPos;
+    }
+
+    do_check_eq(partialFileStream.tell(), pos);
+    do_check_eq(partialFileStream.available(), size - pos);
+  }
+}
+
+function test_seek_then_read(fileStreamA, fileStreamB, size) {
+  // For now we only test seeking inside the file since our existing file
+  // streams behave very strange when seeking to past the end of the file.
+  if (size < 20000) {
+    return;
+  }
+
+  fileStreamA.QueryInterface(Ci.nsISeekableStream);
+  fileStreamB.QueryInterface(Ci.nsISeekableStream);
+  let streamA = new BinaryInputStream(fileStreamA);
+  let streamB = new BinaryInputStream(fileStreamB);
+
+  let read = {};
+
+  tests = [
+    [SET, 0],
+    [read, 1000],
+    [read, 1000],
+    [SET, 5],
+    [read, 1000],
+    [read, 5000],
+    [CUR, 100],
+    [read, 1000],
+    [read, 5000],
+    [CUR, -100],
+    [read, 1000],
+    [CUR, -100],
+    [read, 5000],
+    [END, -10],
+    [read, 10],
+    [END, -100],
+    [read, 101],
+    [CUR, -100],
+    [read, 10],
+    [SET, 0],
+    [read, 20000],
+    [read, 1],
+    [read, 100],
+  ];
+
+  for each(test in tests) {
+    if (test[0] === read) {
+  
+      let didThrowA = false;
+      let didThrowB = false;
+
+      let bytesA, bytesB;
+      try {
+        bytesA = streamA.readBytes(test[1]);
+      }
+      catch (ex) {
+        didThrowA = true;
+      }
+      try {
+        bytesB = streamB.readBytes(test[1]);
+      }
+      catch (ex) {
+        didThrowB = true;
+      }
+  
+      do_check_eq(didThrowA, didThrowB);
+      do_check_true(bytesA == bytesB);
+    }
+    else {
+      fileStreamA.seek(test[0], test[1]);
+      fileStreamB.seek(test[0], test[1]);
+    }
+    do_check_eq(fileStreamA.tell(), fileStreamB.tell());
+    do_check_eq(fileStreamA.available(), fileStreamB.available());
+  }
+}
+
+function test_text_portion(start, length) {
+  let subFile = create_temp_file(test_file_data.substr(start, length));
+  do_check_eq(subFile.fileSize, length);
+
+  let streamTests = [
+    test_readline,
+    test_seek_then_readline,
+  ];
+
+  for each(test in streamTests) {
+    let fileStream = new_file_input_stream(subFile)
+                     .QueryInterface(Ci.nsILineInputStream);
+    let partialStream = new_partial_file_input_stream(do_get_file(binary_test_file_name),
+                                                      start, length)
+                        .QueryInterface(Ci.nsILineInputStream);
+    test(fileStream, partialStream, length);
+    fileStream.close();
+    partialStream.close();
+  }
+}
+
+function test_readline(fileStreamA, fileStreamB)
+{
+  let moreA = true, moreB;
+  while(moreA) {
+    let lineA, lineB;
+    [moreA, lineA] = read_line_stream(fileStreamA);
+    [moreB, lineB] = read_line_stream(fileStreamB);
+    do_check_eq(moreA, moreB);
+    do_check_true(lineA.value == lineB.value);
+  }
+}
+
+function test_seek_then_readline(fileStreamA, fileStreamB, size) {
+  // For now we only test seeking inside the file since our existing file
+  // streams behave very strange when seeking to past the end of the file.
+  if (size < 100) {
+    return;
+  }
+
+  fileStreamA.QueryInterface(Ci.nsISeekableStream);
+  fileStreamB.QueryInterface(Ci.nsISeekableStream);
+
+  let read = {};
+
+  tests = [
+    [SET, 0],
+    [read, 5],
+    [read, 5],
+    [SET, 5],
+    [read, 5],
+    [read, 15],
+    [CUR, 100],
+    [read, 5],
+    [read, 15],
+    [CUR, -100],
+    [read, 5],
+    [CUR, -100],
+    [read, 25],
+    [END, -10],
+    [read, 1],
+    [END, -50],
+    [read, 30],
+    [read, 1],
+    [read, 1],
+    [CUR, -100],
+    [read, 1],
+    [SET, 0],
+    [read, 10000],
+    [read, 1],
+    [read, 1],
+    [SET, 0],
+    [read, 1],
+  ];
+
+  for each(test in tests) {
+    if (test[0] === read) {
+
+      for (let i = 0; i < test[1]; ++i) {
+	let didThrowA = false;
+	let didThrowB = false;
+
+	let lineA, lineB, moreA, moreB;
+	try {
+	  [moreA, lineA] = read_line_stream(fileStreamA);
+	}
+	catch (ex) {
+	  didThrowA = true;
+	}
+	try {
+	  [moreB, lineB] = read_line_stream(fileStreamB);
+	}
+	catch (ex) {
+	  didThrowB = true;
+	}
+
+	do_check_eq(didThrowA, didThrowB);
+	do_check_eq(moreA, moreB);
+	do_check_true(lineA == lineB);
+	do_check_eq(fileStreamA.tell(), fileStreamB.tell());
+	do_check_eq(fileStreamA.available(), fileStreamB.available());
+	if (!moreA)
+	  break;
+      }
+    }
+    else {
+      if (!(test[0] == CUR && (test[1] > fileStreamA.available() ||
+			       test[1] < -fileStreamA.tell()))) {
+	fileStreamA.seek(test[0], test[1]);
+	fileStreamB.seek(test[0], test[1]);
+	do_check_eq(fileStreamA.tell(), fileStreamB.tell());
+	do_check_eq(fileStreamA.available(), fileStreamB.available());
+      }
+    }
+  }
+}
+
+function read_line_stream(stream) {
+  let line = {};
+  let more = stream.readLine(line);
+  return [more, line.value];
+}
+
+function new_file_input_stream(file) {
+  var stream =
+      Cc["@mozilla.org/network/file-input-stream;1"]
+      .createInstance(Ci.nsIFileInputStream);
+  stream.init(file, PR_RDONLY, 0, 0);
+  return stream.QueryInterface(Ci.nsIInputStream);
+}
+
+function new_partial_file_input_stream(file, start, length, flags) {
+  var stream =
+      Cc["@mozilla.org/network/partial-file-input-stream;1"]
+      .createInstance(Ci.nsIPartialFileInputStream);
+  stream.init(file, start, length, PR_RDONLY, 0, flags || 0);
+  return stream.QueryInterface(Ci.nsIInputStream);
+}
+
+function create_temp_file(data) {
+  let file = Cc["@mozilla.org/file/directory_service;1"].
+             getService(Ci.nsIProperties).
+             get("ProfD", Ci.nsIFile);
+  file.append("fileinputstream-test-file.tmp");
+  file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0666);
+
+  let ostream = Cc["@mozilla.org/network/file-output-stream;1"].
+                createInstance(Ci.nsIFileOutputStream);
+  //ostream.init(file, 0x02 | 0x08 | 0x20, // write, create, truncate
+  //             0666, 0);
+  ostream.init(file, -1, -1, 0);
+  ostream.write(data, data.length);
+  ostream.close();
+
+  dump("**** created temporary file " + file.path + " with size " +
+       file.fileSize + " ****\n");
+
+  return file;
+}