void GetDirectoryListingTask::HandlerCallback() { MOZ_ASSERT(NS_IsMainThread(), "Only call on main thread!"); if (mFileSystem->IsShutdown()) { mPromise = nullptr; return; } if (HasError()) { mPromise->MaybeReject(mErrorValue); mPromise = nullptr; return; } size_t count = mTargetBlobImpls.Length(); Sequence<OwningFileOrDirectory> listing; if (!listing.SetLength(count, mozilla::fallible_t())) { mPromise->MaybeReject(NS_ERROR_FAILURE); mPromise = nullptr; return; } for (unsigned i = 0; i < count; i++) { if (mTargetBlobImpls[i]->IsDirectory()) { nsAutoString name; mTargetBlobImpls[i]->GetName(name); nsAutoString path(mTargetRealPath); path.AppendLiteral(FILESYSTEM_DOM_PATH_SEPARATOR); path.Append(name); #ifdef DEBUG if (XRE_IsParentProcess()) { nsCOMPtr<nsIFile> file = mFileSystem->GetLocalFile(path); bool exist; file->Exists(&exist); MOZ_ASSERT(exist); } #endif listing[i].SetAsDirectory() = new Directory(mFileSystem, path); } else { listing[i].SetAsFile() = File::Create(mFileSystem->GetWindow(), mTargetBlobImpls[i]); } } mPromise->MaybeResolve(listing); mPromise = nullptr; }
void FileList::ToSequence(Sequence<OwningFileOrDirectory>& aSequence, ErrorResult& aRv) const { MOZ_ASSERT(aSequence.IsEmpty()); if (mFilesOrDirectories.IsEmpty()) { return; } if (!aSequence.SetLength(mFilesOrDirectories.Length(), mozilla::fallible_t())) { aRv.Throw(NS_ERROR_OUT_OF_MEMORY); return; } for (uint32_t i = 0; i < mFilesOrDirectories.Length(); ++i) { aSequence[i] = mFilesOrDirectories[i]; } }
/* static */ already_AddRefed<DOMMediaStream> DOMMediaStream::Constructor(const GlobalObject& aGlobal, const DOMMediaStream& aStream, ErrorResult& aRv) { nsTArray<RefPtr<MediaStreamTrack>> tracks; aStream.GetTracks(tracks); Sequence<OwningNonNull<MediaStreamTrack>> nonNullTrackSeq; if (!nonNullTrackSeq.SetLength(tracks.Length(), fallible)) { MOZ_ASSERT(false); aRv.Throw(NS_ERROR_OUT_OF_MEMORY); return nullptr; } for (size_t i = 0; i < tracks.Length(); ++i) { nonNullTrackSeq[i] = tracks[i]; } return Constructor(aGlobal, nonNullTrackSeq, aRv); }
void GetDirectoryListingTaskChild::HandlerCallback() { mFileSystem->AssertIsOnOwningThread(); if (mFileSystem->IsShutdown()) { mPromise = nullptr; return; } if (HasError()) { mPromise->MaybeReject(mErrorValue); mPromise = nullptr; return; } size_t count = mTargetData.Length(); nsAutoString directoryPath; ErrorResult error; mDirectory->GetPath(directoryPath, error); if (NS_WARN_IF(error.Failed())) { mPromise->MaybeReject(error.StealNSResult()); mPromise = nullptr; return; } Sequence<OwningFileOrDirectory> listing; if (!listing.SetLength(count, mozilla::fallible_t())) { mPromise->MaybeReject(NS_ERROR_OUT_OF_MEMORY); mPromise = nullptr; return; } for (unsigned i = 0; i < count; i++) { nsCOMPtr<nsIFile> path; NS_ConvertUTF16toUTF8 fullPath(mTargetData[i].mPath); nsresult rv = NS_NewNativeLocalFile(fullPath, true, getter_AddRefs(path)); if (NS_WARN_IF(NS_FAILED(rv))) { mPromise->MaybeReject(rv); mPromise = nullptr; return; } #ifdef DEBUG nsCOMPtr<nsIFile> rootPath; rv = NS_NewLocalFile(mFileSystem->LocalOrDeviceStorageRootPath(), false, getter_AddRefs(rootPath)); if (NS_WARN_IF(NS_FAILED(rv))) { mPromise->MaybeReject(rv); mPromise = nullptr; return; } MOZ_ASSERT(FileSystemUtils::IsDescendantPath(rootPath, path)); #endif if (mTargetData[i].mType == Directory::FileOrDirectoryPath::eDirectoryPath) { RefPtr<Directory> directory = Directory::Create(mFileSystem->GetParentObject(), path, mFileSystem); MOZ_ASSERT(directory); // Propogate mFilter onto sub-Directory object: directory->SetContentFilters(mFilters); listing[i].SetAsDirectory() = directory; } else { MOZ_ASSERT(mTargetData[i].mType == Directory::FileOrDirectoryPath::eFilePath); RefPtr<File> file = File::CreateFromFile(mFileSystem->GetParentObject(), path); MOZ_ASSERT(file); nsAutoString filePath; filePath.Assign(directoryPath); // This is specific for unix root filesystem. if (!directoryPath.EqualsLiteral(FILESYSTEM_DOM_PATH_SEPARATOR_LITERAL)) { filePath.AppendLiteral(FILESYSTEM_DOM_PATH_SEPARATOR_LITERAL); } nsAutoString name; file->GetName(name); filePath.Append(name); file->SetPath(filePath); listing[i].SetAsFile() = file; } } mPromise->MaybeResolve(listing); mPromise = nullptr; }
already_AddRefed<Promise> DataTransfer::GetFilesAndDirectories(ErrorResult& aRv) { nsCOMPtr<nsINode> parentNode = do_QueryInterface(mParent); if (!parentNode) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } nsCOMPtr<nsIGlobalObject> global = parentNode->OwnerDoc()->GetScopeObject(); MOZ_ASSERT(global); if (!global) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } nsRefPtr<Promise> p = Promise::Create(global, aRv); if (aRv.Failed()) { return nullptr; } if (!mFiles) { GetFiles(aRv); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } } Sequence<OwningFileOrDirectory> filesAndDirsSeq; if (mFiles && mFiles->Length()) { if (!filesAndDirsSeq.SetLength(mFiles->Length(), mozilla::fallible_t())) { p->MaybeReject(NS_ERROR_OUT_OF_MEMORY); return p.forget(); } nsPIDOMWindow* window = parentNode->OwnerDoc()->GetInnerWindow(); nsRefPtr<OSFileSystem> fs; for (uint32_t i = 0; i < mFiles->Length(); ++i) { if (mFiles->Item(i)->Impl()->IsDirectory()) { #if defined(ANDROID) || defined(MOZ_B2G) MOZ_ASSERT(false, "Directory picking should have been redirected to normal " "file picking for platforms that don't have a directory " "picker"); #endif nsAutoString path; mFiles->Item(i)->GetMozFullPathInternal(path, aRv); if (aRv.Failed()) { return nullptr; } int32_t leafSeparatorIndex = path.RFind(FILE_PATH_SEPARATOR); nsDependentSubstring dirname = Substring(path, 0, leafSeparatorIndex); nsDependentSubstring basename = Substring(path, leafSeparatorIndex); fs = MakeOrReuseFileSystem(dirname, fs, window); filesAndDirsSeq[i].SetAsDirectory() = new Directory(fs, basename); } else { filesAndDirsSeq[i].SetAsFile() = mFiles->Item(i); } } } p->MaybeResolve(filesAndDirsSeq); return p.forget(); }