Changeset 281845 in webkit


Ignore:
Timestamp:
Sep 1, 2021, 2:38:09 AM (4 years ago)
Author:
mmaxfield@apple.com
Message:

document.fonts.size needs to update style so it doesn't return stale values
https://bugs.webkit.org/show_bug.cgi?id=229644

Reviewed by Darin Adler.

LayoutTests/imported/w3c:

  • web-platform-tests/css/css-font-loading/fontfaceset-update-after-stylesheet-change-expected.txt:

Source/WebCore:

Currently, we only update style inside the document::fonts() call.
This isn't correct because content can save the results of document.fonts,
do some work, then ask for its size.

Test: web-platform-tests/css/css-font-loading/fontfaceset-update-after-stylesheet-change.html

  • css/CSSFontFace.cpp:

(WebCore::CSSFontFace::updateStyleIfNeeded):

  • css/CSSFontFace.h:
  • css/CSSFontFaceSet.cpp:

(WebCore::CSSFontFaceSet::updateStyleIfNeeded):

  • css/CSSFontFaceSet.h:
  • css/CSSFontSelector.cpp:

(WebCore::CSSFontSelector::updateStyleIfNeeded):
(WebCore::CSSFontSelector::fontStyleUpdateNeeded): Deleted.

  • css/CSSFontSelector.h:
  • css/FontFaceSet.cpp:

(WebCore::FontFaceSet::size):
(WebCore::FontFaceSet::size const): Deleted.

  • css/FontFaceSet.h:
  • dom/Document.cpp:

(WebCore::Document::fonts):

