| Index: third_party/WebKit/Source/core/dom/ElementVisibilityObserver.cpp
|
| diff --git a/third_party/WebKit/Source/core/dom/ElementVisibilityObserver.cpp b/third_party/WebKit/Source/core/dom/ElementVisibilityObserver.cpp
|
| index 8c4ecab9c24d74549216268dbf9a3f38e3310e9a..4160f7bdda303b9df15414895e2cd67f7e18276e 100644
|
| --- a/third_party/WebKit/Source/core/dom/ElementVisibilityObserver.cpp
|
| +++ b/third_party/WebKit/Source/core/dom/ElementVisibilityObserver.cpp
|
| @@ -29,6 +29,15 @@ ElementVisibilityObserver::ElementVisibilityObserver(
|
| ElementVisibilityObserver::~ElementVisibilityObserver() = default;
|
|
|
| void ElementVisibilityObserver::start() {
|
| + startInternal(false);
|
| +}
|
| +
|
| +void ElementVisibilityObserver::startObserveElementViewportRatio() {
|
| + startInternal(true);
|
| +}
|
| +
|
| +void ElementVisibilityObserver::startInternal(
|
| + bool isObservingElementViewportRatio) {
|
| ExecutionContext* context = m_element->getExecutionContext();
|
| DCHECK(context->isDocument());
|
| Document& document = toDocument(*context);
|
| @@ -41,10 +50,17 @@ void ElementVisibilityObserver::start() {
|
| }
|
|
|
| DCHECK(!m_intersectionObserver);
|
| - m_intersectionObserver = IntersectionObserver::create(
|
| - Vector<Length>(), Vector<float>({std::numeric_limits<float>::min()}),
|
| - &document, WTF::bind(&ElementVisibilityObserver::onVisibilityChanged,
|
| - wrapWeakPersistent(this)));
|
| + if (isObservingElementViewportRatio) {
|
| + m_intersectionObserver = IntersectionObserver::create(
|
| + Vector<Length>(), &document,
|
| + WTF::bind(&ElementVisibilityObserver::onVisibilityChanged,
|
| + wrapWeakPersistent(this)));
|
| + } else {
|
| + m_intersectionObserver = IntersectionObserver::create(
|
| + Vector<Length>(), Vector<float>({std::numeric_limits<float>::min()}),
|
| + &document, WTF::bind(&ElementVisibilityObserver::onVisibilityChanged,
|
| + wrapWeakPersistent(this)));
|
| + }
|
| DCHECK(m_intersectionObserver);
|
| m_intersectionObserver->setInitialState(
|
| IntersectionObserver::InitialState::kAuto);
|
| @@ -74,8 +90,17 @@ DEFINE_TRACE(ElementVisibilityObserver) {
|
|
|
| void ElementVisibilityObserver::onVisibilityChanged(
|
| const HeapVector<Member<IntersectionObserverEntry>>& entries) {
|
| - bool isVisible = entries.last()->intersectionRatio() > 0.f;
|
| - (*m_callback.get())(isVisible);
|
| + m_ratio = entries.last()->intersectionRatio();
|
| + (*m_callback.get())(m_ratio > 0.f);
|
| +}
|
| +
|
| +ElementViewportRatioObserver::ElementViewportRatioObserver(
|
| + Element* element,
|
| + std::unique_ptr<VisibilityCallback> callback)
|
| + : ElementVisibilityObserver(element, std::move(callback)) {}
|
| +
|
| +void ElementViewportRatioObserver::start() {
|
| + startObserveElementViewportRatio();
|
| }
|
|
|
| } // namespace blink
|
|
|