Changeset 224535 in webkit


Ignore:
Timestamp:
Nov 7, 2017 10:10:40 AM (6 years ago)
Author:
Antti Koivisto
Message:

Dynamic media queries don't update in shadow tree stylesheets
https://bugs.webkit.org/show_bug.cgi?id=179324

Reviewed by Ryosuke Niwa.

Source/WebCore:

Viewport and accessibility queries should work dynamically also in shadow trees.

Test: fast/shadow-dom/media-query-in-shadow-style.html

  • page/LayoutContext.cpp:

(WebCore::LayoutContext::updateStyleForLayout):

  • page/Page.cpp:

(WebCore::Page::accessibilitySettingsDidChange):

Evaluate media query list (JS API) unconditionally as it is independent from style queries.
Remove some logging.

  • style/StyleScope.cpp:

(WebCore::Style::Scope::evaluateMediaQueriesForViewportChange):
(WebCore::Style::Scope::evaluateMediaQueriesForAccessibilitySettingsChange):

Factor into functions in style scope.

(WebCore::Style::Scope::evaluateMediaQueries):

Evaluate queries in all shadow trees too.

  • style/StyleScope.h:

LayoutTests:

  • fast/shadow-dom/media-query-in-shadow-style-expected.html: Added.
  • fast/shadow-dom/media-query-in-shadow-style.html: Added.
  • fast/shadow-dom/resources/media-query-in-shadow-style-frame.html: Added.
