⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 242091 in webkit


Ignore:
Timestamp:
Feb 26, 2019, 10:20:33 AM (8 years ago)
Author:
Alan Bujtas
Message:

[ContentChangeObserver] Move CheckForVisibilityChange to ContentChangeObserver class
​https://bugs.webkit.org/show_bug.cgi?id=195035
<rdar://problem/48389123>

Reviewed by Tim Horton.

Visibility checking logic belongs to ContentChangeObserver.

  • page/ios/ContentChangeObserver.h:
  • page/ios/ContentChangeObserver.mm:

(WebCore::elementImplicitVisibility):
(WebCore::ContentChangeObserver::StyleChange::StyleChange):
(WebCore::ContentChangeObserver::StyleChange::~StyleChange):

  • rendering/updating/RenderTreeUpdater.cpp:

(WebCore::RenderTreeUpdater::updateElementRenderer):
(WebCore::elementImplicitVisibility): Deleted.
(WebCore::CheckForVisibilityChange::CheckForVisibilityChange): Deleted.
(WebCore::CheckForVisibilityChange::~CheckForVisibilityChange): Deleted.

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r242084 r242091  
     12019-02-26  Zalan Bujtas  <zalan@apple.com>
     2
     3        [ContentChangeObserver] Move CheckForVisibilityChange to ContentChangeObserver class
     4        https://bugs.webkit.org/show_bug.cgi?id=195035
     5        <rdar://problem/48389123>
     6
     7        Reviewed by Tim Horton.
     8
     9        Visibility checking logic belongs to ContentChangeObserver.
     10
     11        * page/ios/ContentChangeObserver.h:
     12        * page/ios/ContentChangeObserver.mm:
     13        (WebCore::elementImplicitVisibility):
     14        (WebCore::ContentChangeObserver::StyleChange::StyleChange):
     15        (WebCore::ContentChangeObserver::StyleChange::~StyleChange):
     16        * rendering/updating/RenderTreeUpdater.cpp:
     17        (WebCore::RenderTreeUpdater::updateElementRenderer):
     18        (WebCore::elementImplicitVisibility): Deleted.
     19        (WebCore::CheckForVisibilityChange::CheckForVisibilityChange): Deleted.
     20        (WebCore::CheckForVisibilityChange::~CheckForVisibilityChange): Deleted.
     21
    1222019-02-26  Philippe Normand  <pnormand@igalia.com>
    223
  • trunk/Source/WebCore/page/ios/ContentChangeObserver.h

    r242060 r242091  
    4646    WEBCORE_EXPORT void startObservingContentChanges();
    4747    WEBCORE_EXPORT void stopObservingContentChanges();
    48     bool isObservingContentChanges();
    4948
    5049    WEBCORE_EXPORT void startObservingDOMTimerScheduling();
    … …  
    6261    WEBCORE_EXPORT void clearObservedDOMTimers();
    6362
     63    class StyleChange {
     64    public:
     65        StyleChange(const Element&, ContentChangeObserver&);
     66        ~StyleChange();
     67
     68    private:
     69        const Element& m_element;
     70        ContentChangeObserver& m_contentChangeObserver;
     71        DisplayType m_previousDisplay;
     72        Visibility m_previousVisibility;
     73        Visibility m_previousImplicitVisibility;
     74    };
     75
    6476private:
    6577    void addObservedDOMTimer(const DOMTimer&);
    … …  
    7183    void stopObservingStyleRecalcScheduling();
    7284
     85    bool isObservingContentChanges();
     86
    7387    Page& m_page;
    7488};
  • trunk/Source/WebCore/page/ios/ContentChangeObserver.mm

    r242060 r242091  
    188188}
    189189
     190static Visibility elementImplicitVisibility(const Element& element)
     191{
     192    auto* renderer = element.renderer();
     193    if (!renderer)
     194        return Visibility::Visible;
     195
     196    auto& style = renderer->style();
     197
     198    auto width = style.width();
     199    auto height = style.height();
     200    if ((width.isFixed() && width.value() <= 0) || (height.isFixed() && height.value() <= 0))
     201        return Visibility::Hidden;
     202
     203    auto top = style.top();
     204    auto left = style.left();
     205    if (left.isFixed() && width.isFixed() && -left.value() >= width.value())
     206        return Visibility::Hidden;
     207
     208    if (top.isFixed() && height.isFixed() && -top.value() >= height.value())
     209        return Visibility::Hidden;
     210    return Visibility::Visible;
     211}
     212
     213ContentChangeObserver::StyleChange::StyleChange(const Element& element, ContentChangeObserver& contentChangeObserver)
     214    : m_element(element)
     215    , m_contentChangeObserver(contentChangeObserver)
     216    , m_previousDisplay(element.renderStyle() ? element.renderStyle()->display() : DisplayType::None)
     217    , m_previousVisibility(element.renderStyle() ? element.renderStyle()->visibility() : Visibility::Hidden)
     218    , m_previousImplicitVisibility(contentChangeObserver.isObservingContentChanges() && contentChangeObserver.observedContentChange() != WKContentVisibilityChange ? elementImplicitVisibility(element) : Visibility::Visible)
     219{
     220}
     221
     222ContentChangeObserver::StyleChange::~StyleChange()
     223{
     224    if (!m_contentChangeObserver.isObservingContentChanges())
     225        return;
     226
     227    auto* style = m_element.renderStyle();
     228    auto qualifiesForVisibilityCheck = [&] {
     229        if (!style)
     230            return false;
     231        if (m_element.isInUserAgentShadowTree())
     232            return false;
     233        if (!const_cast<Element&>(m_element).willRespondToMouseClickEvents())
     234            return false;
     235        return true;
     236    };
     237
     238    if (!qualifiesForVisibilityCheck())
     239        return;
     240
     241    if ((m_previousDisplay == DisplayType::None && style->display() != DisplayType::None)
     242        || (m_previousVisibility == Visibility::Hidden && style->visibility() != Visibility::Hidden)
     243        || (m_previousImplicitVisibility == Visibility::Hidden && elementImplicitVisibility(m_element) == Visibility::Visible))
     244        m_contentChangeObserver.setObservedContentChange(WKContentVisibilityChange);
     245}
    190246}
    191247
  • trunk/Source/WebCore/rendering/updating/RenderTreeUpdater.cpp

    r242032 r242091  
    5656namespace WebCore {
    5757
    58 #if PLATFORM(IOS_FAMILY)
    59 class CheckForVisibilityChange {
    60 public:
    61     CheckForVisibilityChange(const Element&, Page*);
    62     ~CheckForVisibilityChange();
    63 
    64 private:
    65     const Element& m_element;
    66     Page* m_page { nullptr };
    67     DisplayType m_previousDisplay;
    68     Visibility m_previousVisibility;
    69     Visibility m_previousImplicitVisibility;
    70 };
    71 #endif // PLATFORM(IOS_FAMILY)
    72 
    7358RenderTreeUpdater::Parent::Parent(ContainerNode& root)
    7459    : element(is<Document>(root) ? nullptr : downcast<Element>(&root))
    … …  
    309294{
    310295#if PLATFORM(IOS_FAMILY)
    311     CheckForVisibilityChange checkForVisibilityChange(element, m_document.page());
     296    ContentChangeObserver::StyleChange checkForStyleChange(element, m_document.page()->contentChangeObserver());
    312297#endif
    313298
    … …  
    644629}
    645630
    646 #if PLATFORM(IOS_FAMILY)
    647 static Visibility elementImplicitVisibility(const Element& element)
    648 {
    649     auto* renderer = element.renderer();
    650     if (!renderer)
    651         return Visibility::Visible;
    652 
    653     auto& style = renderer->style();
    654 
    655     auto width = style.width();
    656     auto height = style.height();
    657     if ((width.isFixed() && width.value() <= 0) || (height.isFixed() && height.value() <= 0))
    658         return Visibility::Hidden;
    659 
    660     auto top = style.top();
    661     auto left = style.left();
    662     if (left.isFixed() && width.isFixed() && -left.value() >= width.value())
    663         return Visibility::Hidden;
    664 
    665     if (top.isFixed() && height.isFixed() && -top.value() >= height.value())
    666         return Visibility::Hidden;
    667     return Visibility::Visible;
    668 }
    669 
    670 CheckForVisibilityChange::CheckForVisibilityChange(const Element& element, Page* page)
    671     : m_element(element)
    672     , m_page(page)
    673     , m_previousDisplay(element.renderStyle() ? element.renderStyle()->display() : DisplayType::None)
    674     , m_previousVisibility(element.renderStyle() ? element.renderStyle()->visibility() : Visibility::Hidden)
    675     , m_previousImplicitVisibility(page && page->contentChangeObserver().isObservingContentChanges() && page->contentChangeObserver().observedContentChange() != WKContentVisibilityChange ? elementImplicitVisibility(element) : Visibility::Visible)
    676 {
    677 }
    678 
    679 CheckForVisibilityChange::~CheckForVisibilityChange()
    680 {
    681     if (!m_page)
    682         return;
    683 
    684     auto& contentChangeObserver = m_page->contentChangeObserver();
    685     if (!contentChangeObserver.isObservingContentChanges())
    686         return;
    687 
    688     auto* style = m_element.renderStyle();
    689 
    690     auto qualifiesForVisibilityCheck = [&] {
    691         if (!style)
    692             return false;
    693         if (m_element.isInUserAgentShadowTree())
    694             return false;
    695         if (!const_cast<Element&>(m_element).willRespondToMouseClickEvents())
    696             return false;
    697         return true;
    698     };
    699 
    700     if (!qualifiesForVisibilityCheck())
    701         return;
    702     if ((m_previousDisplay == DisplayType::None && style->display() != DisplayType::None) || (m_previousVisibility == Visibility::Hidden && style->visibility() != Visibility::Hidden)
    703         || (m_previousImplicitVisibility == Visibility::Hidden && elementImplicitVisibility(m_element) == Visibility::Visible))
    704         contentChangeObserver.setObservedContentChange(WKContentVisibilityChange);
    705 }
    706 #endif
    707 
    708 }
     631}
Note: See TracChangeset for help on using the changeset viewer.