nsresult nsFileControlFrame::DnDListener::GetBlobImplForWebkitDirectory(nsIDOMFileList* aFileList, BlobImpl** aBlobImpl) { *aBlobImpl = nullptr; HTMLInputElement* inputElement = HTMLInputElement::FromContent(mFrame->GetContent()); bool webkitDirPicker = Preferences::GetBool("dom.webkitBlink.dirPicker.enabled", false) && inputElement->HasAttr(kNameSpaceID_None, nsGkAtoms::webkitdirectory); if (!webkitDirPicker) { return NS_OK; } if (!aFileList) { return NS_ERROR_FAILURE; } FileList* files = static_cast<FileList*>(aFileList); // webkitdirectory doesn't care about the length of the file list but // only about the first item on it. uint32_t len = files->Length(); if (len) { File* file = files->Item(0); if (file) { BlobImpl* impl = file->Impl(); if (impl && impl->IsDirectory()) { RefPtr<BlobImpl> retVal = impl; retVal.swap(*aBlobImpl); return NS_OK; } } } return NS_ERROR_FAILURE; }
already_AddRefed<FileSystemEntry> DataTransferItem::GetAsEntryWithPrincipal(nsIPrincipal* aPrincipal, ErrorResult& aRv) { RefPtr<File> file = GetAsFileWithPrincipal(aPrincipal, aRv); if (NS_WARN_IF(aRv.Failed()) || !file) { return nullptr; } nsCOMPtr<nsIGlobalObject> global; // This is annoying, but DataTransfer may have various things as parent. nsCOMPtr<EventTarget> target = do_QueryInterface(mDataTransfer->GetParentObject()); if (target) { global = target->GetOwnerGlobal(); } else { nsCOMPtr<nsIDOMEvent> event = do_QueryInterface(mDataTransfer->GetParentObject()); if (event) { global = event->InternalDOMEvent()->GetParentObject(); } } if (!global) { return nullptr; } RefPtr<FileSystem> fs = FileSystem::Create(global); RefPtr<FileSystemEntry> entry; BlobImpl* impl = file->Impl(); MOZ_ASSERT(impl); if (impl->IsDirectory()) { nsAutoString fullpath; impl->GetMozFullPathInternal(fullpath, aRv); if (aRv.Failed()) { aRv.SuppressException(); return nullptr; } nsCOMPtr<nsIFile> directoryFile; nsresult rv = NS_NewNativeLocalFile(NS_ConvertUTF16toUTF8(fullpath), true, getter_AddRefs(directoryFile)); if (NS_WARN_IF(NS_FAILED(rv))) { return nullptr; } RefPtr<Directory> directory = Directory::Create(global, directoryFile); entry = new FileSystemDirectoryEntry(global, directory, fs); } else { entry = new FileSystemFileEntry(global, file, fs); } Sequence<RefPtr<FileSystemEntry>> entries; if (!entries.AppendElement(entry, fallible)) { return nullptr; } fs->CreateRoot(entries); return entry.forget(); }