Title: [272047] trunk
Revision
272047
Author
[email protected]
Date
2021-01-28 20:06:40 -0800 (Thu, 28 Jan 2021)

Log Message

Minor cleanup in CSSFontFaceSetClient
https://bugs.webkit.org/show_bug.cgi?id=221019

Reviewed by Ryosuke Niwa.

Source/WebCore:

Split up CSSFontFaceSetClient into two pieces:
- CSSFontFaceSet::FontEventClient
- CSSFontFaceSet::FontModifiedObserver

One is a Client because it's a struct with 3 callback methods that take different arguments.
The other is an observer because it's just a single callback method that takes no arguments
and has no return.

Both of these types are CanMakeWeakPtr, so lifetime is automatically managed.

Test: WTF_WeakPtr.MultipleInheritance

* css/CSSFontFaceSet.cpp:
(WebCore::CSSFontFaceSet::addFontModifiedObserver):
(WebCore::CSSFontFaceSet::addFontEventClient):
(WebCore::CSSFontFaceSet::incrementActiveCount):
(WebCore::CSSFontFaceSet::decrementActiveCount):
(WebCore::CSSFontFaceSet::add):
(WebCore::CSSFontFaceSet::remove):
(WebCore::CSSFontFaceSet::fontStateChanged):
(WebCore::CSSFontFaceSet::fontPropertyChanged):
(WebCore::CSSFontFaceSet::addClient): Deleted.
(WebCore::CSSFontFaceSet::removeClient): Deleted.
* css/CSSFontFaceSet.h:
(WebCore::CSSFontFaceSetClient::faceFinished): Deleted.
(WebCore::CSSFontFaceSetClient::fontModified): Deleted.
(WebCore::CSSFontFaceSetClient::startedLoading): Deleted.
(WebCore::CSSFontFaceSetClient::completedLoading): Deleted.
* css/CSSFontSelector.cpp:
(WebCore::CSSFontSelector::CSSFontSelector):
(WebCore::m_version):
(WebCore::CSSFontSelector::~CSSFontSelector):
* css/CSSFontSelector.h:
* css/FontFaceSet.cpp:
(WebCore::FontFaceSet::FontFaceSet):
(WebCore::FontFaceSet::~FontFaceSet):
(WebCore::FontFaceSet::startedLoading):
(WebCore::FontFaceSet::documentDidFinishLoading):
(WebCore::FontFaceSet::completedLoading):
* css/FontFaceSet.h:

Tools:

* TestWebKitAPI/Tests/WTF/WeakPtr.cpp:
(TestWebKitAPI::MultipleInheritanceDerived::meowCalled const):
(TestWebKitAPI::MultipleInheritanceDerived::woofCalled const):
(TestWebKitAPI::TEST):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (272046 => 272047)


--- trunk/Source/WebCore/ChangeLog	2021-01-29 03:57:53 UTC (rev 272046)
+++ trunk/Source/WebCore/ChangeLog	2021-01-29 04:06:40 UTC (rev 272047)
@@ -1,3 +1,51 @@
+2021-01-28  Myles C. Maxfield  <[email protected]>
+
+        Minor cleanup in CSSFontFaceSetClient
+        https://bugs.webkit.org/show_bug.cgi?id=221019
+
+        Reviewed by Ryosuke Niwa.
+
+        Split up CSSFontFaceSetClient into two pieces:
+        - CSSFontFaceSet::FontEventClient
+        - CSSFontFaceSet::FontModifiedObserver
+
+        One is a Client because it's a struct with 3 callback methods that take different arguments.
+        The other is an observer because it's just a single callback method that takes no arguments
+        and has no return.
+
+        Both of these types are CanMakeWeakPtr, so lifetime is automatically managed.
+
+        Test: WTF_WeakPtr.MultipleInheritance
+
+        * css/CSSFontFaceSet.cpp:
+        (WebCore::CSSFontFaceSet::addFontModifiedObserver):
+        (WebCore::CSSFontFaceSet::addFontEventClient):
+        (WebCore::CSSFontFaceSet::incrementActiveCount):
+        (WebCore::CSSFontFaceSet::decrementActiveCount):
+        (WebCore::CSSFontFaceSet::add):
+        (WebCore::CSSFontFaceSet::remove):
+        (WebCore::CSSFontFaceSet::fontStateChanged):
+        (WebCore::CSSFontFaceSet::fontPropertyChanged):
+        (WebCore::CSSFontFaceSet::addClient): Deleted.
+        (WebCore::CSSFontFaceSet::removeClient): Deleted.
+        * css/CSSFontFaceSet.h:
+        (WebCore::CSSFontFaceSetClient::faceFinished): Deleted.
+        (WebCore::CSSFontFaceSetClient::fontModified): Deleted.
+        (WebCore::CSSFontFaceSetClient::startedLoading): Deleted.
+        (WebCore::CSSFontFaceSetClient::completedLoading): Deleted.
+        * css/CSSFontSelector.cpp:
+        (WebCore::CSSFontSelector::CSSFontSelector):
+        (WebCore::m_version):
+        (WebCore::CSSFontSelector::~CSSFontSelector):
+        * css/CSSFontSelector.h:
+        * css/FontFaceSet.cpp:
+        (WebCore::FontFaceSet::FontFaceSet):
+        (WebCore::FontFaceSet::~FontFaceSet):
+        (WebCore::FontFaceSet::startedLoading):
+        (WebCore::FontFaceSet::documentDidFinishLoading):
+        (WebCore::FontFaceSet::completedLoading):
+        * css/FontFaceSet.h:
+
 2021-01-28  Chris Dumez  <[email protected]>
 
         [macOS] Policy for warning about or killing processes using too much memory triggers too easily

