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

Unified Diff: third_party/WebKit/Source/core/dom/IntersectionObserver.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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/dom/IntersectionObserver.cpp
diff --git a/third_party/WebKit/Source/core/dom/IntersectionObserver.cpp b/third_party/WebKit/Source/core/dom/IntersectionObserver.cpp
index 7509dcf7051d0c111c615918360c489eed7e098e..e04ca3394f6b48c3eb06b25708f1decc3c23e15c 100644
--- a/third_party/WebKit/Source/core/dom/IntersectionObserver.cpp
+++ b/third_party/WebKit/Source/core/dom/IntersectionObserver.cpp
@@ -132,11 +132,10 @@ void parseThresholds(const DoubleOrDoubleSequence& thresholdParameter,
// Returns the root Node of a given Document to use as the IntersectionObserver
// root when no root is given.
-// TODO(szager): it doesn't support RemoteFrames, see https://crbug.com/615156
Node* getRootNode(Document* document) {
- Frame* mainFrame = document->frame()->tree().top();
- if (mainFrame && mainFrame->isLocalFrame())
- return toLocalFrame(mainFrame)->document();
+ LocalFrame* rootFrame = document->frame()->localFrameRoot();
+ if (rootFrame)
+ return rootFrame->document();
return nullptr;
}
@@ -146,11 +145,17 @@ IntersectionObserver* IntersectionObserver::create(
const IntersectionObserverInit& observerInit,
IntersectionObserverCallback& callback,
ExceptionState& exceptionState) {
+ bool intersectWithRemoteAncestors = false;
Node* root = observerInit.root();
if (!root) {
ExecutionContext* context = callback.getExecutionContext();
DCHECK(context->isDocument());
root = getRootNode(toDocument(context));
+ if (root && (toDocument(context)->frame()->tree().top()->isRemoteFrame() ||
+ root !=
+ toLocalFrame(toDocument(context)->frame()->tree().top())
+ ->document()))
+ intersectWithRemoteAncestors = true;
}
if (!root) {
exceptionState.throwDOMException(
@@ -169,7 +174,8 @@ IntersectionObserver* IntersectionObserver::create(
if (exceptionState.hadException())
return nullptr;
- return new IntersectionObserver(callback, *root, rootMargin, thresholds);
+ return new IntersectionObserver(callback, *root, rootMargin, thresholds,
+ intersectWithRemoteAncestors);
}
IntersectionObserver* IntersectionObserver::create(
@@ -179,6 +185,11 @@ IntersectionObserver* IntersectionObserver::create(
std::unique_ptr<EventCallback> callback,
ExceptionState& exceptionState) {
Node* root = getRootNode(document);
+ bool intersectWithRemoteAncestors = false;
+ if (root &&
+ (document->frame()->tree().top()->isRemoteFrame() ||
+ root != toLocalFrame(document->frame()->tree().top())->document()))
+ intersectWithRemoteAncestors = true;
if (!root) {
exceptionState.throwDOMException(
HierarchyRequestError,
@@ -189,21 +200,24 @@ IntersectionObserver* IntersectionObserver::create(
IntersectionObserverCallbackImpl* intersectionObserverCallback =
new IntersectionObserverCallbackImpl(document, std::move(callback));
return new IntersectionObserver(*intersectionObserverCallback, *root,
- rootMargin, thresholds);
+ rootMargin, thresholds,
+ intersectWithRemoteAncestors);
}
IntersectionObserver::IntersectionObserver(
IntersectionObserverCallback& callback,
Node& root,
const Vector<Length>& rootMargin,
- const Vector<float>& thresholds)
+ const Vector<float>& thresholds,
+ bool intersectWithRemoteAncestors)
: m_callback(&callback),
m_root(&root),
m_thresholds(thresholds),
m_topMargin(Fixed),
m_rightMargin(Fixed),
m_bottomMargin(Fixed),
- m_leftMargin(Fixed) {
+ m_leftMargin(Fixed),
+ m_intersectWithRemoteAncestors(intersectWithRemoteAncestors) {
switch (rootMargin.size()) {
case 0:
break;
@@ -269,7 +283,8 @@ void IntersectionObserver::observe(Element* target,
LocalFrame* rootFrame = m_root->document().frame();
if (target->document() == rootNode()->document()) {
- shouldReportRootBounds = true;
+ if (!m_intersectWithRemoteAncestors)
+ shouldReportRootBounds = true;
isDOMDescendant = rootNode()->isShadowIncludingInclusiveAncestorOf(target);
} else if (targetFrame && rootFrame) {
shouldReportRootBounds =
@@ -434,6 +449,18 @@ void IntersectionObserver::deliver() {
m_callback->handleEvent(entries, *this);
}
+void IntersectionObserver::intersectWithRemoteAncestorsIfNeeded(
+ LayoutRect& rect) {
+ if (m_intersectWithRemoteAncestors) {
+ Document* root = toDocument(rootNode());
+ if (root->view()) {
+ LayoutRect viewportIntersectionRect(
+ root->view()->remoteViewportIntersection());
+ rect.intersect(viewportIntersectionRect);
+ }
+ }
+}
+
DEFINE_TRACE(IntersectionObserver) {
visitor->template registerWeakMembers<
IntersectionObserver, &IntersectionObserver::clearWeakMembers>(this);

Powered by Google App Engine
This is Rietveld 408576698