gecko-dev/widget/nsIDeviceContextSpec.cpp
Ray Kraesig e2ee2f11df Bug 1891541 - [2/2] enforce that MozPromise only accepts static strings r=xpcom-reviewers,media-playback-reviewers,padenot,emilio
All present uses of the call-site arguments to MozPromise's methods
supply static strings. However, this is nowhere enforced. Do so.

Additionally, since this is the third or fourth time the present author
alone has personally implemented such an enforcement mechanism, create a
helper class to simplify doing so.

No functional changes.

Differential Revision: https://phabricator.services.mozilla.com/D207462
2024-04-24 17:02:49 +00:00

88 lines
3.0 KiB
C++

/* -*- Mode: C++; tab-width: 2; 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 "nsIDeviceContextSpec.h"
#include "gfxPoint.h"
#include "mozilla/gfx/PrintPromise.h"
#include "nsError.h"
#include "nsIPrintSettings.h"
#include "mozilla/Components.h"
#include "mozilla/TaskQueue.h"
using mozilla::MakeRefPtr;
using mozilla::gfx::PrintEndDocumentPromise;
// We have some platform specific code here rather than in the appropriate
// nsIDeviceContextSpec subclass. We structure the code this way so that
// nsIDeviceContextSpecProxy gets the correct behavior without us having to
// instantiate a platform specific nsIDeviceContextSpec subclass in content
// processes. That is necessary for sandboxing.
float nsIDeviceContextSpec::GetPrintingScale() {
#ifdef XP_WIN
if (mPrintSettings->GetOutputFormat() != nsIPrintSettings::kOutputFormatPDF
# ifdef MOZ_ENABLE_SKIA_PDF
&& !mPrintViaSkPDF
# endif
) {
// The print settings will have the resolution stored from the real device.
int32_t resolution;
mPrintSettings->GetResolution(&resolution);
return float(resolution) / GetDPI();
}
#endif
return 72.0f / GetDPI();
}
gfxPoint nsIDeviceContextSpec::GetPrintingTranslate() {
#ifdef XP_WIN
// The underlying surface on windows is the size of the printable region. When
// the region is smaller than the actual paper size the (0, 0) coordinate
// refers top-left of that unwritable region. To instead have (0, 0) become
// the top-left of the actual paper, translate it's coordinate system by the
// unprintable region's width.
double marginTop, marginLeft;
mPrintSettings->GetUnwriteableMarginTop(&marginTop);
mPrintSettings->GetUnwriteableMarginLeft(&marginLeft);
int32_t resolution;
mPrintSettings->GetResolution(&resolution);
return gfxPoint(-marginLeft * resolution, -marginTop * resolution);
#else
return gfxPoint(0, 0);
#endif
}
RefPtr<PrintEndDocumentPromise>
nsIDeviceContextSpec::EndDocumentPromiseFromResult(
nsresult aResult, mozilla::StaticString aSite) {
return NS_SUCCEEDED(aResult)
? PrintEndDocumentPromise::CreateAndResolve(true, aSite)
: PrintEndDocumentPromise::CreateAndReject(aResult, aSite);
}
RefPtr<PrintEndDocumentPromise> nsIDeviceContextSpec::EndDocumentAsync(
const char* aCallSite, AsyncEndDocumentFunction aFunction) {
auto promise =
MakeRefPtr<PrintEndDocumentPromise::Private>("PrintEndDocumentPromise");
NS_DispatchBackgroundTask(
NS_NewRunnableFunction(
"EndDocumentAsync",
[promise, function = std::move(aFunction)]() mutable {
const auto result = function();
if (NS_SUCCEEDED(result)) {
promise->Resolve(true, __func__);
} else {
promise->Reject(result, __func__);
}
}),
NS_DISPATCH_EVENT_MAY_BLOCK);
return promise;
}