Modified: trunk/Source/WebCore/css/CSSFontFaceSet.cpp (272046 => 272047)


--- trunk/Source/WebCore/css/CSSFontFaceSet.cpp	2021-01-29 03:57:53 UTC (rev 272046)
+++ trunk/Source/WebCore/css/CSSFontFaceSet.cpp	2021-01-29 04:06:40 UTC (rev 272047)
@@ -57,15 +57,16 @@
     }
 }
 
-void CSSFontFaceSet::addClient(CSSFontFaceSetClient& client)
+void CSSFontFaceSet::addFontModifiedObserver(const FontModifiedObserver& fontModifiedObserver)
 {
-    m_clients.add(&client);
+    auto result = m_fontModifiedObservers.add(fontModifiedObserver);
+    ASSERT_UNUSED(result, result.isNewEntry);
 }
 
-void CSSFontFaceSet::removeClient(CSSFontFaceSetClient& client)
+void CSSFontFaceSet::addFontEventClient(const FontEventClient& fontEventClient)
 {
-    ASSERT(m_clients.contains(&client));
-    m_clients.remove(&client);
+    auto result = m_fontEventClients.add(fontEventClient);
+    ASSERT_UNUSED(result, result.isNewEntry);
 }
 
 void CSSFontFaceSet::incrementActiveCount()
@@ -73,8 +74,9 @@
     ++m_activeCount;
     if (m_activeCount == 1) {
         m_status = Status::Loading;
-        for (auto* client : m_clients)
-            client->startedLoading();
+        m_fontEventClients.forEach([] (auto& client) {
+            client.startedLoading();
+        });
     }
 }
 
@@ -83,8 +85,9 @@
     --m_activeCount;
     if (!m_activeCount) {
         m_status = Status::Loaded;
-        for (auto* client : m_clients)
-            client->completedLoading();
+        m_fontEventClients.forEach([] (auto& client) {
+            client.completedLoading();
+        });
     }
 }
 
@@ -184,8 +187,9 @@
 {
     ASSERT(!hasFace(face));
 
-    for (auto* client : m_clients)
-        client->fontModified();
+    m_fontModifiedObservers.forEach([] (auto& observer) {
+        observer();
+    });
 
     face.addClient(*this);
     m_cache.clear();
@@ -235,8 +239,9 @@
 
     m_cache.clear();
 
-    for (auto* client : m_clients)
-        client->fontModified();
+    m_fontModifiedObservers.forEach([] (auto& observer) {
+        observer();
+    });
     
     if (face.families() && face.families().hasValue())
         removeFromFacesLookupTable(face, *face.families().value());
@@ -502,8 +507,9 @@
     }
     if (newState == CSSFontFace::Status::Success || newState == CSSFontFace::Status::Failure) {
         ASSERT(oldState == CSSFontFace::Status::Loading || oldState == CSSFontFace::Status::TimedOut);
-        for (auto* client : m_clients)
-            client->faceFinished(face, newState);
+        m_fontEventClients.forEach([&] (auto& client) {
+            client.faceFinished(face, newState);
+        });
         decrementActiveCount();
     }
 }
@@ -517,8 +523,9 @@
         addToFacesLookupTable(face);
     }
 
