Files
tubestation/dom/base/AutoPrintEventDispatcher.h
Emilio Cobos Álvarez cc89fb812f Bug 1958942 - Refactor how we schedule and suppress rendering phases. r=smaug
This starts some of the needed refactoring towards having proper
rendering suppression, and in general aligning better with the HTML
spec's "update the rendering" section.

Behavior changes should be minimal:

 * We suppress rendering until the pres shell is initialized rather than
   just created. This matches how autofocus already works and in general
   we don't want to forcibly flush an uninitialized presshell.

 * We handle view transition suppression more correctly in some (but not
   all) phases.

 * Some of the steps do no longer recurse manually nor check the view
   transitions suppression, as that's done centrally.

 * mAutoFocusFlushDocuments isn't tracked separately.

Follow-up work will involve changing most of the "pending resize/scroll/etc"
events to be per-document as per spec, and also implement suppression for
painting.

Differential Revision: https://phabricator.services.mozilla.com/D244372
2025-04-09 23:51:01 +00:00

66 lines
2.2 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 mozilla_dom_AutoPrintEventDispatcher_h
#define mozilla_dom_AutoPrintEventDispatcher_h
#include "mozilla/dom/Document.h"
#include "mozilla/dom/DocumentInlines.h"
#include "nsContentUtils.h"
#include "nsGlobalWindowOuter.h"
#include "nsIPrintSettings.h"
namespace mozilla::dom {
class AutoPrintEventDispatcher {
// NOTE(emilio): For fission iframes, we dispatch this event in
// RecvCloneDocumentTreeIntoSelf.
static void CollectInProcessSubdocuments(
Document& aDoc, nsTArray<nsCOMPtr<Document>>& aDocs) {
aDoc.EnumerateSubDocuments([&aDocs](Document& aSubDoc) {
aDocs.AppendElement(&aSubDoc);
CollectInProcessSubdocuments(aSubDoc, aDocs);
return CallState::Continue;
});
}
MOZ_CAN_RUN_SCRIPT void DispatchEvent(bool aBefore) {
for (auto& doc : mDocuments) {
nsContentUtils::DispatchTrustedEvent(
doc, nsGlobalWindowOuter::Cast(doc->GetWindow()),
aBefore ? u"beforeprint"_ns : u"afterprint"_ns, CanBubble::eNo,
Cancelable::eNo, nullptr);
if (RefPtr<nsPresContext> presContext = doc->GetPresContext()) {
presContext->EmulateMedium(aBefore ? nsGkAtoms::print : nullptr);
// Ensure media query listeners fire.
// FIXME(emilio): This is hacky, at best, but is required for compat
// with some pages, see bug 774398.
doc->EvaluateMediaQueriesAndReportChanges();
}
}
}
public:
MOZ_CAN_RUN_SCRIPT explicit AutoPrintEventDispatcher(Document& aDoc) {
if (!aDoc.IsStaticDocument()) {
mDocuments.AppendElement(&aDoc);
CollectInProcessSubdocuments(aDoc, mDocuments);
}
DispatchEvent(true);
}
MOZ_CAN_RUN_SCRIPT ~AutoPrintEventDispatcher() { DispatchEvent(false); }
AutoTArray<nsCOMPtr<Document>, 8> mDocuments;
const nsSize mPageSize;
nsRect mVisibleAreaToRestore;
};
} // namespace mozilla::dom
#endif