Chromium Code Reviews| Index: third_party/WebKit/Source/core/dom/IntersectionObservation.cpp |
| diff --git a/third_party/WebKit/Source/core/dom/IntersectionObservation.cpp b/third_party/WebKit/Source/core/dom/IntersectionObservation.cpp |
| index 94f9b6deb579dd1f04684ad394032e1be2ac631c..c8edc685b37ecdab67cf653bcef12374d76d1757 100644 |
| --- a/third_party/WebKit/Source/core/dom/IntersectionObservation.cpp |
| +++ b/third_party/WebKit/Source/core/dom/IntersectionObservation.cpp |
| @@ -140,26 +140,32 @@ static bool isContainingBlockChainDescendant(LayoutObject* descendant, LayoutObj |
| bool IntersectionObservation::computeGeometry(IntersectionGeometry& geometry) const |
| { |
| - // Pre-oilpan, there will be a delay between the time when the target Element gets deleted |
| - // (because its ref count dropped to zero) and when this IntersectionObservation gets |
| - // deleted (during the next gc run, because the target Element is the only thing keeping |
| - // the IntersectionObservation alive). During that interval, we need to check that m_target |
| - // hasn't been cleared. |
| + // In the first few lines here, before initializeGeometry is called, "return true" |
| + // effectively means "if the previous observed state was that root and target were |
| + // intersecting, then generate a notification indicating that they are no longer |
| + // intersecting." This happens, for example, when root or target is removed from the |
| + // DOM tree and not reinserted before the next frame is generated. |
| Element* targetElement = target(); |
| - if (!targetElement || !targetElement->inShadowIncludingDocument()) |
| + if (!targetElement) |
| return false; |
| - LayoutObject* targetLayoutObject = targetElement->layoutObject(); |
| + if (!targetElement->inShadowIncludingDocument()) |
| + return true; |
|
ojan
2016/04/15 18:19:08
Nit: I think this code would be more self-document
szager1
2016/04/15 19:47:23
The return value means "should we *ever* send a no
ojan
2016/04/15 22:40:52
All the more reason to use an out param with a cle
|
| DCHECK(m_observer); |
| + Element* rootElement = m_observer->root(); |
| + if (rootElement && !rootElement->inShadowIncludingDocument()) |
| + return true; |
| + |
| LayoutObject* rootLayoutObject = m_observer->rootLayoutObject(); |
| + if (!rootLayoutObject || !rootLayoutObject->isBoxModelObject()) |
| + return false; |
| // TODO(szager): Support SVG |
| + LayoutObject* targetLayoutObject = targetElement->layoutObject(); |
| if (!targetLayoutObject) |
| return false; |
| if (!targetLayoutObject->isBoxModelObject() && !targetLayoutObject->isText()) |
| return false; |
| - if (!rootLayoutObject || !rootLayoutObject->isBoxModelObject()) |
| - return false; |
| if (!isContainingBlockChainDescendant(targetLayoutObject, rootLayoutObject)) |
| - return false; |
| + return true; |
| initializeGeometry(geometry); |
| @@ -220,8 +226,8 @@ void IntersectionObservation::computeIntersectionObservations(DOMHighResTimeStam |
| pixelSnappedIntRect(geometry.intersectionRect), |
| target()); |
| observer().enqueueIntersectionObserverEntry(*newEntry); |
| + setLastThresholdIndex(newThresholdIndex); |
| } |
| - setLastThresholdIndex(newThresholdIndex); |
| } |
| void IntersectionObservation::disconnect() |