-    for (auto* client : m_clients)
-        client->fontModified();
+    m_fontModifiedObservers.forEach([] (auto& observer) {
+        observer();
+    });
 }
 
 }

Modified: trunk/Source/WebCore/css/CSSFontFaceSet.h (272046 => 272047)


--- trunk/Source/WebCore/css/CSSFontFaceSet.h	2021-01-29 03:57:53 UTC (rev 272046)
+++ trunk/Source/WebCore/css/CSSFontFaceSet.h	2021-01-29 04:06:40 UTC (rev 272047)
@@ -27,7 +27,10 @@
 
 #include "CSSFontFace.h"
 #include <wtf/HashMap.h>
+#include <wtf/Observer.h>
+#include <wtf/Variant.h>
 #include <wtf/Vector.h>
+#include <wtf/WeakHashSet.h>
 #include <wtf/text/StringHash.h>
 
 namespace WebCore {
@@ -35,15 +38,6 @@
 class CSSPrimitiveValue;
 class FontFaceSet;
 
-class CSSFontFaceSetClient {
-public:
-    virtual ~CSSFontFaceSetClient() = default;
-    virtual void faceFinished(CSSFontFace&, CSSFontFace::Status) { };
-    virtual void fontModified() { };
-    virtual void startedLoading() { };
-    virtual void completedLoading() { };
-};
-
 class CSSFontFaceSet final : public RefCounted<CSSFontFaceSet>, public CSSFontFace::Client {
 public:
     static Ref<CSSFontFaceSet> create(CSSFontSelector* owningFontSelector = nullptr)
@@ -52,9 +46,17 @@
     }
     ~CSSFontFaceSet();
 
-    void addClient(CSSFontFaceSetClient&);
-    void removeClient(CSSFontFaceSetClient&);
+    using FontModifiedObserver = Observer<void()>;
+    void addFontModifiedObserver(const FontModifiedObserver&);
 
+    struct FontEventClient : public CanMakeWeakPtr<FontEventClient> {
+        virtual ~FontEventClient() = default;
+        virtual void faceFinished(CSSFontFace&, CSSFontFace::Status) = 0;
+        virtual void startedLoading() = 0;
+        virtual void completedLoading() = 0;
+    };
+    void addFontEventClient(const FontEventClient&);
+
     bool hasFace(const CSSFontFace&) const;
     size_t faceCount() const { return m_faces.size(); }
     void add(CSSFontFace&);
@@ -119,7 +121,8 @@
     HashMap<StyleRuleFontFace*, CSSFontFace*> m_constituentCSSConnections;
     size_t m_facesPartitionIndex { 0 }; // All entries in m_faces before this index are CSS-connected.
     Status m_status { Status::Loaded };
-    HashSet<CSSFontFaceSetClient*> m_clients;
+    WeakHashSet<FontModifiedObserver> m_fontModifiedObservers;
+    WeakHashSet<FontEventClient> m_fontEventClients;
     WeakPtr<CSSFontSelector> m_owningFontSelector;
     unsigned m_activeCount { 0 };
 };

Modified: trunk/Source/WebCore/css/CSSFontSelector.cpp (272046 => 272047)


--- trunk/Source/WebCore/css/CSSFontSelector.cpp	2021-01-29 03:57:53 UTC (rev 272046)
+++ trunk/Source/WebCore/css/CSSFontSelector.cpp	2021-01-29 04:06:40 UTC (rev 272047)
@@ -65,6 +65,7 @@
     : ActiveDOMObject(document)
     , m_document(makeWeakPtr(document))
     , m_cssFontFaceSet(CSSFontFaceSet::create(this))
+    , m_fontModifiedObserver([this] { fontModified(); })
     , m_fontLoadingTimer(*this, &CSSFontSelector::fontLoadingTimerFired)
     , m_uniqueId(++fontSelectorId)
     , m_version(0)
@@ -71,7 +72,7 @@
 {
     ASSERT(m_document);
     FontCache::singleton().addClient(*this);
-    m_cssFontFaceSet->addClient(*this);
+    m_cssFontFaceSet->addFontModifiedObserver(m_fontModifiedObserver);
     LOG(Fonts, "CSSFontSelector %p ctor", this);
 
     suspendIfNeeded();
@@ -82,7 +83,6 @@
     LOG(Fonts, "CSSFontSelector %p dtor", this);
 
     clearDocument();
-    m_cssFontFaceSet->removeClient(*this);
     FontCache::singleton().removeClient(*this);
 }
 

Modified: trunk/Source/WebCore/css/CSSFontSelector.h (272046 => 272047)


