Title: [243305] trunk/Source/WebCore
- Revision
- 243305
- Author
- [email protected]
- Date
- 2019-03-21 11:38:39 -0700 (Thu, 21 Mar 2019)
Log Message
[ContentChangeObserver] Track hidden elements only while transitioning.
https://bugs.webkit.org/show_bug.cgi?id=196050
<rdar://problem/49092037>
Reviewed by Simon Fraser.
Use the existing isConsideredHidden() logic to decide whether the current transition should be tracked.
* page/ios/ContentChangeObserver.cpp:
(WebCore::isConsideredHidden):
(WebCore::ContentChangeObserver::didAddTransition):
(WebCore::ContentChangeObserver::StyleChangeScope::StyleChangeScope):
(WebCore::ContentChangeObserver::StyleChangeScope::~StyleChangeScope):
(WebCore::ContentChangeObserver::StyleChangeScope::isConsideredHidden const): Deleted.
* page/ios/ContentChangeObserver.h:
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (243304 => 243305)
--- trunk/Source/WebCore/ChangeLog 2019-03-21 18:33:11 UTC (rev 243304)
+++ trunk/Source/WebCore/ChangeLog 2019-03-21 18:38:39 UTC (rev 243305)
@@ -1,5 +1,23 @@
2019-03-21 Zalan Bujtas <[email protected]>
+ [ContentChangeObserver] Track hidden elements only while transitioning.
+ https://bugs.webkit.org/show_bug.cgi?id=196050
+ <rdar://problem/49092037>
+
+ Reviewed by Simon Fraser.
+
+ Use the existing isConsideredHidden() logic to decide whether the current transition should be tracked.
+
+ * page/ios/ContentChangeObserver.cpp:
+ (WebCore::isConsideredHidden):
+ (WebCore::ContentChangeObserver::didAddTransition):
+ (WebCore::ContentChangeObserver::StyleChangeScope::StyleChangeScope):
+ (WebCore::ContentChangeObserver::StyleChangeScope::~StyleChangeScope):
+ (WebCore::ContentChangeObserver::StyleChangeScope::isConsideredHidden const): Deleted.
+ * page/ios/ContentChangeObserver.h:
+
+2019-03-21 Zalan Bujtas <[email protected]>
+
[ContentChangeObserver] Add support for observing implicit transitions
https://bugs.webkit.org/show_bug.cgi?id=195914
<rdar://problem/49091959>
Modified: trunk/Source/WebCore/page/ios/ContentChangeObserver.cpp (243304 => 243305)
--- trunk/Source/WebCore/page/ios/ContentChangeObserver.cpp 2019-03-21 18:33:11 UTC (rev 243304)
+++ trunk/Source/WebCore/page/ios/ContentChangeObserver.cpp 2019-03-21 18:38:39 UTC (rev 243305)
@@ -42,6 +42,43 @@
static const Seconds maximumDelayForTimers { 300_ms };
static const Seconds maximumDelayForTransitions { 300_ms };
+static bool isConsideredHidden(const Element& element)
+{
+ if (!element.renderStyle())
+ return true;
+
+ auto& style = *element.renderStyle();
+ if (style.display() == DisplayType::None)
+ return true;
+
+ if (style.visibility() == Visibility::Hidden)
+ return true;
+
+ auto width = style.logicalWidth();
+ auto height = style.logicalHeight();
+ if ((width.isFixed() && !width.value()) || (height.isFixed() && !height.value()))
+ return true;
+
+ auto top = style.logicalTop();
+ auto left = style.logicalLeft();
+ // FIXME: This is trying to check if the element is outside of the viewport. This is incorrect for many reasons.
+ if (left.isFixed() && width.isFixed() && -left.value() >= width.value())
+ return true;
+ if (top.isFixed() && height.isFixed() && -top.value() >= height.value())
+ return true;
+
+ // It's a common technique used to position content offscreen.
+ if (style.hasOutOfFlowPosition() && left.isFixed() && left.value() <= -999)
+ return true;
+
+ // FIXME: Check for other cases like zero height with overflow hidden.
+ auto maxHeight = style.maxHeight();
+ if (maxHeight.isFixed() && !maxHeight.value())
+ return true;
+
+ return false;
+}
+
ContentChangeObserver::ContentChangeObserver(Document& document)
: m_document(document)
, m_contentObservationTimer([this] { completeDurationBasedContentObservation(); })
@@ -99,6 +136,8 @@
auto transitionEnd = Seconds { transition.duration() + std::max<double>(0, transition.isDelaySet() ? transition.delay() : 0) };
if (transitionEnd > maximumDelayForTransitions)
return;
+ if (!isConsideredHidden(element))
+ return;
LOG_WITH_STREAM(ContentObservation, stream << "didAddTransition: transition created on " << &element << " (" << transitionEnd.milliseconds() << "ms).");
m_elementsWithTransition.add(&element);
@@ -384,13 +423,13 @@
, m_hadRenderer(element.renderer())
{
if (m_contentChangeObserver.isObservingContentChanges() && !m_contentChangeObserver.hasVisibleChangeState())
- m_wasHidden = isConsideredHidden();
+ m_wasHidden = isConsideredHidden(m_element);
}
ContentChangeObserver::StyleChangeScope::~StyleChangeScope()
{
auto changedFromHiddenToVisible = [&] {
- return m_wasHidden && !isConsideredHidden();
+ return m_wasHidden && !isConsideredHidden(m_element);
};
if (changedFromHiddenToVisible() && isConsideredClickable())
@@ -397,43 +436,6 @@
m_contentChangeObserver.contentVisibilityDidChange();
}
-bool ContentChangeObserver::StyleChangeScope::isConsideredHidden() const
-{
- if (!m_element.renderStyle())
- return true;
-
- auto& style = *m_element.renderStyle();
- if (style.display() == DisplayType::None)
- return true;
-
- if (style.visibility() == Visibility::Hidden)
- return true;
-
- auto width = style.logicalWidth();
- auto height = style.logicalHeight();
- if ((width.isFixed() && !width.value()) || (height.isFixed() && !height.value()))
- return true;
-
- auto top = style.logicalTop();
- auto left = style.logicalLeft();
- // FIXME: This is trying to check if the element is outside of the viewport. This is incorrect for many reasons.
- if (left.isFixed() && width.isFixed() && -left.value() >= width.value())
- return true;
- if (top.isFixed() && height.isFixed() && -top.value() >= height.value())
- return true;
-
- // It's a common technique used to position content offscreen.
- if (style.hasOutOfFlowPosition() && left.isFixed() && left.value() <= -999)
- return true;
-
- // FIXME: Check for other cases like zero height with overflow hidden.
- auto maxHeight = style.maxHeight();
- if (maxHeight.isFixed() && !maxHeight.value())
- return true;
-
- return false;
-}
-
bool ContentChangeObserver::StyleChangeScope::isConsideredClickable() const
{
if (m_element.isInUserAgentShadowTree())
Modified: trunk/Source/WebCore/page/ios/ContentChangeObserver.h (243304 => 243305)
--- trunk/Source/WebCore/page/ios/ContentChangeObserver.h 2019-03-21 18:33:11 UTC (rev 243304)
+++ trunk/Source/WebCore/page/ios/ContentChangeObserver.h 2019-03-21 18:38:39 UTC (rev 243305)
@@ -66,7 +66,6 @@
~StyleChangeScope();
private:
- bool isConsideredHidden() const;
bool isConsideredClickable() const;
ContentChangeObserver& m_contentChangeObserver;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes