nsresult nsDOMMultipartFile::InitFile(JSContext* aCx, uint32_t aArgc, jsval* aArgv) { nsresult rv; NS_ASSERTION(!mImmutable, "Something went wrong ..."); NS_ENSURE_TRUE(!mImmutable, NS_ERROR_UNEXPECTED); if (!nsContentUtils::IsCallerChrome()) { return NS_ERROR_DOM_SECURITY_ERR; // Real short trip } NS_ENSURE_TRUE(aArgc > 0, NS_ERROR_UNEXPECTED); bool nativeEOL = false; if (aArgc > 1) { FilePropertyBag d; if (!d.Init(aCx, nullptr, aArgv[1])) { return NS_ERROR_TYPE_ERR; } mName = d.mName; mContentType = d.mType; nativeEOL = d.mEndings == EndingTypesValues::Native; } // We expect to get a path to represent as a File object, // an nsIFile, or an nsIDOMFile. nsCOMPtr<nsIFile> file; nsCOMPtr<nsIDOMFile> domFile; if (!aArgv[0].isString()) { // Lets see if it's an nsIFile if (!aArgv[0].isObject()) { return NS_ERROR_UNEXPECTED; // We're not interested } JSObject* obj = &aArgv[0].toObject(); nsISupports* supports = nsContentUtils::XPConnect()->GetNativeOfWrapper(aCx, obj); if (!supports) { return NS_ERROR_UNEXPECTED; } domFile = do_QueryInterface(supports); file = do_QueryInterface(supports); if (!domFile && !file) { return NS_ERROR_UNEXPECTED; } } else { // It's a string JSString* str = JS_ValueToString(aCx, aArgv[0]); NS_ENSURE_TRUE(str, NS_ERROR_XPC_BAD_CONVERT_JS); nsDependentJSString xpcomStr; if (!xpcomStr.init(aCx, str)) { return NS_ERROR_XPC_BAD_CONVERT_JS; } rv = NS_NewLocalFile(xpcomStr, false, getter_AddRefs(file)); NS_ENSURE_SUCCESS(rv, rv); } if (file) { bool exists; rv = file->Exists(&exists); NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_TRUE(exists, NS_ERROR_FILE_NOT_FOUND); bool isDir; rv = file->IsDirectory(&isDir); NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_FALSE(isDir, NS_ERROR_FILE_IS_DIRECTORY); if (mName.IsEmpty()) { file->GetLeafName(mName); } domFile = new nsDOMFileFile(file); } // XXXkhuey this is terrible if (mContentType.IsEmpty()) { domFile->GetType(mContentType); } BlobSet blobSet; blobSet.AppendBlob(domFile); mBlobs = blobSet.GetBlobs(); return NS_OK; }
nsresult DOMMultipartFileImpl::InitChromeFile(JSContext* aCx, uint32_t aArgc, JS::Value* aArgv) { nsresult rv; NS_ASSERTION(!mImmutable, "Something went wrong ..."); NS_ENSURE_TRUE(!mImmutable, NS_ERROR_UNEXPECTED); MOZ_ASSERT(nsContentUtils::IsCallerChrome()); NS_ENSURE_TRUE(aArgc > 0, NS_ERROR_UNEXPECTED); if (aArgc > 1) { FilePropertyBag d; if (!d.Init(aCx, JS::Handle<JS::Value>::fromMarkedLocation(&aArgv[1]))) { return NS_ERROR_TYPE_ERR; } mName = d.mName; mContentType = d.mType; } // We expect to get a path to represent as a File object or // Blob object, an nsIFile, or an nsIDOMFile. nsCOMPtr<nsIFile> file; nsCOMPtr<nsIDOMBlob> blob; if (!aArgv[0].isString()) { // Lets see if it's an nsIFile if (!aArgv[0].isObject()) { return NS_ERROR_UNEXPECTED; // We're not interested } JSObject* obj = &aArgv[0].toObject(); nsISupports* supports = nsContentUtils::XPConnect()->GetNativeOfWrapper(aCx, obj); if (!supports) { return NS_ERROR_UNEXPECTED; } blob = do_QueryInterface(supports); file = do_QueryInterface(supports); if (!blob && !file) { return NS_ERROR_UNEXPECTED; } mIsFromNsiFile = true; } else { // It's a string JSString* str = JS::ToString(aCx, JS::Handle<JS::Value>::fromMarkedLocation(&aArgv[0])); NS_ENSURE_TRUE(str, NS_ERROR_XPC_BAD_CONVERT_JS); nsAutoJSString xpcomStr; if (!xpcomStr.init(aCx, str)) { return NS_ERROR_XPC_BAD_CONVERT_JS; } rv = NS_NewLocalFile(xpcomStr, false, getter_AddRefs(file)); NS_ENSURE_SUCCESS(rv, rv); } if (file) { bool exists; rv = file->Exists(&exists); NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_TRUE(exists, NS_ERROR_FILE_NOT_FOUND); bool isDir; rv = file->IsDirectory(&isDir); NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_FALSE(isDir, NS_ERROR_FILE_IS_DIRECTORY); if (mName.IsEmpty()) { file->GetLeafName(mName); } nsRefPtr<DOMFile> domFile = DOMFile::CreateFromFile(file); // Pre-cache size. uint64_t unused; rv = domFile->GetSize(&unused); NS_ENSURE_SUCCESS(rv, rv); // Pre-cache modified date. rv = domFile->GetMozLastModifiedDate(&unused); NS_ENSURE_SUCCESS(rv, rv); blob = domFile.forget(); } // XXXkhuey this is terrible if (mContentType.IsEmpty()) { blob->GetType(mContentType); } BlobSet blobSet; blobSet.AppendBlobImpl(static_cast<DOMFile*>(blob.get())->Impl()); mBlobImpls = blobSet.GetBlobImpls(); SetLengthAndModifiedDate(); return NS_OK; }