FileSystemEntry.cpp (2791B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "FileSystemEntry.h" 8 9 #include "CallbackRunnables.h" 10 #include "FileSystem.h" 11 #include "FileSystemDirectoryEntry.h" 12 #include "FileSystemFileEntry.h" 13 #include "mozilla/dom/FileSystemEntryBinding.h" 14 #include "mozilla/dom/UnionTypes.h" 15 16 namespace mozilla::dom { 17 18 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(FileSystemEntry, mParent, mParentEntry, 19 mFileSystem) 20 21 NS_IMPL_CYCLE_COLLECTING_ADDREF(FileSystemEntry) 22 NS_IMPL_CYCLE_COLLECTING_RELEASE(FileSystemEntry) 23 24 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(FileSystemEntry) 25 NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY 26 NS_INTERFACE_MAP_ENTRY(nsISupports) 27 NS_INTERFACE_MAP_END 28 29 /* static */ 30 already_AddRefed<FileSystemEntry> FileSystemEntry::Create( 31 nsIGlobalObject* aGlobalObject, 32 const OwningFileOrDirectory& aFileOrDirectory, FileSystem* aFileSystem) { 33 MOZ_ASSERT(aGlobalObject); 34 MOZ_ASSERT(aFileSystem); 35 36 RefPtr<FileSystemEntry> entry; 37 if (aFileOrDirectory.IsFile()) { 38 entry = new FileSystemFileEntry(aGlobalObject, aFileOrDirectory.GetAsFile(), 39 nullptr, aFileSystem); 40 } else { 41 MOZ_ASSERT(aFileOrDirectory.IsDirectory()); 42 entry = new FileSystemDirectoryEntry( 43 aGlobalObject, aFileOrDirectory.GetAsDirectory(), nullptr, aFileSystem); 44 } 45 46 return entry.forget(); 47 } 48 49 FileSystemEntry::FileSystemEntry(nsIGlobalObject* aGlobal, 50 FileSystemEntry* aParentEntry, 51 FileSystem* aFileSystem) 52 : mParent(aGlobal), mParentEntry(aParentEntry), mFileSystem(aFileSystem) { 53 MOZ_ASSERT(aGlobal); 54 MOZ_ASSERT(aFileSystem); 55 } 56 57 FileSystemEntry::~FileSystemEntry() = default; 58 59 JSObject* FileSystemEntry::WrapObject(JSContext* aCx, 60 JS::Handle<JSObject*> aGivenProto) { 61 return FileSystemEntry_Binding::Wrap(aCx, this, aGivenProto); 62 } 63 64 void FileSystemEntry::GetParent( 65 const Optional<OwningNonNull<FileSystemEntryCallback>>& aSuccessCallback, 66 const Optional<OwningNonNull<ErrorCallback>>& aErrorCallback) { 67 if (!aSuccessCallback.WasPassed() && !aErrorCallback.WasPassed()) { 68 return; 69 } 70 71 if (mParentEntry) { 72 FileSystemEntryCallbackHelper::Call(GetParentObject(), aSuccessCallback, 73 mParentEntry); 74 return; 75 } 76 77 FileSystemEntryCallbackHelper::Call(GetParentObject(), aSuccessCallback, 78 this); 79 } 80 81 } // namespace mozilla::dom