--- trunk/Source/WebCore/css/CSSFontSelector.h	2021-01-29 03:57:53 UTC (rev 272046)
+++ trunk/Source/WebCore/css/CSSFontSelector.h	2021-01-29 04:06:40 UTC (rev 272047)
@@ -48,7 +48,7 @@
 class Document;
 class StyleRuleFontFace;
 
-class CSSFontSelector final : public FontSelector, public CSSFontFaceSetClient, public CanMakeWeakPtr<CSSFontSelector>, public ActiveDOMObject {
+class CSSFontSelector final : public FontSelector, public CanMakeWeakPtr<CSSFontSelector>, public ActiveDOMObject {
 public:
     static Ref<CSSFontSelector> create(Document& document)
     {
@@ -98,7 +98,7 @@
 
     void opportunisticallyStartFontDataURLLoading(const FontCascadeDescription&, const AtomString& family) final;
 
-    void fontModified() final;
+    void fontModified();
 
     void fontLoadingTimerFired();
 
@@ -123,6 +123,8 @@
     HashSet<RefPtr<CSSFontFace>> m_cssConnectionsPossiblyToRemove;
     HashSet<RefPtr<StyleRuleFontFace>> m_cssConnectionsEncounteredDuringBuild;
 
+    CSSFontFaceSet::FontModifiedObserver m_fontModifiedObserver;
+
     Timer m_fontLoadingTimer;
     bool m_isFontLoadingSuspended { false };
 

Modified: trunk/Source/WebCore/css/FontFaceSet.cpp (272046 => 272047)


--- trunk/Source/WebCore/css/FontFaceSet.cpp	2021-01-29 03:57:53 UTC (rev 272046)
+++ trunk/Source/WebCore/css/FontFaceSet.cpp	2021-01-29 04:06:40 UTC (rev 272047)
@@ -60,7 +60,7 @@
     , m_backing(CSSFontFaceSet::create())
     , m_readyPromise(makeUniqueRef<ReadyPromise>(*this, &FontFaceSet::readyPromiseResolve))
 {
-    m_backing->addClient(*this);
+    m_backing->addFontEventClient(*this);
     for (auto& face : initialFaces)
         add(*face);
 }
@@ -76,12 +76,11 @@
     if (m_isDocumentLoaded && !backing.hasActiveFontFaces())
         m_readyPromise->resolve(*this);
 
-    m_backing->addClient(*this);
+    m_backing->addFontEventClient(*this);
 }
 
 FontFaceSet::~FontFaceSet()
 {
-    m_backing->removeClient(*this);
 }
 
 FontFaceSet::Iterator::Iterator(FontFaceSet& set)
@@ -191,24 +190,6 @@
     return LoadStatus::Loaded;
 }
 
-void FontFaceSet::startedLoading()
-{
-    // FIXME: Fire a "loading" event asynchronously.
-}
-
-void FontFaceSet::documentDidFinishLoading()
-{
-    m_isDocumentLoaded = true;
-    if (!m_backing->hasActiveFontFaces() && !m_readyPromise->isFulfilled())
-        m_readyPromise->resolve(*this);
-}
-
-void FontFaceSet::completedLoading()
-{
-    if (m_isDocumentLoaded && !m_readyPromise->isFulfilled())
-        m_readyPromise->resolve(*this);
-}
-
 void FontFaceSet::faceFinished(CSSFontFace& face, CSSFontFace::Status newStatus)
 {
     if (!face.existingWrapper())
@@ -234,6 +215,24 @@
     }
 }
 
