Chromium Code Reviews| Index: Source/core/dom/Element.cpp | 
| diff --git a/Source/core/dom/Element.cpp b/Source/core/dom/Element.cpp | 
| index 8d66bf56ac612848c00ed8aacdaeb08b4072e4dd..a6da13e77e2c079cc53e6ff85eaf015675ba7131 100644 | 
| --- a/Source/core/dom/Element.cpp | 
| +++ b/Source/core/dom/Element.cpp | 
| @@ -721,36 +721,41 @@ int Element::scrollTop() | 
| return 0; | 
| } | 
| -void Element::setScrollLeft(int newLeft) | 
| +void Element::setScrollLeft(int newLeft, ScrollBehavior scrollBehavior) | 
| { | 
| - document().updateLayoutIgnorePendingStylesheets(); | 
| + setScrollLeftInternal(newLeft, scrollBehavior); | 
| +} | 
| - if (document().documentElement() != this) { | 
| - if (RenderBox* rend = renderBox()) | 
| - rend->setScrollLeft(static_cast<int>(newLeft * rend->style()->effectiveZoom())); | 
| - return; | 
| +void Element::setScrollLeft(const Dictionary& scrollOptionsHorizontal, ExceptionState& exceptionState) | 
| +{ | 
| + String scrollBehaviorString; | 
| + ScrollBehavior scrollBehavior = ScrollBehaviorAuto; | 
| + if (scrollOptionsHorizontal.get("behavior", scrollBehaviorString)) { | 
| + if (!ScrollableArea::scrollBehaviorFromString(scrollBehaviorString, scrollBehavior)) { | 
| + exceptionState.throwTypeError("The ScrollBehavior provided is invalid."); | 
| + return; | 
| + } | 
| } | 
| - if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { | 
| - if (document().inQuirksMode()) | 
| - return; | 
| + int position; | 
| + if (!scrollOptionsHorizontal.get("x", position)) { | 
| + exceptionState.throwTypeError("ScrollOptionsHorizontal must include an 'x' member."); | 
| + return; | 
| + } | 
| - Frame* frame = document().frame(); | 
| - if (!frame) | 
| - return; | 
| - FrameView* view = frame->view(); | 
| - if (!view) | 
| - return; | 
| + setScrollLeft(position, scrollBehavior); | 
| +} | 
| - view->setScrollPosition(IntPoint(static_cast<int>(newLeft * frame->pageZoomFactor()), view->scrollY())); | 
| - } | 
| +void Element::setScrollTop(int newTop, ScrollBehavior scrollBehavior) | 
| +{ | 
| + setScrollTopInternal(newTop, scrollBehavior); | 
| } | 
| -void Element::setScrollLeft(const Dictionary& scrollOptionsHorizontal, ExceptionState& exceptionState) | 
| +void Element::setScrollTop(const Dictionary& scrollOptionsVertical, ExceptionState& exceptionState) | 
| { | 
| String scrollBehaviorString; | 
| ScrollBehavior scrollBehavior = ScrollBehaviorAuto; | 
| - if (scrollOptionsHorizontal.get("behavior", scrollBehaviorString)) { | 
| + if (scrollOptionsVertical.get("behavior", scrollBehaviorString)) { | 
| if (!ScrollableArea::scrollBehaviorFromString(scrollBehaviorString, scrollBehavior)) { | 
| exceptionState.throwTypeError("The ScrollBehavior provided is invalid."); | 
| 
 
Ian Vollick
2014/02/06 16:02:31
Do you have tests that try setting a bad behavior
 
 | 
| return; | 
| @@ -758,22 +763,21 @@ void Element::setScrollLeft(const Dictionary& scrollOptionsHorizontal, Exception | 
| } | 
| int position; | 
| - if (!scrollOptionsHorizontal.get("x", position)) { | 
| - exceptionState.throwTypeError("ScrollOptionsHorizontal must include an 'x' member."); | 
| + if (!scrollOptionsVertical.get("y", position)) { | 
| + exceptionState.throwTypeError("ScrollOptionsVertical must include a 'y' member."); | 
| return; | 
| } | 
| - // FIXME: Use scrollBehavior to decide whether to scroll smoothly or instantly. | 
| - setScrollLeft(position); | 
| + setScrollTop(position, scrollBehavior); | 
| } | 
| -void Element::setScrollTop(int newTop) | 
| +void Element::setScrollLeftInternal(int newLeft, ScrollBehavior scrollBehavior) | 
| { | 
| document().updateLayoutIgnorePendingStylesheets(); | 
| if (document().documentElement() != this) { | 
| if (RenderBox* rend = renderBox()) | 
| - rend->setScrollTop(static_cast<int>(newTop * rend->style()->effectiveZoom())); | 
| + rend->setScrollLeft(static_cast<int>(newLeft * rend->style()->effectiveZoom()), scrollBehavior); | 
| return; | 
| } | 
| @@ -788,29 +792,33 @@ void Element::setScrollTop(int newTop) | 
| if (!view) | 
| return; | 
| - view->setScrollPosition(IntPoint(view->scrollX(), static_cast<int>(newTop * frame->pageZoomFactor()))); | 
| + view->setScrollPosition(IntPoint(static_cast<int>(newLeft * frame->pageZoomFactor()), view->scrollY()), scrollBehavior); | 
| } | 
| } | 
| -void Element::setScrollTop(const Dictionary& scrollOptionsVertical, ExceptionState& exceptionState) | 
| +void Element::setScrollTopInternal(int newTop, ScrollBehavior scrollBehavior) | 
| { | 
| - String scrollBehaviorString; | 
| - ScrollBehavior scrollBehavior = ScrollBehaviorAuto; | 
| - if (scrollOptionsVertical.get("behavior", scrollBehaviorString)) { | 
| - if (!ScrollableArea::scrollBehaviorFromString(scrollBehaviorString, scrollBehavior)) { | 
| - exceptionState.throwTypeError("The ScrollBehavior provided is invalid."); | 
| - return; | 
| - } | 
| - } | 
| + document().updateLayoutIgnorePendingStylesheets(); | 
| - int position; | 
| - if (!scrollOptionsVertical.get("y", position)) { | 
| - exceptionState.throwTypeError("ScrollOptionsVertical must include a 'y' member."); | 
| + if (document().documentElement() != this) { | 
| + if (RenderBox* rend = renderBox()) | 
| + rend->setScrollTop(static_cast<int>(newTop * rend->style()->effectiveZoom()), scrollBehavior); | 
| return; | 
| } | 
| - // FIXME: Use scrollBehavior to decide whether to scroll smoothly or instantly. | 
| - setScrollTop(position); | 
| + if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { | 
| + if (document().inQuirksMode()) | 
| + return; | 
| + | 
| + Frame* frame = document().frame(); | 
| + if (!frame) | 
| + return; | 
| + FrameView* view = frame->view(); | 
| + if (!view) | 
| + return; | 
| + | 
| + view->setScrollPosition(IntPoint(view->scrollX(), static_cast<int>(newTop * frame->pageZoomFactor())), scrollBehavior); | 
| + } | 
| } | 
| int Element::scrollWidth() |