summaryrefslogtreecommitdiffstats
path: root/widget/nsPrinterBase.h
diff options
context:
space:
mode:
Diffstat (limited to 'widget/nsPrinterBase.h')
-rw-r--r--widget/nsPrinterBase.h114
1 files changed, 114 insertions, 0 deletions
diff --git a/widget/nsPrinterBase.h b/widget/nsPrinterBase.h
new file mode 100644
index 0000000000..abd4f82705
--- /dev/null
+++ b/widget/nsPrinterBase.h
@@ -0,0 +1,114 @@
+/* -*- 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/. */
+
+#ifndef nsPrinterBase_h__
+#define nsPrinterBase_h__
+
+#include "mozilla/gfx/Rect.h"
+#include "nsIPrinter.h"
+#include "nsTArray.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsISupportsImpl.h"
+#include "nsPrintSettingsImpl.h"
+#include "mozilla/EnumeratedArray.h"
+#include "mozilla/Result.h"
+
+namespace mozilla {
+
+struct PaperInfo;
+
+namespace dom {
+class Promise;
+}
+
+} // namespace mozilla
+
+class nsPrinterBase : public nsIPrinter {
+ public:
+ using Promise = mozilla::dom::Promise;
+ using MarginDouble = mozilla::gfx::MarginDouble;
+ using PrintSettingsInitializer = mozilla::PrintSettingsInitializer;
+
+ NS_IMETHOD CopyFromWithValidation(nsIPrintSettings*, JSContext*,
+ Promise**) override;
+ NS_IMETHOD GetSupportsDuplex(JSContext*, Promise**) final;
+ NS_IMETHOD GetSupportsColor(JSContext*, Promise**) final;
+ NS_IMETHOD GetSupportsMonochrome(JSContext*, Promise**) final;
+ NS_IMETHOD GetSupportsCollation(JSContext*, Promise**) final;
+ NS_IMETHOD GetPrinterInfo(JSContext*, Promise**) final;
+
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_CLASS(nsPrinterBase)
+
+ // We require the paper info array
+ nsPrinterBase() = delete;
+
+ // No copy or move, we're an identity.
+ nsPrinterBase(const nsPrinterBase&) = delete;
+ nsPrinterBase(nsPrinterBase&&) = delete;
+
+ void QueryMarginsForPaper(Promise&, const nsString& aPaperId);
+
+ /**
+ * Caches the argument by copying it into mPrintSettingsInitializer.
+ * If mPrintSettingsInitializer is already populated this is a no-op.
+ */
+ void CachePrintSettingsInitializer(
+ const PrintSettingsInitializer& aInitializer);
+
+ // Data to pass through to create the nsPrinterInfo
+ struct PrinterInfo {
+ nsTArray<mozilla::PaperInfo> mPaperList;
+ PrintSettingsInitializer mDefaultSettings;
+ };
+
+ private:
+ enum class AsyncAttribute {
+ // If you change this list you must update attributeKeys in
+ // nsPrinterBase::AsyncPromiseAttributeGetter.
+ SupportsDuplex = 0,
+ SupportsColor,
+ SupportsMonochrome,
+ SupportsCollation,
+ PrinterInfo,
+ // Just a guard.
+ Last,
+ };
+
+ template <typename Result, typename... Args>
+ using BackgroundTask = Result (nsPrinterBase::*)(Args...) const;
+
+ // Resolves an async attribute via a background task.
+ template <typename T, typename... Args>
+ nsresult AsyncPromiseAttributeGetter(JSContext*, Promise**, AsyncAttribute,
+ BackgroundTask<T, Args...>,
+ Args... aArgs);
+
+ protected:
+ nsPrinterBase(const mozilla::CommonPaperInfoArray* aPaperInfoArray);
+ virtual ~nsPrinterBase();
+
+ // Implementation-specific methods. These must not make assumptions about
+ // which thread they run on.
+ virtual bool SupportsDuplex() const = 0;
+ virtual bool SupportsColor() const = 0;
+ virtual bool SupportsMonochrome() const = 0;
+ virtual bool SupportsCollation() const = 0;
+ virtual MarginDouble GetMarginsForPaper(nsString aPaperId) const = 0;
+ virtual PrinterInfo CreatePrinterInfo() const = 0;
+ // Searches our built-in list of commonly used PWG paper sizes for a matching,
+ // localized PaperInfo. Returns null if there is no matching size.
+ const mozilla::PaperInfo* FindCommonPaperSize(
+ const mozilla::gfx::SizeDouble& aSize) const;
+
+ private:
+ mozilla::EnumeratedArray<AsyncAttribute, AsyncAttribute::Last,
+ RefPtr<Promise>>
+ mAsyncAttributePromises;
+ // List of built-in, commonly used paper sizes.
+ const RefPtr<const mozilla::CommonPaperInfoArray> mCommonPaperInfo;
+};
+
+#endif