Index: third_party/WebKit/Source/core/html/HTMLMarqueeElement.cpp |
diff --git a/third_party/WebKit/Source/core/html/HTMLMarqueeElement.cpp b/third_party/WebKit/Source/core/html/HTMLMarqueeElement.cpp |
index 394dc7651c3a63a38db1f2e89f7037e9a96900f2..6423c14eb29e627b0dba368792d7644215206fbe 100644 |
--- a/third_party/WebKit/Source/core/html/HTMLMarqueeElement.cpp |
+++ b/third_party/WebKit/Source/core/html/HTMLMarqueeElement.cpp |
@@ -35,12 +35,14 @@ |
#include "core/css/CSSStyleDeclaration.h" |
#include "core/css/StylePropertySet.h" |
#include "core/dom/Document.h" |
+#include "core/dom/FrameRequestCallback.h" |
#include "core/dom/shadow/ShadowRoot.h" |
#include "core/frame/LocalDOMWindow.h" |
#include "core/frame/UseCounter.h" |
#include "core/html/HTMLContentElement.h" |
#include "core/html/HTMLDivElement.h" |
#include "core/html/HTMLStyleElement.h" |
+#include "wtf/Noncopyable.h" |
#include <cstdlib> |
namespace blink { |
@@ -73,6 +75,53 @@ void HTMLMarqueeElement::didAddUserAgentShadowRoot(ShadowRoot& shadowRoot) { |
m_mover = mover; |
} |
+class HTMLMarqueeElement::RequestAnimationFrameCallback final |
+ : public FrameRequestCallback { |
+ WTF_MAKE_NONCOPYABLE(RequestAnimationFrameCallback); |
+ |
+ public: |
+ explicit RequestAnimationFrameCallback(HTMLMarqueeElement* marquee) |
+ : m_marquee(marquee) {} |
+ |
+ void handleEvent(double) override { |
+ m_marquee->m_continueCallbackRequestId = 0; |
+ m_marquee->continueAnimation(); |
+ } |
+ |
+ DEFINE_INLINE_VIRTUAL_TRACE() { |
+ visitor->trace(m_marquee); |
+ FrameRequestCallback::trace(visitor); |
+ } |
+ |
+ private: |
+ Member<HTMLMarqueeElement> m_marquee; |
+}; |
+ |
+class HTMLMarqueeElement::AnimationFinished final : public EventListener { |
+ WTF_MAKE_NONCOPYABLE(AnimationFinished); |
+ |
+ public: |
+ explicit AnimationFinished(HTMLMarqueeElement* marquee) |
+ : EventListener(CPPEventListenerType), m_marquee(marquee) {} |
+ |
+ bool operator==(const EventListener& that) const override { |
+ return this == &that; |
+ } |
+ |
+ void handleEvent(ExecutionContext*, Event*) override { |
+ ++m_marquee->m_loopCount; |
+ m_marquee->start(); |
+ } |
+ |
+ DEFINE_INLINE_VIRTUAL_TRACE() { |
+ visitor->trace(m_marquee); |
+ EventListener::trace(visitor); |
+ } |
+ |
+ private: |
+ Member<HTMLMarqueeElement> m_marquee; |
+}; |
+ |
Node::InsertionNotificationRequest HTMLMarqueeElement::insertedInto( |
ContainerNode* insertionPoint) { |
HTMLElement::insertedInto(insertionPoint); |
@@ -91,13 +140,13 @@ void HTMLMarqueeElement::removedFrom(ContainerNode* insertionPoint) { |
} |
bool HTMLMarqueeElement::isHorizontal() const { |
- Direction direction = this->direction(); |
- return direction != Up && direction != Down; |
+ Direction direction = getDirection(); |
+ return direction != kUp && direction != kDown; |
} |
int HTMLMarqueeElement::scrollAmount() const { |
bool ok; |
- int scrollAmount = getAttribute(HTMLNames::scrollamountAttr).toInt(&ok); |
+ int scrollAmount = fastGetAttribute(HTMLNames::scrollamountAttr).toInt(&ok); |
if (!ok || scrollAmount < 0) |
return kDefaultScrollAmount; |
return scrollAmount; |
@@ -116,7 +165,7 @@ void HTMLMarqueeElement::setScrollAmount(int value, |
int HTMLMarqueeElement::scrollDelay() const { |
bool ok; |
- int scrollDelay = getAttribute(HTMLNames::scrolldelayAttr).toInt(&ok); |
+ int scrollDelay = fastGetAttribute(HTMLNames::scrolldelayAttr).toInt(&ok); |
if (!ok || scrollDelay < 0) |
return kDefaultScrollDelayMS; |
return scrollDelay; |
@@ -135,7 +184,7 @@ void HTMLMarqueeElement::setScrollDelay(int value, |
int HTMLMarqueeElement::loop() const { |
bool ok; |
- int loop = getAttribute(HTMLNames::loopAttr).toInt(&ok); |
+ int loop = fastGetAttribute(HTMLNames::loopAttr).toInt(&ok); |
if (!ok || loop <= 0) |
return kDefaultLoopLimit; |
return loop; |
@@ -202,20 +251,8 @@ void HTMLMarqueeElement::collectStyleForPresentationAttribute( |
} |
} |
-void HTMLMarqueeElement::RequestAnimationFrameCallback::handleEvent(double) { |
- m_marquee->m_continueCallbackRequestId = 0; |
- m_marquee->continueAnimation(); |
-} |
- |
-void HTMLMarqueeElement::AnimationFinished::handleEvent( |
- ExecutionContext* context, |
- Event* event) { |
- ++m_marquee->m_loopCount; |
- m_marquee->start(); |
-} |
- |
StringKeyframeEffectModel* HTMLMarqueeElement::createEffectModel( |
- AnimationParameters& parameters) { |
+ const AnimationParameters& parameters) { |
StyleSheetContents* styleSheetContents = |
m_mover->document().elementSheet().contents(); |
MutableStylePropertySet::SetResult setResult; |
@@ -248,7 +285,8 @@ void HTMLMarqueeElement::continueAnimation() { |
int scrollDelay = this->scrollDelay(); |
int scrollAmount = this->scrollAmount(); |
- if (scrollDelay < kMinimumScrollDelayMS && !trueSpeed()) |
+ if (scrollDelay < kMinimumScrollDelayMS && |
+ !fastHasAttribute(HTMLNames::truespeedAttr)) |
scrollDelay = kDefaultScrollDelayMS; |
double duration = 0; |
if (scrollAmount) |
@@ -276,7 +314,7 @@ bool HTMLMarqueeElement::shouldContinue() { |
int loopCount = loop(); |
// By default, slide loops only once. |
- if (loopCount <= 0 && behavior() == Slide) |
+ if (loopCount <= 0 && getBehavior() == kSlide) |
loopCount = 1; |
if (loopCount <= 0) |
@@ -284,28 +322,24 @@ bool HTMLMarqueeElement::shouldContinue() { |
return m_loopCount < loopCount; |
} |
-HTMLMarqueeElement::Behavior HTMLMarqueeElement::behavior() const { |
- const AtomicString& behavior = getAttribute(HTMLNames::behaviorAttr); |
- if (behavior == "alternate") |
- return Alternate; |
- if (behavior == "slide") |
- return Slide; |
- return Scroll; |
-} |
- |
-HTMLMarqueeElement::Direction HTMLMarqueeElement::direction() const { |
- const AtomicString& direction = getAttribute(HTMLNames::directionAttr); |
- if (direction == "down") |
- return Down; |
- if (direction == "up") |
- return Up; |
- if (direction == "right") |
- return Right; |
- return Left; |
+HTMLMarqueeElement::Behavior HTMLMarqueeElement::getBehavior() const { |
+ const AtomicString& behavior = fastGetAttribute(HTMLNames::behaviorAttr); |
+ if (equalIgnoringASCIICase(behavior, "alternate")) |
+ return kAlternate; |
+ if (equalIgnoringASCIICase(behavior, "slide")) |
+ return kSlide; |
+ return kScroll; |
} |
-bool HTMLMarqueeElement::trueSpeed() const { |
- return hasAttribute(HTMLNames::truespeedAttr); |
+HTMLMarqueeElement::Direction HTMLMarqueeElement::getDirection() const { |
+ const AtomicString& direction = fastGetAttribute(HTMLNames::directionAttr); |
+ if (equalIgnoringASCIICase(direction, "down")) |
+ return kDown; |
+ if (equalIgnoringASCIICase(direction, "up")) |
+ return kUp; |
+ if (equalIgnoringASCIICase(direction, "right")) |
+ return kRight; |
+ return kLeft; |
} |
HTMLMarqueeElement::Metrics HTMLMarqueeElement::getMetrics() { |
@@ -361,31 +395,31 @@ HTMLMarqueeElement::getAnimationParameters() { |
double innerWidth = metrics.marqueeWidth - metrics.contentWidth; |
double innerHeight = metrics.marqueeHeight - metrics.contentHeight; |
- switch (behavior()) { |
- case Alternate: |
- switch (direction()) { |
- case Right: |
+ switch (getBehavior()) { |
+ case kAlternate: |
+ switch (getDirection()) { |
+ case kRight: |
parameters.transformBegin = |
createTransform(innerWidth >= 0 ? 0 : innerWidth); |
parameters.transformEnd = |
createTransform(innerWidth >= 0 ? innerWidth : 0); |
parameters.distance = std::abs(innerWidth); |
break; |
- case Up: |
+ case kUp: |
parameters.transformBegin = |
createTransform(innerHeight >= 0 ? innerHeight : 0); |
parameters.transformEnd = |
createTransform(innerHeight >= 0 ? 0 : innerHeight); |
parameters.distance = std::abs(innerHeight); |
break; |
- case Down: |
+ case kDown: |
parameters.transformBegin = |
createTransform(innerHeight >= 0 ? 0 : innerHeight); |
parameters.transformEnd = |
createTransform(innerHeight >= 0 ? innerHeight : 0); |
parameters.distance = std::abs(innerHeight); |
break; |
- case Left: |
+ case kLeft: |
default: |
parameters.transformBegin = |
createTransform(innerWidth >= 0 ? innerWidth : 0); |
@@ -397,49 +431,49 @@ HTMLMarqueeElement::getAnimationParameters() { |
if (m_loopCount % 2) |
std::swap(parameters.transformBegin, parameters.transformEnd); |
break; |
- case Slide: |
- switch (direction()) { |
- case Right: |
+ case kSlide: |
+ switch (getDirection()) { |
+ case kRight: |
parameters.transformBegin = createTransform(-metrics.contentWidth); |
parameters.transformEnd = createTransform(innerWidth); |
parameters.distance = metrics.marqueeWidth; |
break; |
- case Up: |
+ case kUp: |
parameters.transformBegin = createTransform(metrics.marqueeHeight); |
parameters.transformEnd = "translateY(0)"; |
parameters.distance = metrics.marqueeHeight; |
break; |
- case Down: |
+ case kDown: |
parameters.transformBegin = createTransform(-metrics.contentHeight); |
parameters.transformEnd = createTransform(innerHeight); |
parameters.distance = metrics.marqueeHeight; |
break; |
- case Left: |
+ case kLeft: |
default: |
parameters.transformBegin = createTransform(metrics.marqueeWidth); |
parameters.transformEnd = "translateX(0)"; |
parameters.distance = metrics.marqueeWidth; |
} |
break; |
- case Scroll: |
+ case kScroll: |
default: |
- switch (direction()) { |
- case Right: |
+ switch (getDirection()) { |
+ case kRight: |
parameters.transformBegin = createTransform(-metrics.contentWidth); |
parameters.transformEnd = createTransform(metrics.marqueeWidth); |
parameters.distance = totalWidth; |
break; |
- case Up: |
+ case kUp: |
parameters.transformBegin = createTransform(metrics.marqueeHeight); |
parameters.transformEnd = createTransform(-metrics.contentHeight); |
parameters.distance = totalHeight; |
break; |
- case Down: |
+ case kDown: |
parameters.transformBegin = createTransform(-metrics.contentHeight); |
parameters.transformEnd = createTransform(metrics.marqueeHeight); |
parameters.distance = totalHeight; |
break; |
- case Left: |
+ case kLeft: |
default: |
parameters.transformBegin = createTransform(metrics.marqueeWidth); |
parameters.transformEnd = createTransform(-metrics.contentWidth); |
@@ -453,7 +487,8 @@ HTMLMarqueeElement::getAnimationParameters() { |
AtomicString HTMLMarqueeElement::createTransform(double value) const { |
char axis = isHorizontal() ? 'X' : 'Y'; |
- return AtomicString(String::format("translate%c(%fpx)", axis, value)); |
+ return String::format("translate%c(", axis) + |
+ String::numberToStringECMAScript(value) + "px)"; |
} |
DEFINE_TRACE(HTMLMarqueeElement) { |