Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(216)

Unified Diff: third_party/WebKit/Source/core/frame/FrameView.cpp

Issue 1449623002: IntersectionObserver: second cut. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Implemented root margin Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/frame/FrameView.cpp
diff --git a/third_party/WebKit/Source/core/frame/FrameView.cpp b/third_party/WebKit/Source/core/frame/FrameView.cpp
index 62792a190a8244ae33808c6e0af7a90aee1459b5..452e66473f00e343e59cb25d6abb96da121b399e 100644
--- a/third_party/WebKit/Source/core/frame/FrameView.cpp
+++ b/third_party/WebKit/Source/core/frame/FrameView.cpp
@@ -33,6 +33,7 @@
#include "core/css/resolver/StyleResolver.h"
#include "core/dom/AXObjectCache.h"
#include "core/dom/Fullscreen.h"
+#include "core/dom/IntersectionObserverRegistry.h"
#include "core/editing/EditingUtilities.h"
#include "core/editing/FrameSelection.h"
#include "core/editing/RenderedPosition.h"
@@ -121,7 +122,7 @@ FrameView::FrameView(LocalFrame* frame)
, m_inSynchronousPostLayout(false)
, m_postLayoutTasksTimer(this, &FrameView::postLayoutTimerFired)
, m_updateWidgetsTimer(this, &FrameView::updateWidgetsTimerFired)
- , m_intersectionObserverNotificationFactory(CancellableTaskFactory::create(this, &FrameView::notifyIntersectionObservers))
+ , m_renderThrottlingObserverNotificationFactory(CancellableTaskFactory::create(this, &FrameView::notifyRenderThrottlingObservers))
, m_isTransparent(false)
, m_baseBackgroundColor(Color::white)
, m_mediaType(MediaTypeNames::screen)
@@ -285,7 +286,7 @@ void FrameView::dispose()
if (m_didScrollTimer.isActive())
m_didScrollTimer.stop();
- m_intersectionObserverNotificationFactory->cancel();
+ m_renderThrottlingObserverNotificationFactory->cancel();
// FIXME: Do we need to do something here for OOPI?
HTMLFrameOwnerElement* ownerElement = m_frame->deprecatedLocalOwner();
@@ -2375,10 +2376,8 @@ void FrameView::updateLifecyclePhasesInternal(LifeCycleUpdateOption phases)
updateStyleAndLayoutIfNeededRecursive();
ASSERT(lifecycle().state() >= DocumentLifecycle::LayoutClean);
- if (phases == OnlyUpToLayoutClean) {
- updateViewportIntersectionsForSubtree();
ojan 2015/12/12 01:06:29 I think removing this is the right change, but sho
szager1 2015/12/16 19:15:37 Done.
+ if (phases == OnlyUpToLayoutClean)
return;
- }
if (LayoutView* view = layoutView()) {
{
@@ -3911,36 +3910,34 @@ void FrameView::setNeedsUpdateViewportIntersection()
void FrameView::updateViewportIntersectionIfNeeded()
{
- // TODO(skyostil): Replace this with a real intersection observer.
- if (!m_needsUpdateViewportIntersection)
- return;
- m_needsUpdateViewportIntersection = false;
- m_viewportIntersectionValid = true;
+ if (m_needsUpdateViewportIntersection) {
ojan 2015/12/12 01:06:29 Why did you get rid of the early return?
szager1 2015/12/16 19:15:37 I can't remember why I did that, but it's not need
+ FrameView* parent = parentFrameView();
+ if (parent) {
esprehn 2015/12/12 00:14:16 if (FrameView* parent = ...) {
szager1 2015/12/16 19:15:37 Since I reverted to the old code, the parent varia
+ ASSERT(!parent->m_needsUpdateViewportIntersection);
- FrameView* parent = parentFrameView();
- if (!parent) {
- m_viewportIntersection = frameRect();
- return;
- }
- ASSERT(!parent->m_needsUpdateViewportIntersection);
-
- // If our parent is hidden, then we are too.
- if (parent->m_viewportIntersection.isEmpty()) {
- m_viewportIntersection = parent->m_viewportIntersection;
- return;
+ // If our parent is hidden, then we are too.
+ if (parent->m_viewportIntersection.isEmpty()) {
+ m_viewportIntersection = parent->m_viewportIntersection;
+ } else {
+ // Transform our bounds into the root frame's content coordinate space,
+ // making sure we have valid layout data in our parent document. If our
+ // parent is throttled, we'll use possible stale layout information and
+ // rely on the fact that another lifecycle update will be scheduled once
+ // our parent becomes unthrottled.
+ ASSERT(parent->lifecycle().state() >= DocumentLifecycle::LayoutClean || parent->shouldThrottleRendering());
+ m_viewportIntersection = parent->contentsToRootFrame(frameRect());
+
+ // TODO(skyostil): Expand the viewport to make it less likely to see stale content while scrolling.
+ IntRect viewport = parent->m_viewportIntersection;
+ m_viewportIntersection.intersect(viewport);
+ }
+ } else {
+ m_viewportIntersection = frameRect();
+ }
}
- // Transform our bounds into the root frame's content coordinate space,
- // making sure we have valid layout data in our parent document. If our
- // parent is throttled, we'll use possible stale layout information and
- // rely on the fact that another lifecycle update will be scheduled once
- // our parent becomes unthrottled.
- ASSERT(parent->lifecycle().state() >= DocumentLifecycle::LayoutClean || parent->shouldThrottleRendering());
- m_viewportIntersection = parent->contentsToRootFrame(frameRect());
-
- // TODO(skyostil): Expand the viewport to make it less likely to see stale content while scrolling.
- IntRect viewport = parent->m_viewportIntersection;
- m_viewportIntersection.intersect(viewport);
+ m_needsUpdateViewportIntersection = false;
+ m_viewportIntersectionValid = true;
}
void FrameView::updateViewportIntersectionsForSubtree()
@@ -3948,9 +3945,14 @@ void FrameView::updateViewportIntersectionsForSubtree()
bool hadValidIntersection = m_viewportIntersectionValid;
bool hadEmptyIntersection = m_viewportIntersection.isEmpty();
updateViewportIntersectionIfNeeded();
+
+ // Notify javascript IntersectionObservers
+ frame().document()->intersectionObserverRegistry()->computeTrackedIntersectionObservations();
+
+ // Adjust render throttling for iframes based on visibility
bool shouldNotify = !hadValidIntersection || hadEmptyIntersection != m_viewportIntersection.isEmpty();
- if (shouldNotify && !m_intersectionObserverNotificationFactory->isPending())
- m_frame->frameScheduler()->timerTaskRunner()->postTask(BLINK_FROM_HERE, m_intersectionObserverNotificationFactory->cancelAndCreate());
+ if (shouldNotify && !m_renderThrottlingObserverNotificationFactory->isPending())
+ m_frame->frameScheduler()->timerTaskRunner()->postTask(BLINK_FROM_HERE, m_renderThrottlingObserverNotificationFactory->cancelAndCreate());
if (!m_needsUpdateViewportIntersectionInSubtree)
return;
@@ -3964,9 +3966,9 @@ void FrameView::updateViewportIntersectionsForSubtree()
}
}
-void FrameView::notifyIntersectionObservers()
+void FrameView::notifyRenderThrottlingObservers()
{
- TRACE_EVENT0("blink", "FrameView::notifyIntersectionObservers");
+ TRACE_EVENT0("blink", "FrameView::notifyRenderThrottlingObservers");
ASSERT(!isInPerformLayout());
ASSERT(!m_frame->document()->inStyleRecalc());
bool wasThrottled = canThrottleRendering();

Powered by Google App Engine
This is Rietveld 408576698