Index: base/public/nsDOMFile.h =================================================================== RCS file: /cvsroot/mozilla/content/base/public/nsDOMFile.h,v retrieving revision 1.1 diff -u -p -w -r1.1 nsDOMFile.h --- base/public/nsDOMFile.h 25 Jul 2007 04:29:47 -0000 1.1 +++ base/public/nsDOMFile.h 16 Jan 2008 05:16:02 -0000 @@ -49,7 +49,9 @@ class nsIDOMDocument; class nsIFile; +class nsIURI; class nsIInputStream; +class nsIChannel; class nsDOMFile : public nsIDOMFile, public nsICharsetDetectionObserver @@ -58,8 +60,8 @@ public: NS_DECL_ISUPPORTS NS_DECL_NSIDOMFILE - nsDOMFile(nsIFile *aFile) - : mFile(aFile) + nsDOMFile(nsIURI *aURI) + : mURI(aURI) {} ~nsDOMFile() {} @@ -67,7 +69,7 @@ public: NS_IMETHOD Notify(const char *aCharset, nsDetectionConfident aConf); private: - nsCOMPtr mFile; + nsCOMPtr mURI; nsString mContentType; nsCString mCharset; @@ -75,6 +77,7 @@ private: nsACString &aCharset); nsresult ConvertStream(nsIInputStream *aStream, const char *aCharset, nsAString &aResult); + nsIInputStream* nsDOMFile::GetStream(nsresult *rv, nsIChannel **aChannel = nsnull); }; class nsDOMFileList : public nsIDOMFileList Index: base/src/nsDOMFile.cpp =================================================================== RCS file: /cvsroot/mozilla/content/base/src/nsDOMFile.cpp,v retrieving revision 1.1 diff -u -p -w -r1.1 nsDOMFile.cpp --- base/src/nsDOMFile.cpp 25 Jul 2007 04:29:48 -0000 1.1 +++ base/src/nsDOMFile.cpp 16 Jan 2008 05:16:02 -0000 @@ -62,6 +62,8 @@ #include "plbase64.h" #include "prmem.h" +#include "nsIURI.h" +#include "nsIFileURL.h" // nsDOMFile implementation @@ -92,14 +94,32 @@ DOMFileResult(nsresult rv) NS_IMETHODIMP nsDOMFile::GetFileName(nsAString &aFileName) { - return mFile->GetLeafName(aFileName); + nsCOMPtr url(do_QueryInterface(mURI)); + if (url) { + nsCAutoString fileName; + nsresult rv = url->GetFilePath(fileName); + if (NS_SUCCEEDED(rv)) { + CopyUTF8toUTF16(fileName, aFileName); + return NS_OK; + } + } + aFileName.AssignLiteral("unknown"); + return NS_OK; } NS_IMETHODIMP nsDOMFile::GetFileSize(PRUint64 *aFileSize) { + nsCOMPtr fileURL(do_QueryInterface(mURI)); + if (!fileURL) + return NS_ERROR_NOT_AVAILABLE; + nsCOMPtr file; + fileURL->GetFile(getter_AddRefs(file)); + if (!file) + return NS_ERROR_NOT_AVAILABLE; + PRInt64 fileSize; - nsresult rv = mFile->GetFileSize(&fileSize); + nsresult rv = file->GetFileSize(&fileSize); NS_ENSURE_SUCCESS(rv, rv); if (fileSize < 0) { @@ -114,18 +134,16 @@ nsDOMFile::GetFileSize(PRUint64 *aFileSi NS_IMETHODIMP nsDOMFile::GetAsText(const nsAString &aCharset, nsAString &aResult) { - aResult.Truncate(); - - nsCOMPtr stream; - nsresult rv = NS_NewLocalFileInputStream - (getter_AddRefs(stream), - mFile, -1, -1, 0); - NS_ENSURE_SUCCESS(rv, DOMFileResult(rv)); - + nsresult rv; nsCAutoString charsetGuess; + nsCOMPtr channel; + nsCOMPtr stream(GetStream(&rv, getter_AddRefs(channel))); + if (NS_FAILED(rv)) + return rv; + if (!aCharset.IsEmpty()) { CopyUTF16toUTF8(aCharset, charsetGuess); - } else { + } else if (channel && NS_FAILED(channel->GetContentCharset(charsetGuess))) { rv = GuessCharset(stream, charsetGuess); NS_ENSURE_SUCCESS(rv, DOMFileResult(rv)); @@ -149,15 +167,28 @@ nsDOMFile::GetAsText(const nsAString &aC NS_IMETHODIMP nsDOMFile::GetAsDataURL(nsAString &aResult) { + // XXX we should have a base64 stream converter aResult.AssignLiteral("data:"); nsresult rv; - nsCOMPtr mimeService = - do_GetService(NS_MIMESERVICE_CONTRACTID, &rv); - NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr channel; + nsCOMPtr stream(GetStream(&rv, getter_AddRefs(channel))); + if (NS_FAILED(rv)) + return rv; nsCAutoString contentType; - rv = mimeService->GetTypeFromFile(mFile, contentType); + nsCOMPtr fileURL(do_QueryInterface(mURI)); + nsCOMPtr file; + if (fileURL) + fileURL->GetFile(getter_AddRefs(file)); + if (file) { + nsCOMPtr mimeService = + do_GetService(NS_MIMESERVICE_CONTRACTID, &rv); + if (NS_SUCCEEDED(rv)) + rv = mimeService->GetTypeFromFile(file, contentType); + } else { + rv = channel->GetContentType(contentType); + } if (NS_SUCCEEDED(rv)) { AppendUTF8toUTF16(contentType, aResult); } else { @@ -165,12 +196,6 @@ nsDOMFile::GetAsDataURL(nsAString &aResu } aResult.AppendLiteral(";base64,"); - nsCOMPtr stream; - rv = NS_NewLocalFileInputStream(getter_AddRefs(stream), - mFile, -1, -1, - nsIFileInputStream::CLOSE_ON_EOF); - NS_ENSURE_SUCCESS(rv, DOMFileResult(rv)); - char readBuf[4096]; PRUint32 leftOver = 0; PRUint32 numRead; @@ -202,17 +227,46 @@ nsDOMFile::GetAsDataURL(nsAString &aResu return NS_OK; } +nsIInputStream* +nsDOMFile::GetStream(nsresult *aResult, nsIChannel** aChannel) +{ + nsIInputStream *stream = nsnull; + nsresult rv; + nsCOMPtr fileURL(do_QueryInterface(mURI)); + nsCOMPtr file; + if (fileURL) + fileURL->GetFile(getter_AddRefs(file)); + if (file) { + rv = NS_NewLocalFileInputStream + (&stream, + file, -1, -1, nsIFileInputStream::CLOSE_ON_EOF); + if (NS_SUCCEEDED(rv) && aChannel) + *aChannel = nsnull; + } else { + nsCOMPtr channel; + rv = NS_NewChannel(getter_AddRefs(channel), mURI); + if (NS_SUCCEEDED(rv)) { + rv = channel->Open(&stream); + if (NS_SUCCEEDED(rv) && aChannel) + channel.swap(*aChannel); + } + } + if (NS_FAILED(rv)) { + NS_IF_RELEASE(stream); + *aResult = rv; + } + + return stream; +} + NS_IMETHODIMP nsDOMFile::GetAsBinary(nsAString &aResult) { aResult.Truncate(); - - nsCOMPtr stream; - nsresult rv = NS_NewLocalFileInputStream - (getter_AddRefs(stream), - mFile, -1, -1, - nsIFileInputStream::CLOSE_ON_EOF); - NS_ENSURE_SUCCESS(rv, DOMFileResult(rv)); + nsresult rv; + nsCOMPtr stream(GetStream(&rv)); + if (NS_FAILED(rv)) + return rv; PRUint32 numRead; do { Index: html/content/src/nsHTMLInputElement.cpp =================================================================== RCS file: /cvsroot/mozilla/content/html/content/src/nsHTMLInputElement.cpp,v retrieving revision 1.471 diff -u -p -w -r1.471 nsHTMLInputElement.cpp --- html/content/src/nsHTMLInputElement.cpp 19 Dec 2007 17:46:54 -0000 1.471 +++ html/content/src/nsHTMLInputElement.cpp 16 Jan 2008 05:16:03 -0000 @@ -110,6 +110,7 @@ // input type=image #include "nsImageLoadingContent.h" #include "nsIDOMWindowInternal.h" +#include "nsIFileURL.h" // XXX align=left, hspace, vspace, border? other nav4 attrs @@ -325,7 +326,7 @@ protected: /** * Get an nsIFile for the currently selected file in an file control. */ - nsresult GetFile(nsIFile** aFile); + nsresult GetFile(nsIURI** aFile); /** * Update mFileList with the currently selected file. @@ -750,11 +751,7 @@ nsHTMLInputElement::GetValue(nsAString& } } else { // Just return the leaf name - nsCOMPtr file; - GetFile(getter_AddRefs(file)); - if (!file || NS_FAILED(file->GetLeafName(aValue))) { - aValue.Truncate(); - } + GetFileName(aValue); } return NS_OK; @@ -854,7 +851,7 @@ nsHTMLInputElement::SetFileName(const ns } nsresult -nsHTMLInputElement::GetFile(nsIFile** aFile) +nsHTMLInputElement::GetFile(nsIURI** aFile) { *aFile = nsnull; @@ -864,18 +861,15 @@ nsHTMLInputElement::GetFile(nsIFile** aF nsresult rv = NS_ERROR_NOT_AVAILABLE; - if (StringBeginsWith(*mFileName, NS_LITERAL_STRING("file:"), - nsCaseInsensitiveStringComparator())) { - // Converts the URL string into the corresponding nsIFile if possible. - // A local file will be created if the URL string begins with file://. - rv = NS_GetFileFromURLSpec(NS_ConvertUTF16toUTF8(*mFileName), aFile); - } + // XXX timeless FIXME + rv = NS_NewURI(aFile, *mFileName); - if (!(*aFile)) { + if (NS_FAILED(rv)) { // this is no "file://", try as local file nsCOMPtr localFile; rv = NS_NewLocalFile(*mFileName, PR_FALSE, getter_AddRefs(localFile)); - NS_IF_ADDREF(*aFile = localFile); + if (NS_SUCCEEDED(rv)) + rv = NS_NewFileURI(aFile, localFile); } return rv; @@ -888,7 +882,7 @@ nsHTMLInputElement::UpdateFileList() mFileList->Clear(); if (mType == NS_FORM_INPUT_FILE && mFileName) { - nsCOMPtr file; + nsCOMPtr file; nsresult rv = GetFile(getter_AddRefs(file)); NS_ENSURE_SUCCESS(rv, rv); @@ -2486,43 +2480,57 @@ nsHTMLInputElement::SubmitNamesValues(ns // // Open the file // - nsCOMPtr file; + nsCOMPtr fileURI; - rv = GetFile(getter_AddRefs(file)); + rv = GetFile(getter_AddRefs(fileURI)); - if (file) { + // XXX timeless FIXME + if (fileURI) { // // Get the leaf path name (to be submitted as the value) // nsAutoString filename; - rv = file->GetLeafName(filename); + GetFileName(filename); - if (NS_SUCCEEDED(rv) && !filename.IsEmpty()) { + if (!filename.IsEmpty()) { PRBool acceptsFiles = aFormSubmission->AcceptsFiles(); if (acceptsFiles) { + nsCAutoString contentType; + // + // Get input stream + // + nsCOMPtr fileStream; + nsCOMPtr fileURL(do_QueryInterface(fileURI)); + if (fileURL) { + nsCOMPtr file; + fileURL->GetFile(getter_AddRefs(file)); + if (file) { // // Get content type // nsCOMPtr MIMEService = do_GetService(NS_MIMESERVICE_CONTRACTID, &rv); - NS_ENSURE_SUCCESS(rv, rv); - nsCAutoString contentType; - rv = MIMEService->GetTypeFromFile(file, contentType); - if (NS_FAILED(rv)) { + if (!MIMEService || + NS_FAILED(MIMEService->GetTypeFromFile(file, contentType))) contentType.AssignLiteral("application/octet-stream"); - } - // - // Get input stream - // - nsCOMPtr fileStream; rv = NS_NewLocalFileInputStream(getter_AddRefs(fileStream), file, -1, -1, nsIFileInputStream::CLOSE_ON_EOF | nsIFileInputStream::REOPEN_ON_REWIND); + } + } + if (!fileStream) { + nsCOMPtr channel; + NS_NewChannel(getter_AddRefs(channel), fileURI); + if (channel) { + channel->GetContentType(contentType); + channel->Open(getter_AddRefs(fileStream)); + } + } if (fileStream) { // // Create buffered stream (for efficiency)