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