OLD | NEW |
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 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 | 140 |
141 // We need to retain the scroll customization callbacks until the element | 141 // We need to retain the scroll customization callbacks until the element |
142 // they're associated with is destroyed. It would be simplest if the callbacks | 142 // they're associated with is destroyed. It would be simplest if the callbacks |
143 // could be stored in ElementRareData, but we can't afford the space | 143 // could be stored in ElementRareData, but we can't afford the space |
144 // increase. Instead, keep the scroll customization callbacks here. The other | 144 // increase. Instead, keep the scroll customization callbacks here. The other |
145 // option would be to store these callbacks on the FrameHost or document, but | 145 // option would be to store these callbacks on the FrameHost or document, but |
146 // that necessitates a bunch more logic for transferring the callbacks between | 146 // that necessitates a bunch more logic for transferring the callbacks between |
147 // FrameHosts when elements are moved around. | 147 // FrameHosts when elements are moved around. |
148 ScrollCustomizationCallbacks& scrollCustomizationCallbacks() | 148 ScrollCustomizationCallbacks& scrollCustomizationCallbacks() |
149 { | 149 { |
150 ASSERT(RuntimeEnabledFeatures::scrollCustomizationEnabled()); | |
151 DEFINE_STATIC_LOCAL(ScrollCustomizationCallbacks, scrollCustomizationCallbac
ks, (new ScrollCustomizationCallbacks)); | 150 DEFINE_STATIC_LOCAL(ScrollCustomizationCallbacks, scrollCustomizationCallbac
ks, (new ScrollCustomizationCallbacks)); |
152 return scrollCustomizationCallbacks; | 151 return scrollCustomizationCallbacks; |
153 } | 152 } |
154 | 153 |
155 } // namespace | 154 } // namespace |
156 | 155 |
157 using namespace HTMLNames; | 156 using namespace HTMLNames; |
158 using namespace XMLNames; | 157 using namespace XMLNames; |
159 | 158 |
160 enum class ClassStringContent { Empty, WhiteSpaceOnly, HasClasses }; | 159 enum class ClassStringContent { Empty, WhiteSpaceOnly, HasClasses }; |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 scrollStateCallback->setNativeScrollBehavior(ScrollStateCallback::toNativeSc
rollBehavior(nativeScrollBehavior)); | 496 scrollStateCallback->setNativeScrollBehavior(ScrollStateCallback::toNativeSc
rollBehavior(nativeScrollBehavior)); |
498 scrollCustomizationCallbacks().setDistributeScroll(this, scrollStateCallback
); | 497 scrollCustomizationCallbacks().setDistributeScroll(this, scrollStateCallback
); |
499 } | 498 } |
500 | 499 |
501 void Element::setApplyScroll(ScrollStateCallback* scrollStateCallback, String na
tiveScrollBehavior) | 500 void Element::setApplyScroll(ScrollStateCallback* scrollStateCallback, String na
tiveScrollBehavior) |
502 { | 501 { |
503 scrollStateCallback->setNativeScrollBehavior(ScrollStateCallback::toNativeSc
rollBehavior(nativeScrollBehavior)); | 502 scrollStateCallback->setNativeScrollBehavior(ScrollStateCallback::toNativeSc
rollBehavior(nativeScrollBehavior)); |
504 scrollCustomizationCallbacks().setApplyScroll(this, scrollStateCallback); | 503 scrollCustomizationCallbacks().setApplyScroll(this, scrollStateCallback); |
505 } | 504 } |
506 | 505 |
| 506 void Element::removeApplyScroll() |
| 507 { |
| 508 scrollCustomizationCallbacks().removeApplyScroll(this); |
| 509 } |
| 510 |
| 511 ScrollStateCallback* Element::getApplyScroll() |
| 512 { |
| 513 return scrollCustomizationCallbacks().getApplyScroll(this); |
| 514 } |
| 515 |
507 void Element::nativeDistributeScroll(ScrollState& scrollState) | 516 void Element::nativeDistributeScroll(ScrollState& scrollState) |
508 { | 517 { |
509 ASSERT(RuntimeEnabledFeatures::scrollCustomizationEnabled()); | |
510 if (scrollState.fullyConsumed()) | 518 if (scrollState.fullyConsumed()) |
511 return; | 519 return; |
512 | 520 |
513 scrollState.distributeToScrollChainDescendant(); | 521 scrollState.distributeToScrollChainDescendant(); |
514 | 522 |
515 // If the scroll doesn't propagate, and we're currently scrolling | 523 // If the scroll doesn't propagate, and we're currently scrolling |
516 // an element other than this one, prevent the scroll from | 524 // an element other than this one, prevent the scroll from |
517 // propagating to this element. | 525 // propagating to this element. |
518 if (!scrollState.shouldPropagate() | 526 if (!scrollState.shouldPropagate() |
519 && scrollState.deltaConsumedForScrollSequence() | 527 && scrollState.deltaConsumedForScrollSequence() |
(...skipping 21 matching lines...) Expand all Loading... |
541 callback->handleEvent(&scrollState); | 549 callback->handleEvent(&scrollState); |
542 if (callback->nativeScrollBehavior() != WebNativeScrollBehavior::DisableNati
veScroll) | 550 if (callback->nativeScrollBehavior() != WebNativeScrollBehavior::DisableNati
veScroll) |
543 nativeDistributeScroll(scrollState); | 551 nativeDistributeScroll(scrollState); |
544 if (callback->nativeScrollBehavior() == WebNativeScrollBehavior::PerformAfte
rNativeScroll) | 552 if (callback->nativeScrollBehavior() == WebNativeScrollBehavior::PerformAfte
rNativeScroll) |
545 callback->handleEvent(&scrollState); | 553 callback->handleEvent(&scrollState); |
546 }; | 554 }; |
547 | 555 |
548 void Element::nativeApplyScroll(ScrollState& scrollState) | 556 void Element::nativeApplyScroll(ScrollState& scrollState) |
549 { | 557 { |
550 ASSERT(RuntimeEnabledFeatures::scrollCustomizationEnabled()); | 558 ASSERT(RuntimeEnabledFeatures::scrollCustomizationEnabled()); |
| 559 |
| 560 // All elements in the scroll chain should be boxes. |
| 561 ASSERT(!layoutObject() || layoutObject()->isBox()); |
| 562 |
551 if (scrollState.fullyConsumed()) | 563 if (scrollState.fullyConsumed()) |
552 return; | 564 return; |
553 | 565 |
554 const double deltaX = scrollState.deltaX(); | 566 FloatSize delta(scrollState.deltaX(), scrollState.deltaY()); |
555 const double deltaY = scrollState.deltaY(); | 567 |
556 bool scrolled = false; | 568 if (delta.isZero()) |
| 569 return; |
557 | 570 |
558 // TODO(esprehn): This should use updateLayoutIgnorePendingStylesheetsForNod
e. | 571 // TODO(esprehn): This should use updateLayoutIgnorePendingStylesheetsForNod
e. |
559 if (deltaY || deltaX) | 572 document().updateLayoutIgnorePendingStylesheets(); |
560 document().updateLayoutIgnorePendingStylesheets(); | |
561 | 573 |
562 // Handle the scrollingElement separately, as it scrolls the viewport. | 574 LayoutBox* boxToScroll = nullptr; |
563 if (this == document().scrollingElement()) { | |
564 FloatSize delta(deltaX, deltaY); | |
565 if (document().frame()->applyScrollDelta(ScrollByPrecisePixel, delta, sc
rollState.isBeginning()).didScroll()) { | |
566 scrolled = true; | |
567 scrollState.consumeDeltaNative(scrollState.deltaX(), scrollState.del
taY()); | |
568 } | |
569 } else { | |
570 if (!layoutObject()) | |
571 return; | |
572 LayoutBoxItem curBox = LayoutBoxItem(toLayoutBox(layoutObject())).enclos
ingBox(); | |
573 // FIXME: Native scrollers should only consume the scroll they | |
574 // apply. See crbug.com/457765. | |
575 if (deltaX && curBox.scroll(ScrollByPrecisePixel, FloatSize(deltaX, 0)).
didScrollX) { | |
576 scrollState.consumeDeltaNative(scrollState.deltaX(), 0); | |
577 scrolled = true; | |
578 } | |
579 | 575 |
580 if (deltaY && curBox.scroll(ScrollByPrecisePixel, FloatSize(0, deltaY)).
didScrollY) { | 576 // Handle the scrollingElement separately, as it should scroll the viewport. |
581 scrollState.consumeDeltaNative(0, scrollState.deltaY()); | 577 if (this == document().scrollingElement()) |
582 scrolled = true; | 578 boxToScroll = document().layoutView(); |
583 } | 579 else if (layoutObject()) |
584 } | 580 boxToScroll = toLayoutBox(layoutObject()); |
585 | 581 |
586 if (!scrolled) | 582 if (!boxToScroll) |
587 return; | 583 return; |
588 | 584 |
| 585 ScrollResult result = |
| 586 LayoutBoxItem(boxToScroll).enclosingBox().scroll( |
| 587 ScrollByPrecisePixel, |
| 588 delta); |
| 589 |
| 590 if (!result.didScroll()) |
| 591 return; |
| 592 |
| 593 // FIXME: Native scrollers should only consume the scroll they |
| 594 // apply. See crbug.com/457765. |
| 595 scrollState.consumeDeltaNative(delta.width(), delta.height()); |
| 596 |
589 // We need to setCurrentNativeScrollingElement in both the | 597 // We need to setCurrentNativeScrollingElement in both the |
590 // distributeScroll and applyScroll default implementations so | 598 // distributeScroll and applyScroll default implementations so |
591 // that if JS overrides one of these methods, but not the | 599 // that if JS overrides one of these methods, but not the |
592 // other, this bookkeeping remains accurate. | 600 // other, this bookkeeping remains accurate. |
593 scrollState.setCurrentNativeScrollingElement(this); | 601 scrollState.setCurrentNativeScrollingElement(this); |
594 if (scrollState.fromUserInput()) { | 602 if (scrollState.fromUserInput()) { |
595 if (DocumentLoader* documentLoader = document().loader()) | 603 if (DocumentLoader* documentLoader = document().loader()) |
596 documentLoader->initialScrollState().wasScrolledByUser = true; | 604 documentLoader->initialScrollState().wasScrolledByUser = true; |
597 } | 605 } |
598 }; | 606 }; |
(...skipping 3070 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3669 { | 3677 { |
3670 #if ENABLE(OILPAN) | 3678 #if ENABLE(OILPAN) |
3671 if (hasRareData()) | 3679 if (hasRareData()) |
3672 visitor->trace(elementRareData()); | 3680 visitor->trace(elementRareData()); |
3673 visitor->trace(m_elementData); | 3681 visitor->trace(m_elementData); |
3674 #endif | 3682 #endif |
3675 ContainerNode::trace(visitor); | 3683 ContainerNode::trace(visitor); |
3676 } | 3684 } |
3677 | 3685 |
3678 } // namespace blink | 3686 } // namespace blink |
OLD | NEW |