+void FontFaceSet::startedLoading()
+{
+    // FIXME: Fire a "loading" event asynchronously.
+}
+
+void FontFaceSet::documentDidFinishLoading()
+{
+    m_isDocumentLoaded = true;
+    if (!m_backing->hasActiveFontFaces() && !m_readyPromise->isFulfilled())
+        m_readyPromise->resolve(*this);
+}
+
+void FontFaceSet::completedLoading()
+{
+    if (m_isDocumentLoaded && !m_readyPromise->isFulfilled())
+        m_readyPromise->resolve(*this);
+}
+
 FontFaceSet& FontFaceSet::readyPromiseResolve()
 {
     return *this;

Modified: trunk/Source/WebCore/css/FontFaceSet.h (272046 => 272047)


--- trunk/Source/WebCore/css/FontFaceSet.h	2021-01-29 03:57:53 UTC (rev 272046)
+++ trunk/Source/WebCore/css/FontFaceSet.h	2021-01-29 04:06:40 UTC (rev 272047)
@@ -38,7 +38,7 @@
 
 class DOMException;
 
-class FontFaceSet final : public RefCounted<FontFaceSet>, private CSSFontFaceSetClient, public EventTargetWithInlineData, public ActiveDOMObject {
+class FontFaceSet final : public RefCounted<FontFaceSet>, private CSSFontFaceSet::FontEventClient, public EventTargetWithInlineData, public ActiveDOMObject {
     WTF_MAKE_ISO_ALLOCATED(FontFaceSet);
 public:
     static Ref<FontFaceSet> create(Document&, const Vector<RefPtr<FontFace>>& initialFaces);
@@ -98,10 +98,10 @@
     FontFaceSet(Document&, const Vector<RefPtr<FontFace>>&);
     FontFaceSet(Document&, CSSFontFaceSet&);
 
-    // CSSFontFaceSetClient
+    // CSSFontFaceSet::FontEventClient
+    void faceFinished(CSSFontFace&, CSSFontFace::Status) final;
     void startedLoading() final;
     void completedLoading() final;
-    void faceFinished(CSSFontFace&, CSSFontFace::Status) final;
 
     // ActiveDOMObject
     const char* activeDOMObjectName() const final { return "FontFaceSet"; }

Modified: trunk/Tools/ChangeLog (272046 => 272047)


--- trunk/Tools/ChangeLog	2021-01-29 03:57:53 UTC (rev 272046)
+++ trunk/Tools/ChangeLog	2021-01-29 04:06:40 UTC (rev 272047)
@@ -1,3 +1,15 @@
+2021-01-28  Myles C. Maxfield  <[email protected]>
+
+        Minor cleanup in CSSFontFaceSetClient
+        https://bugs.webkit.org/show_bug.cgi?id=221019
+
+        Reviewed by Ryosuke Niwa.
+
+        * TestWebKitAPI/Tests/WTF/WeakPtr.cpp:
+        (TestWebKitAPI::MultipleInheritanceDerived::meowCalled const):
+        (TestWebKitAPI::MultipleInheritanceDerived::woofCalled const):
+        (TestWebKitAPI::TEST):
+
 2021-01-28  Jonathan Bedard  <[email protected]>
 
         [webkitcrepy] Handle case where pypi serves invalid html

Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/WeakPtr.cpp (272046 => 272047)


--- trunk/Tools/TestWebKitAPI/Tests/WTF/WeakPtr.cpp	2021-01-29 03:57:53 UTC (rev 272046)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/WeakPtr.cpp	2021-01-29 04:06:40 UTC (rev 272047)
@@ -780,4 +780,63 @@
     }
 }
 
+class MultipleInheritanceBase1 : public CanMakeWeakPtr<MultipleInheritanceBase1> {
+public:
+    virtual void meow() = 0;
+
+    int dummy; // Prevent empty base class optimization, to make testing more interesting.
+};
+
+class MultipleInheritanceBase2 : public CanMakeWeakPtr<MultipleInheritanceBase2> {
+public:
+    virtual void woof() = 0;
+
+    int dummy; // Prevent empty base class optimization, to make testing more interesting.
+};
+
+class MultipleInheritanceDerived : public MultipleInheritanceBase1, public MultipleInheritanceBase2 {
+public:
+    bool meowCalled() const
+    {
+        return m_meowCalled;
+    }
+    bool woofCalled() const
+    {
+        return m_woofCalled;
+    }
+
+private:
+    void meow() final
+    {
+        m_meowCalled = true;
+    }
+
+    void woof() final
+    {
+        m_woofCalled = true;
+    }
+
+    bool m_meowCalled { false };
+    bool m_woofCalled { false };
+};
+
+TEST(WTF_WeakPtr, MultipleInheritance)
+{
+    WeakHashSet<MultipleInheritanceBase1> base1Set;
+    WeakHashSet<MultipleInheritanceBase2> base2Set;
+    {
+        MultipleInheritanceDerived derived;
+        base1Set.add(derived);
+        base2Set.add(derived);
+        for (MultipleInheritanceBase1& base1 : base1Set)
+            base1.meow();
+        for (MultipleInheritanceBase2& base2 : base2Set)
+            base2.woof();
+        EXPECT_TRUE(derived.meowCalled());
+        EXPECT_TRUE(derived.woofCalled());
+    }
+    EXPECT_TRUE(base1Set.computesEmpty());
+    EXPECT_TRUE(base2Set.computesEmpty());
+}
+
 } // namespace TestWebKitAPI
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to