Location:
trunk
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r281842 r281845  
     12021-09-01  Myles C. Maxfield  <mmaxfield@apple.com>
     2
     3        document.fonts.size needs to update style so it doesn't return stale values
     4        https://bugs.webkit.org/show_bug.cgi?id=229644
     5
     6        Reviewed by Darin Adler.
     7
     8        * web-platform-tests/css/css-font-loading/fontfaceset-update-after-stylesheet-change-expected.txt:
     9
    1102021-09-01  Myles C. Maxfield  <mmaxfield@apple.com>
    211
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/fontfaceset-update-after-stylesheet-change-expected.txt

    r281836 r281845  
    11
    2 FAIL fontfaceset-update-after-stylesheet-change assert_equals: expected 0 but got 1
     2PASS fontfaceset-update-after-stylesheet-change
    33
  • trunk/Source/WebCore/ChangeLog

    r281842 r281845  
     12021-09-01  Myles C. Maxfield  <mmaxfield@apple.com>
     2
     3        document.fonts.size needs to update style so it doesn't return stale values
     4        https://bugs.webkit.org/show_bug.cgi?id=229644
     5
     6        Reviewed by Darin Adler.
     7
     8        Currently, we only update style inside the document::fonts() call.
     9        This isn't correct because content can save the results of document.fonts,
     10        do some work, then ask for its size.
     11
     12        Test: web-platform-tests/css/css-font-loading/fontfaceset-update-after-stylesheet-change.html
     13
     14        * css/CSSFontFace.cpp:
     15        (WebCore::CSSFontFace::updateStyleIfNeeded):
     16        * css/CSSFontFace.h:
     17        * css/CSSFontFaceSet.cpp:
     18        (WebCore::CSSFontFaceSet::updateStyleIfNeeded):
     19        * css/CSSFontFaceSet.h:
     20        * css/CSSFontSelector.cpp:
     21        (WebCore::CSSFontSelector::updateStyleIfNeeded):
     22        (WebCore::CSSFontSelector::fontStyleUpdateNeeded): Deleted.
     23        * css/CSSFontSelector.h:
     24        * css/FontFaceSet.cpp:
     25        (WebCore::FontFaceSet::size):
     26        (WebCore::FontFaceSet::size const): Deleted.
     27        * css/FontFaceSet.h:
     28        * dom/Document.cpp:
     29        (WebCore::Document::fonts):
     30
    1312021-09-01  Myles C. Maxfield  <mmaxfield@apple.com>
    232
  • trunk/Source/WebCore/css/CSSFontFace.cpp

    r278466 r281845  
    700700{
    701701    iterateClients(m_clients, [&](Client& client) {
    702         client.fontStyleUpdateNeeded(*this);
     702        client.updateStyleIfNeeded(*this);
    703703    });
    704704}
  • trunk/Source/WebCore/css/CSSFontFace.h

    r278466 r281845  
    126126        virtual void fontStateChanged(CSSFontFace&, Status /*oldState*/, Status /*newState*/) { }
    127127        virtual void fontPropertyChanged(CSSFontFace&, CSSValueList* /*oldFamilies*/ = nullptr) { }
    128         virtual void fontStyleUpdateNeeded(CSSFontFace&) { }
     128        virtual void updateStyleIfNeeded(CSSFontFace&) { }
    129129        virtual void ref() = 0;
    130130        virtual void deref() = 0;
  • trunk/Source/WebCore/css/CSSFontFaceSet.cpp

    r281648 r281845  
    104104}
    105105
     106// Calling updateStyleIfNeeded() might delete |this|.
     107void CSSFontFaceSet::updateStyleIfNeeded()
     108{
     109    if (m_owningFontSelector)
     110        m_owningFontSelector->updateStyleIfNeeded();
     111}
     112
    106113void CSSFontFaceSet::ensureLocalFontFacesForFamilyRegistered(const String& familyName)
    107114{
  • trunk/Source/WebCore/css/CSSFontFaceSet.h

    r281842 r281845  
    5858    void addFontEventClient(const FontEventClient&);
    5959
     60    // Calling updateStyleIfNeeded() might delete |this|.
     61    void updateStyleIfNeeded();
     62
    6063    bool hasFace(const CSSFontFace&) const;
    6164    size_t faceCount() const { return m_faces.size(); }
     
    8588    void ref() final { RefCounted::ref(); }
    8689    void deref() final { RefCounted::deref(); }
     90    // FIXME: Should this be implemented?
     91    void updateStyleIfNeeded(CSSFontFace&) final { }
    8792
    8893private:
  • trunk/Source/WebCore/css/CSSFontSelector.cpp

    r278466 r281845  
    270270}
    271271
    272 void CSSFontSelector::fontStyleUpdateNeeded(CSSFontFace&)
     272void CSSFontSelector::updateStyleIfNeeded()
    273273{
    274274    if (is<Document>(m_context.get()))
    275275        downcast<Document>(*m_context).updateStyleIfNeeded();
     276}
     277
     278void CSSFontSelector::updateStyleIfNeeded(CSSFontFace&)
     279{
     280    updateStyleIfNeeded();
    276281}
    277282
  • trunk/Source/WebCore/css/CSSFontSelector.h

    r278253 r281845  
    9090    void loadPendingFonts();
    9191
     92    void updateStyleIfNeeded();
     93
    9294    // CSSFontFace::Client needs to be able to be held in a RefPtr.
    9395    void ref() final { FontSelector::ref(); }
     
    105107    // CSSFontFace::Client
    106108    void fontLoaded(CSSFontFace&) final;
    107     void fontStyleUpdateNeeded(CSSFontFace&) final;
     109    void updateStyleIfNeeded(CSSFontFace&) final;
    108110
    109111    void fontModified();
  • trunk/Source/WebCore/css/FontFaceSet.cpp

    r281842 r281845  
    111111}
    112112
    113 size_t FontFaceSet::size() const
    114 {
    115     return m_backing->faceCount();
     113size_t FontFaceSet::size()
     114{
     115    auto protect = m_backing;
     116    protect->updateStyleIfNeeded();
     117    return protect->faceCount();
    116118}
    117119
  • trunk/Source/WebCore/css/FontFaceSet.h

    r274143 r281845  
    4747
    4848    bool has(FontFace&) const;
    49     size_t size() const;
     49    size_t size();
    5050    FontFaceSet& add(FontFace&);
    5151    bool remove(FontFace&);
  • trunk/Source/WebCore/dom/Document.cpp

    r281839 r281845  
    74457445Ref<FontFaceSet> Document::fonts()
    74467446{
    7447     updateStyleIfNeeded();
     7447    updateStyleIfNeeded(); // FIXME: This is unnecessary. Instead, the actual accessors in the FontFaceSet need to update style.
    74487448    return fontSelector().fontFaceSet();
    74497449}
Note: See TracChangeset for help on using the changeset viewer.