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

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

Issue 1840113005: Move viewport actions into an ApplyScroll callback. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase over my own changes Created 4 years, 8 months 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 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Peter Kelly (pmk@post.com) 4 * (C) 2001 Peter Kelly (pmk@post.com)
5 * (C) 2001 Dirk Mueller (mueller@kde.org) 5 * (C) 2001 Dirk Mueller (mueller@kde.org)
6 * (C) 2007 David Smith (catfish.man@gmail.com) 6 * (C) 2007 David Smith (catfish.man@gmail.com)
7 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc. All rights reserved. 7 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc. All rights reserved.
8 * (C) 2007 Eric Seidel (eric@webkit.org) 8 * (C) 2007 Eric Seidel (eric@webkit.org)
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 142
143 // We need to retain the scroll customization callbacks until the element 143 // We need to retain the scroll customization callbacks until the element
144 // they're associated with is destroyed. It would be simplest if the callbacks 144 // they're associated with is destroyed. It would be simplest if the callbacks
145 // could be stored in ElementRareData, but we can't afford the space 145 // could be stored in ElementRareData, but we can't afford the space
146 // increase. Instead, keep the scroll customization callbacks here. The other 146 // increase. Instead, keep the scroll customization callbacks here. The other
147 // option would be to store these callbacks on the FrameHost or document, but 147 // option would be to store these callbacks on the FrameHost or document, but
148 // that necessitates a bunch more logic for transferring the callbacks between 148 // that necessitates a bunch more logic for transferring the callbacks between
149 // FrameHosts when elements are moved around. 149 // FrameHosts when elements are moved around.
150 ScrollCustomizationCallbacks& scrollCustomizationCallbacks() 150 ScrollCustomizationCallbacks& scrollCustomizationCallbacks()
151 { 151 {
152 DCHECK(RuntimeEnabledFeatures::scrollCustomizationEnabled());
153 DEFINE_STATIC_LOCAL(ScrollCustomizationCallbacks, scrollCustomizationCallbac ks, (new ScrollCustomizationCallbacks)); 152 DEFINE_STATIC_LOCAL(ScrollCustomizationCallbacks, scrollCustomizationCallbac ks, (new ScrollCustomizationCallbacks));
154 return scrollCustomizationCallbacks; 153 return scrollCustomizationCallbacks;
155 } 154 }
156 155
157 } // namespace 156 } // namespace
158 157
159 using namespace HTMLNames; 158 using namespace HTMLNames;
160 using namespace XMLNames; 159 using namespace XMLNames;
161 160
162 enum class ClassStringContent { Empty, WhiteSpaceOnly, HasClasses }; 161 enum class ClassStringContent { Empty, WhiteSpaceOnly, HasClasses };
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 scrollStateCallback->setNativeScrollBehavior(ScrollStateCallback::toNativeSc rollBehavior(nativeScrollBehavior)); 498 scrollStateCallback->setNativeScrollBehavior(ScrollStateCallback::toNativeSc rollBehavior(nativeScrollBehavior));
500 scrollCustomizationCallbacks().setDistributeScroll(this, scrollStateCallback ); 499 scrollCustomizationCallbacks().setDistributeScroll(this, scrollStateCallback );
501 } 500 }
502 501
503 void Element::setApplyScroll(ScrollStateCallback* scrollStateCallback, String na tiveScrollBehavior) 502 void Element::setApplyScroll(ScrollStateCallback* scrollStateCallback, String na tiveScrollBehavior)
504 { 503 {
505 scrollStateCallback->setNativeScrollBehavior(ScrollStateCallback::toNativeSc rollBehavior(nativeScrollBehavior)); 504 scrollStateCallback->setNativeScrollBehavior(ScrollStateCallback::toNativeSc rollBehavior(nativeScrollBehavior));
506 scrollCustomizationCallbacks().setApplyScroll(this, scrollStateCallback); 505 scrollCustomizationCallbacks().setApplyScroll(this, scrollStateCallback);
507 } 506 }
508 507
508 void Element::removeApplyScroll()
509 {
510 scrollCustomizationCallbacks().removeApplyScroll(this);
511 }
512
513 ScrollStateCallback* Element::getApplyScroll()
514 {
515 return scrollCustomizationCallbacks().getApplyScroll(this);
516 }
517
509 void Element::nativeDistributeScroll(ScrollState& scrollState) 518 void Element::nativeDistributeScroll(ScrollState& scrollState)
510 { 519 {
511 DCHECK(RuntimeEnabledFeatures::scrollCustomizationEnabled());
512 if (scrollState.fullyConsumed()) 520 if (scrollState.fullyConsumed())
513 return; 521 return;
514 522
515 scrollState.distributeToScrollChainDescendant(); 523 scrollState.distributeToScrollChainDescendant();
516 524
517 // If the scroll doesn't propagate, and we're currently scrolling 525 // If the scroll doesn't propagate, and we're currently scrolling
518 // an element other than this one, prevent the scroll from 526 // an element other than this one, prevent the scroll from
519 // propagating to this element. 527 // propagating to this element.
520 if (!scrollState.shouldPropagate() 528 if (!scrollState.shouldPropagate()
521 && scrollState.deltaConsumedForScrollSequence() 529 && scrollState.deltaConsumedForScrollSequence()
(...skipping 21 matching lines...) Expand all
543 callback->handleEvent(&scrollState); 551 callback->handleEvent(&scrollState);
544 if (callback->nativeScrollBehavior() != WebNativeScrollBehavior::DisableNati veScroll) 552 if (callback->nativeScrollBehavior() != WebNativeScrollBehavior::DisableNati veScroll)
545 nativeDistributeScroll(scrollState); 553 nativeDistributeScroll(scrollState);
546 if (callback->nativeScrollBehavior() == WebNativeScrollBehavior::PerformAfte rNativeScroll) 554 if (callback->nativeScrollBehavior() == WebNativeScrollBehavior::PerformAfte rNativeScroll)
547 callback->handleEvent(&scrollState); 555 callback->handleEvent(&scrollState);
548 }; 556 };
549 557
550 void Element::nativeApplyScroll(ScrollState& scrollState) 558 void Element::nativeApplyScroll(ScrollState& scrollState)
551 { 559 {
552 DCHECK(RuntimeEnabledFeatures::scrollCustomizationEnabled()); 560 DCHECK(RuntimeEnabledFeatures::scrollCustomizationEnabled());
561
562 // All elements in the scroll chain should be boxes.
563 DCHECK(!layoutObject() || layoutObject()->isBox());
564
553 if (scrollState.fullyConsumed()) 565 if (scrollState.fullyConsumed())
554 return; 566 return;
555 567
556 const double deltaX = scrollState.deltaX(); 568 FloatSize delta(scrollState.deltaX(), scrollState.deltaY());
557 const double deltaY = scrollState.deltaY(); 569
558 bool scrolled = false; 570 if (delta.isZero())
571 return;
559 572
560 // TODO(esprehn): This should use updateLayoutIgnorePendingStylesheetsForNod e. 573 // TODO(esprehn): This should use updateLayoutIgnorePendingStylesheetsForNod e.
561 if (deltaY || deltaX) 574 document().updateLayoutIgnorePendingStylesheets();
562 document().updateLayoutIgnorePendingStylesheets();
563 575
564 // Handle the scrollingElement separately, as it scrolls the viewport. 576 LayoutBox* boxToScroll = nullptr;
565 if (this == document().scrollingElement()) {
566 FloatSize delta(deltaX, deltaY);
567 if (document().frame()->applyScrollDelta(ScrollByPrecisePixel, delta, sc rollState.isBeginning()).didScroll()) {
568 scrolled = true;
569 scrollState.consumeDeltaNative(scrollState.deltaX(), scrollState.del taY());
570 }
571 } else {
572 if (!layoutObject())
573 return;
574 LayoutBoxItem curBox = LayoutBoxItem(toLayoutBox(layoutObject())).enclos ingBox();
575 // FIXME: Native scrollers should only consume the scroll they
576 // apply. See crbug.com/457765.
577 if (deltaX && curBox.scroll(ScrollByPrecisePixel, FloatSize(deltaX, 0)). didScrollX) {
578 scrollState.consumeDeltaNative(scrollState.deltaX(), 0);
579 scrolled = true;
580 }
581 577
582 if (deltaY && curBox.scroll(ScrollByPrecisePixel, FloatSize(0, deltaY)). didScrollY) { 578 // Handle the scrollingElement separately, as it should scroll the viewport.
583 scrollState.consumeDeltaNative(0, scrollState.deltaY()); 579 if (this == document().scrollingElement())
584 scrolled = true; 580 boxToScroll = document().layoutView();
585 } 581 else if (layoutObject())
586 } 582 boxToScroll = toLayoutBox(layoutObject());
587 583
588 if (!scrolled) 584 if (!boxToScroll)
589 return; 585 return;
590 586
587 ScrollResult result =
588 LayoutBoxItem(boxToScroll).enclosingBox().scroll(
589 ScrollByPrecisePixel,
590 delta);
591
592 if (!result.didScroll())
593 return;
594
595 // FIXME: Native scrollers should only consume the scroll they
596 // apply. See crbug.com/457765.
597 scrollState.consumeDeltaNative(delta.width(), delta.height());
598
591 // We need to setCurrentNativeScrollingElement in both the 599 // We need to setCurrentNativeScrollingElement in both the
592 // distributeScroll and applyScroll default implementations so 600 // distributeScroll and applyScroll default implementations so
593 // that if JS overrides one of these methods, but not the 601 // that if JS overrides one of these methods, but not the
594 // other, this bookkeeping remains accurate. 602 // other, this bookkeeping remains accurate.
595 scrollState.setCurrentNativeScrollingElement(this); 603 scrollState.setCurrentNativeScrollingElement(this);
596 if (scrollState.fromUserInput()) { 604 if (scrollState.fromUserInput()) {
597 if (DocumentLoader* documentLoader = document().loader()) 605 if (DocumentLoader* documentLoader = document().loader())
598 documentLoader->initialScrollState().wasScrolledByUser = true; 606 documentLoader->initialScrollState().wasScrolledByUser = true;
599 } 607 }
600 }; 608 };
(...skipping 3088 matching lines...) Expand 10 before | Expand all | Expand 10 after
3689 3697
3690 DEFINE_TRACE(Element) 3698 DEFINE_TRACE(Element)
3691 { 3699 {
3692 if (hasRareData()) 3700 if (hasRareData())
3693 visitor->trace(elementRareData()); 3701 visitor->trace(elementRareData());
3694 visitor->trace(m_elementData); 3702 visitor->trace(m_elementData);
3695 ContainerNode::trace(visitor); 3703 ContainerNode::trace(visitor);
3696 } 3704 }
3697 3705
3698 } // namespace blink 3706 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/dom/Element.h ('k') | third_party/WebKit/Source/core/frame/LocalFrame.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698