Location:
trunk
Files:
3 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r224532 r224535  
     12017-11-07  Antti Koivisto  <antti@apple.com>
     2
     3        Dynamic media queries don't update in shadow tree stylesheets
     4        https://bugs.webkit.org/show_bug.cgi?id=179324
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        * fast/shadow-dom/media-query-in-shadow-style-expected.html: Added.
     9        * fast/shadow-dom/media-query-in-shadow-style.html: Added.
     10        * fast/shadow-dom/resources/media-query-in-shadow-style-frame.html: Added.
     11
    1122017-11-07  Youenn Fablet  <youenn@apple.com>
    213
  • trunk/Source/WebCore/ChangeLog

    r224534 r224535  
     12017-11-07  Antti Koivisto  <antti@apple.com>
     2
     3        Dynamic media queries don't update in shadow tree stylesheets
     4        https://bugs.webkit.org/show_bug.cgi?id=179324
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        Viewport and accessibility queries should work dynamically also in shadow trees.
     9
     10        Test: fast/shadow-dom/media-query-in-shadow-style.html
     11
     12        * page/LayoutContext.cpp:
     13        (WebCore::LayoutContext::updateStyleForLayout):
     14        * page/Page.cpp:
     15        (WebCore::Page::accessibilitySettingsDidChange):
     16
     17            Evaluate media query list (JS API) unconditionally as it is independent from style queries.
     18            Remove some logging.
     19
     20        * style/StyleScope.cpp:
     21        (WebCore::Style::Scope::evaluateMediaQueriesForViewportChange):
     22        (WebCore::Style::Scope::evaluateMediaQueriesForAccessibilitySettingsChange):
     23
     24            Factor into functions in style scope.
     25
     26        (WebCore::Style::Scope::evaluateMediaQueries):
     27
     28            Evaluate queries in all shadow trees too.
     29
     30        * style/StyleScope.h:
     31
    1322017-11-07  Ryosuke Niwa  <rniwa@webkit.org>
    233
  • trunk/Source/WebCore/page/LayoutContext.cpp

    r224529 r224535  
    480480    Document& document = *frame().document();
    481481    // Viewport-dependent media queries may cause us to need completely different style information.
    482     auto* styleResolver = document.styleScope().resolverIfExists();
    483     if (!styleResolver || styleResolver->hasMediaQueriesAffectedByViewportChange()) {
    484         LOG(Layout, "  hasMediaQueriesAffectedByViewportChange, enqueueing style recalc");
    485         document.styleScope().didChangeStyleSheetEnvironment();
    486         // FIXME: This instrumentation event is not strictly accurate since cached media query results do not persist across StyleResolver rebuilds.
    487         InspectorInstrumentation::mediaQueryResultChanged(document);
    488     }
     482    document.styleScope().evaluateMediaQueriesForViewportChange();
     483
    489484    document.evaluateMediaQueryList();
    490485    // If there is any pagination to apply, it will affect the RenderView's style, so we should
  • trunk/Source/WebCore/page/Page.cpp

    r224371 r224535  
    22812281void Page::accessibilitySettingsDidChange()
    22822282{
    2283     bool neededRecalc = false;
    2284 
    2285     for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext()) {
    2286         if (Document* document = frame->document()) {
    2287             auto* styleResolver = document->styleScope().resolverIfExists();
    2288             if (styleResolver && styleResolver->hasMediaQueriesAffectedByAccessibilitySettingsChange()) {
    2289                 document->styleScope().didChangeStyleSheetEnvironment();
    2290                 document->evaluateMediaQueryList();
    2291                 neededRecalc = true;
    2292                 // FIXME: This instrumentation event is not strictly accurate since cached media query results do not persist across StyleResolver rebuilds.
    2293                 InspectorInstrumentation::mediaQueryResultChanged(*document);
    2294             }
     2283    for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext()) {
     2284        if (auto* document = frame->document()) {
     2285            document->styleScope().evaluateMediaQueriesForAccessibilitySettingsChange();
     2286            document->evaluateMediaQueryList();
    22952287        }
    22962288    }
    2297 
    2298     if (neededRecalc)
    2299         LOG(Layout, "hasMediaQueriesAffectedByAccessibilitySettingsChange, enqueueing style recalc");
    23002289}
    23012290
  • trunk/Source/WebCore/style/StyleScope.cpp

    r224495 r224535  
    601601}
    602602
     603void Scope::evaluateMediaQueriesForViewportChange()
     604{
     605    evaluateMediaQueries([] (StyleResolver& resolver) {
     606        return resolver.hasMediaQueriesAffectedByViewportChange();
     607    });
     608}
     609
     610void Scope::evaluateMediaQueriesForAccessibilitySettingsChange()
     611{
     612    evaluateMediaQueries([] (StyleResolver& resolver) {
     613        return resolver.hasMediaQueriesAffectedByAccessibilitySettingsChange();
     614    });
     615}
     616
     617template <typename TestFunction>
     618void Scope::evaluateMediaQueries(TestFunction&& testFunction)
     619{
     620    if (!m_shadowRoot) {
     621        for (auto* descendantShadowRoot : m_document.inDocumentShadowRoots())
     622            descendantShadowRoot->styleScope().evaluateMediaQueries(testFunction);
     623    }
     624    auto* resolver = resolverIfExists();
     625    if (!resolver)
     626        return;
     627    if (!testFunction(*resolver))
     628        return;
     629    scheduleUpdate(UpdateType::ContentsOrInterpretation);
     630    InspectorInstrumentation::mediaQueryResultChanged(m_document);
     631}
     632
    603633void Scope::didChangeActiveStyleSheetCandidates()
    604634{
  • trunk/Source/WebCore/style/StyleScope.h

    r224146 r224535  
    9898    bool activeStyleSheetsContains(const CSSStyleSheet*) const;
    9999
     100    void evaluateMediaQueriesForViewportChange();
     101    void evaluateMediaQueriesForAccessibilitySettingsChange();
     102
    100103    // This is called when some stylesheet becomes newly enabled or disabled.
    101104    void didChangeActiveStyleSheetCandidates();
     
    131134    void scheduleUpdate(UpdateType);
    132135
     136    template <typename TestFunction> void evaluateMediaQueries(TestFunction&&);
     137
    133138    WEBCORE_EXPORT void flushPendingSelfUpdate();
    134139    WEBCORE_EXPORT void flushPendingDescendantUpdates();
Note: See TracChangeset for help on using the changeset viewer.