/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "nsPrinterBase.h" #include "nsPaperMargin.h" #include #include "nsPaper.h" #include "nsIPrintSettings.h" #include "PrintBackgroundTask.h" #include "mozilla/dom/Promise.h" using namespace mozilla; using mozilla::dom::Promise; using mozilla::gfx::MarginDouble; void nsPrinterBase::CachePrintSettingsInitializer( const PrintSettingsInitializer& aInitializer) { if (mPrintSettingsInitializer.isNothing()) { mPrintSettingsInitializer.emplace(aInitializer); } } template inline void ImplCycleCollectionTraverse( nsCycleCollectionTraversalCallback& aCallback, EnumeratedArray& aArray, const char* aName, uint32_t aFlags = 0) { aFlags |= CycleCollectionEdgeNameArrayFlag; for (Value& element : aArray) { ImplCycleCollectionTraverse(aCallback, element, aName, aFlags); } } template inline void ImplCycleCollectionUnlink( EnumeratedArray& aArray) { for (Value& element : aArray) { ImplCycleCollectionUnlink(element); } } namespace mozilla { template <> void ResolveOrReject(Promise& aPromise, nsPrinterBase&, const MarginDouble& aResult) { auto margin = MakeRefPtr(aResult); aPromise.MaybeResolve(margin); } template <> void ResolveOrReject(Promise& aPromise, nsPrinterBase& aPrinter, const nsTArray& aResult) { nsTArray> result; result.SetCapacity(aResult.Length()); for (const PaperInfo& info : aResult) { result.AppendElement(MakeRefPtr(aPrinter, info)); } aPromise.MaybeResolve(result); } template <> void ResolveOrReject(Promise& aPromise, nsPrinterBase& aPrinter, const PrintSettingsInitializer& aResult) { aPrinter.CachePrintSettingsInitializer(aResult); aPromise.MaybeResolve( RefPtr(CreatePlatformPrintSettings(aResult))); } } // namespace mozilla template nsresult nsPrinterBase::AsyncPromiseAttributeGetter( JSContext* aCx, Promise** aResultPromise, AsyncAttribute aAttribute, BackgroundTask aBackgroundTask, Args... aArgs) { MOZ_ASSERT(NS_IsMainThread()); return mozilla::AsyncPromiseAttributeGetter( *this, mAsyncAttributePromises[aAttribute], aCx, aResultPromise, aBackgroundTask, std::forward(aArgs)...); } NS_IMETHODIMP nsPrinterBase::CreateDefaultSettings(JSContext* aCx, Promise** aResultPromise) { MOZ_ASSERT(NS_IsMainThread()); NS_ENSURE_ARG_POINTER(aResultPromise); if (mPrintSettingsInitializer.isSome()) { ErrorResult rv; RefPtr promise = dom::Promise::Create(xpc::CurrentNativeGlobal(aCx), rv); if (MOZ_UNLIKELY(rv.Failed())) { *aResultPromise = nullptr; return rv.StealNSResult(); } RefPtr settings( CreatePlatformPrintSettings(mPrintSettingsInitializer.ref())); promise->MaybeResolve(settings); promise.forget(aResultPromise); return NS_OK; } return PrintBackgroundTaskPromise(*this, aCx, aResultPromise, &nsPrinterBase::DefaultSettings); } NS_IMETHODIMP nsPrinterBase::GetSupportsDuplex(JSContext* aCx, Promise** aResultPromise) { return AsyncPromiseAttributeGetter(aCx, aResultPromise, AsyncAttribute::SupportsDuplex, &nsPrinterBase::SupportsDuplex); } NS_IMETHODIMP nsPrinterBase::GetSupportsColor(JSContext* aCx, Promise** aResultPromise) { return AsyncPromiseAttributeGetter(aCx, aResultPromise, AsyncAttribute::SupportsColor, &nsPrinterBase::SupportsColor); } NS_IMETHODIMP nsPrinterBase::GetSupportsCollation(JSContext* aCx, Promise** aResultPromise) { return AsyncPromiseAttributeGetter(aCx, aResultPromise, AsyncAttribute::SupportsCollation, &nsPrinterBase::SupportsCollation); } NS_IMETHODIMP nsPrinterBase::GetPaperList(JSContext* aCx, Promise** aResultPromise) { return AsyncPromiseAttributeGetter(aCx, aResultPromise, AsyncAttribute::PaperList, &nsPrinterBase::PaperList); } void nsPrinterBase::QueryMarginsForPaper(Promise& aPromise, uint64_t aPaperId) { return SpawnPrintBackgroundTask(*this, aPromise, &nsPrinterBase::GetMarginsForPaper, aPaperId); } NS_IMPL_CYCLE_COLLECTION(nsPrinterBase, mAsyncAttributePromises) NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsPrinterBase) NS_INTERFACE_MAP_ENTRY(nsIPrinter) NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIPrinter) NS_INTERFACE_MAP_END NS_IMPL_CYCLE_COLLECTING_ADDREF(nsPrinterBase) NS_IMPL_CYCLE_COLLECTING_RELEASE(nsPrinterBase) nsPrinterBase::nsPrinterBase() = default; nsPrinterBase::~nsPrinterBase() = default;