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

Side by Side Diff: third_party/WebKit/Source/core/dom/IntersectionObservation.cpp

Issue 2431473003: Intersection Observer support for OOPIF (Closed)
Patch Set: Enabled test, fixed bugs Created 4 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/dom/IntersectionObservation.h" 5 #include "core/dom/IntersectionObservation.h"
6 6
7 #include "core/dom/ElementRareData.h" 7 #include "core/dom/ElementRareData.h"
8 #include "core/dom/IntersectionObserver.h" 8 #include "core/dom/IntersectionObserver.h"
9 #include "core/frame/FrameView.h" 9 #include "core/frame/FrameView.h"
10 #include "core/frame/LocalFrame.h" 10 #include "core/frame/LocalFrame.h"
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
46 void IntersectionObservation::initializeRootRect(LayoutRect& rect) const { 46 void IntersectionObservation::initializeRootRect(LayoutRect& rect) const {
47 LayoutObject* rootLayoutObject = m_observer->rootLayoutObject(); 47 LayoutObject* rootLayoutObject = m_observer->rootLayoutObject();
48 if (rootLayoutObject->isLayoutView()) 48 if (rootLayoutObject->isLayoutView())
49 rect = LayoutRect( 49 rect = LayoutRect(
50 toLayoutView(rootLayoutObject)->frameView()->visibleContentRect()); 50 toLayoutView(rootLayoutObject)->frameView()->visibleContentRect());
51 else if (rootLayoutObject->isBox() && rootLayoutObject->hasOverflowClip()) 51 else if (rootLayoutObject->isBox() && rootLayoutObject->hasOverflowClip())
52 rect = LayoutRect(toLayoutBox(rootLayoutObject)->contentBoxRect()); 52 rect = LayoutRect(toLayoutBox(rootLayoutObject)->contentBoxRect());
53 else 53 else
54 rect = LayoutRect( 54 rect = LayoutRect(
55 toLayoutBoxModelObject(rootLayoutObject)->borderBoundingBox()); 55 toLayoutBoxModelObject(rootLayoutObject)->borderBoundingBox());
56 m_observer->intersectWithRemoteAncestorsIfNeeded(rect);
56 applyRootMargin(rect); 57 applyRootMargin(rect);
57 } 58 }
58 59
59 void IntersectionObservation::clipToRoot(IntersectionGeometry& geometry) const { 60 void IntersectionObservation::clipToRoot(IntersectionGeometry& geometry) const {
60 // Map and clip rect into root element coordinates. 61 // Map and clip rect into root element coordinates.
61 // TODO(szager): the writing mode flipping needs a test. 62 // TODO(szager): the writing mode flipping needs a test.
62 DCHECK(m_target); 63 DCHECK(m_target);
63 LayoutBox* rootLayoutObject = toLayoutBox(m_observer->rootLayoutObject()); 64 LayoutBox* rootLayoutObject = toLayoutBox(m_observer->rootLayoutObject());
64 LayoutObject* targetLayoutObject = target()->layoutObject(); 65 LayoutObject* targetLayoutObject = target()->layoutObject();
65 66
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 targetDocument); 125 targetDocument);
125 126
126 rect.move(-scrollPosition); 127 rect.move(-scrollPosition);
127 } 128 }
128 129
129 static bool isContainingBlockChainDescendant(LayoutObject* descendant, 130 static bool isContainingBlockChainDescendant(LayoutObject* descendant,
130 LayoutObject* ancestor) { 131 LayoutObject* ancestor) {
131 LocalFrame* ancestorFrame = ancestor->document().frame(); 132 LocalFrame* ancestorFrame = ancestor->document().frame();
132 LocalFrame* descendantFrame = descendant->document().frame(); 133 LocalFrame* descendantFrame = descendant->document().frame();
133 134
134 if (ancestor->isLayoutView()) 135 if (ancestor->isLayoutView()) {
135 return descendantFrame && descendantFrame->tree().top() == ancestorFrame; 136 return descendantFrame &&
137 descendantFrame->localFrameRoot() == ancestorFrame;
138 }
136 139
137 if (ancestorFrame != descendantFrame) 140 if (ancestorFrame != descendantFrame)
138 return false; 141 return false;
139 142
140 while (descendant && descendant != ancestor) 143 while (descendant && descendant != ancestor)
141 descendant = descendant->containingBlock(); 144 descendant = descendant->containingBlock();
142 return descendant; 145 return descendant;
143 } 146 }
144 147
145 bool IntersectionObservation::computeGeometry( 148 bool IntersectionObservation::computeGeometry(
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 183
181 if (geometry.doesIntersect) 184 if (geometry.doesIntersect)
182 mapRootRectToTargetFrameCoordinates(geometry.intersectionRect); 185 mapRootRectToTargetFrameCoordinates(geometry.intersectionRect);
183 else 186 else
184 geometry.intersectionRect = LayoutRect(); 187 geometry.intersectionRect = LayoutRect();
185 188
186 // Small optimization: if we're not going to report root bounds, don't bother 189 // Small optimization: if we're not going to report root bounds, don't bother
187 // transforming them to the frame. 190 // transforming them to the frame.
188 if (m_shouldReportRootBounds) 191 if (m_shouldReportRootBounds)
189 mapRootRectToRootFrameCoordinates(geometry.rootRect); 192 mapRootRectToRootFrameCoordinates(geometry.rootRect);
190
191 return true; 193 return true;
192 } 194 }
193 195
194 void IntersectionObservation::computeIntersectionObservations( 196 void IntersectionObservation::computeIntersectionObservations(
195 DOMHighResTimeStamp timestamp) { 197 DOMHighResTimeStamp timestamp) {
196 IntersectionGeometry geometry; 198 IntersectionGeometry geometry;
197 if (!computeGeometry(geometry)) 199 if (!computeGeometry(geometry))
198 return; 200 return;
199 201
200 // Some corner cases for threshold index: 202 // Some corner cases for threshold index:
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 target()->ensureIntersectionObserverData().removeObservation(observer()); 251 target()->ensureIntersectionObserverData().removeObservation(observer());
250 m_observer.clear(); 252 m_observer.clear();
251 } 253 }
252 254
253 DEFINE_TRACE(IntersectionObservation) { 255 DEFINE_TRACE(IntersectionObservation) {
254 visitor->trace(m_observer); 256 visitor->trace(m_observer);
255 visitor->trace(m_target); 257 visitor->trace(m_target);
256 } 258 }
257 259
258 } // namespace blink 260 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698