@@ -2544,6 +2544,24 @@ void Page::setIsVisible(bool isVisible)
25442544 setActivityState (state);
25452545}
25462546
2547+ class VisibilityChangeEventNotifier : public RefCounted <VisibilityChangeEventNotifier> {
2548+ public:
2549+ VisibilityChangeEventNotifier () = default ;
2550+ virtual ~VisibilityChangeEventNotifier () = default ;
2551+
2552+ void setCompletionHandler (CompletionHandler<void ()>&& completionHandler) { m_completionHandler = WTFMove (completionHandler); };
2553+ void addDocument (Ref<Document> document) { m_documents.add (document); };
2554+ void removeDocument (Ref<Document> document) {
2555+ m_documents.remove (document);
2556+ if (m_documents.isEmpty ())
2557+ m_completionHandler ();
2558+ }
2559+
2560+ private:
2561+ CompletionHandler<void ()> m_completionHandler;
2562+ HashSet<Ref<Document>> m_documents;
2563+ };
2564+
25472565void Page::setIsVisibleInternal (bool isVisible)
25482566{
25492567 // FIXME: The visibility state should be stored on the top-level document.
@@ -2608,9 +2626,21 @@ void Page::setIsVisibleInternal(bool isVisible)
26082626 view->hide ();
26092627 }
26102628
2611- forEachDocument ([] (Document& document) {
2612- document.visibilityStateChanged ();
2613- });
2629+ if (m_visibilityChangeCompletionHandler) {
2630+ Ref<VisibilityChangeEventNotifier> notifier = adoptRef (*new VisibilityChangeEventNotifier ());
2631+ notifier->setCompletionHandler (std::exchange (m_visibilityChangeCompletionHandler, { }));
2632+
2633+ forEachDocument ([notifier] (Document& document) {
2634+ notifier->addDocument (document);
2635+ document.visibilityStateChanged ([protectedNotifier = Ref { notifier }] (Document& document) {
2636+ protectedNotifier->removeDocument (document);
2637+ });
2638+ });
2639+ } else {
2640+ forEachDocument ([] (Document& document) {
2641+ document.visibilityStateChanged ({ });
2642+ });
2643+ }
26142644}
26152645
26162646void Page::setIsPrerender ()
0 commit comments