| Index: Source/core/html/HTMLMarqueeElement.js
|
| diff --git a/Source/core/html/HTMLMarqueeElement.js b/Source/core/html/HTMLMarqueeElement.js
|
| index aecd5d7adca910af62e4779997dbb423a2c8ba4c..95ce320951fa2314b8c039052a23b21794ff2d97 100644
|
| --- a/Source/core/html/HTMLMarqueeElement.js
|
| +++ b/Source/core/html/HTMLMarqueeElement.js
|
| @@ -70,7 +70,7 @@ installClass('HTMLMarqueeElement', function(HTMLMarqueeElementPrototype) {
|
| function reflectBooleanAttribute(prototype, attributeName, propertyName) {
|
| Object.defineProperty(prototype, propertyName, {
|
| get: function() {
|
| - return this.hasAttribute(attributeName);
|
| + return this.getAttribute(attributeName);
|
| },
|
| set: function(value) {
|
| if (value)
|
| @@ -81,32 +81,6 @@ installClass('HTMLMarqueeElement', function(HTMLMarqueeElementPrototype) {
|
| });
|
| }
|
|
|
| - function defineInlineEventHandler(prototype, eventName) {
|
| - var propertyName = 'on' + eventName;
|
| - // FIXME: We should use symbols here instead.
|
| - var functionPropertyName = propertyName + 'Function_';
|
| - var eventHandlerPropertyName = propertyName + 'EventHandler_';
|
| - Object.defineProperty(prototype, propertyName, {
|
| - get: function() {
|
| - var func = this[functionPropertyName];
|
| - return func || null;
|
| - },
|
| - set: function(value) {
|
| - var oldEventHandler = this[eventHandlerPropertyName];
|
| - if (oldEventHandler)
|
| - this.removeEventListener(eventName, oldEventHandler);
|
| - // Notice that we wrap |value| in an anonymous function so that the
|
| - // author can't call removeEventListener themselves to unregister the
|
| - // inline event handler.
|
| - var newEventHandler = value ? function() { value.apply(this, arguments) } : null;
|
| - if (newEventHandler)
|
| - this.addEventListener(eventName, newEventHandler);
|
| - this[functionPropertyName] = value;
|
| - this[eventHandlerPropertyName] = newEventHandler;
|
| - },
|
| - });
|
| - }
|
| -
|
| reflectAttribute(HTMLMarqueeElementPrototype, 'behavior', 'behavior');
|
| reflectAttribute(HTMLMarqueeElementPrototype, 'bgcolor', 'bgColor');
|
| reflectAttribute(HTMLMarqueeElementPrototype, 'direction', 'direction');
|
| @@ -116,15 +90,11 @@ installClass('HTMLMarqueeElement', function(HTMLMarqueeElementPrototype) {
|
| reflectAttribute(HTMLMarqueeElementPrototype, 'width', 'width');
|
| reflectBooleanAttribute(HTMLMarqueeElementPrototype, 'truespeed', 'trueSpeed');
|
|
|
| - defineInlineEventHandler(HTMLMarqueeElementPrototype, 'start');
|
| - defineInlineEventHandler(HTMLMarqueeElementPrototype, 'finish');
|
| - defineInlineEventHandler(HTMLMarqueeElementPrototype, 'bounce');
|
| -
|
| HTMLMarqueeElementPrototype.createdCallback = function() {
|
| var shadow = this.createShadowRoot();
|
| var style = document.createElement('style');
|
| - style.textContent = ':host { display: inline-block; width: -webkit-fill-available; overflow: hidden; text-align: initial; }' +
|
| - ':host([direction="up"]), :host([direction="down"]) { height: 200px; }';
|
| + style.textContent = ':host { display: inline-block; width: -webkit-fill-available; overflow: hidden; text-align: initial; }'
|
| + + ':host([direction="up"]), :host([direction="down"]) { overflow: initial; overflow-y: hidden; }';
|
| shadow.appendChild(style);
|
|
|
| var mover = document.createElement('div');
|
| @@ -136,12 +106,13 @@ installClass('HTMLMarqueeElement', function(HTMLMarqueeElementPrototype) {
|
| this.mover_ = mover;
|
| this.player_ = null;
|
| this.continueCallback_ = null;
|
| -
|
| - for (var i = 0; i < kPresentationalAttributes.length; ++i)
|
| - this.initializeAttribute_(kPresentationalAttributes[i]);
|
| };
|
|
|
| HTMLMarqueeElementPrototype.attachedCallback = function() {
|
| + for (var i = 0; i < kPresentationalAttributes.length; ++i) {
|
| + this.initializeAttribute_(kPresentationalAttributes[i]);
|
| + }
|
| +
|
| this.start();
|
| };
|
|
|
| @@ -172,8 +143,12 @@ installClass('HTMLMarqueeElement', function(HTMLMarqueeElementPrototype) {
|
| break;
|
| case 'behavior':
|
| case 'direction':
|
| + case 'loop':
|
| + case 'scrollAmount':
|
| + case 'scrollDelay':
|
| + case 'trueSpeed':
|
| + // FIXME: Not implemented.
|
| this.stop();
|
| - this.loopCount_ = 0;
|
| this.start();
|
| break;
|
| }
|
| @@ -232,7 +207,10 @@ installClass('HTMLMarqueeElement', function(HTMLMarqueeElementPrototype) {
|
| });
|
|
|
| HTMLMarqueeElementPrototype.getGetMetrics_ = function() {
|
| - this.mover_.style.width = '-webkit-max-content';
|
| + if (this.direction === 'up' || this.direction === 'down')
|
| + this.mover_.style.height = '-webkit-max-content';
|
| + else
|
| + this.mover_.style.width = '-webkit-max-content';
|
|
|
| var moverStyle = getComputedStyle(this.mover_);
|
| var marqueeStyle = getComputedStyle(this);
|
| @@ -243,7 +221,10 @@ installClass('HTMLMarqueeElement', function(HTMLMarqueeElementPrototype) {
|
| metrics.marqueeWidth = parseInt(marqueeStyle.width);
|
| metrics.marqueeHeight = parseInt(marqueeStyle.height);
|
|
|
| - this.mover_.style.width = '';
|
| + if (this.direction === 'up' || this.direction === 'down')
|
| + this.mover_.style.height = '';
|
| + else
|
| + this.mover_.style.width = '';
|
| return metrics;
|
| };
|
|
|
| @@ -265,7 +246,7 @@ installClass('HTMLMarqueeElement', function(HTMLMarqueeElementPrototype) {
|
| case kDirectionLeft:
|
| default:
|
| parameters.transformBegin = 'translateX(' + metrics.marqueeWidth + 'px)';
|
| - parameters.transformEnd = 'translateX(-100%)';
|
| + parameters.transformEnd = 'translateX(-' + metrics.contentWidth + 'px)';
|
| parameters.distance = totalWidth;
|
| break;
|
| case kDirectionRight:
|
| @@ -347,6 +328,13 @@ installClass('HTMLMarqueeElement', function(HTMLMarqueeElementPrototype) {
|
| return parameters
|
| };
|
|
|
| + function animationFinished_(event) {
|
| + var player = event.target;
|
| + var marquee = player.marquee_;
|
| + marquee.loopCount_++;
|
| + marquee.start();
|
| + };
|
| +
|
| HTMLMarqueeElementPrototype.shouldContinue_ = function() {
|
| var loop = this.loop;
|
|
|
| @@ -361,66 +349,49 @@ installClass('HTMLMarqueeElement', function(HTMLMarqueeElementPrototype) {
|
|
|
| HTMLMarqueeElementPrototype.continue_ = function() {
|
| if (!this.shouldContinue_()) {
|
| - this.player_ = null;
|
| - this.dispatchEvent(new Event('finish', false, true));
|
| return;
|
| }
|
|
|
| - var parameters = this.getAnimationParameters_();
|
| + if (this.player_ && this.player_.playState === 'paused') {
|
| + this.player_.play();
|
| + return;
|
| + }
|
|
|
| + var parameters = this.getAnimationParameters_();
|
| + var scrollDelay = this.scrollDelay;
|
| + if (scrollDelay < kMinimumScrollDelayMS && !this.trueSpeed)
|
| + scrollDelay = kDefaultScrollDelayMS;
|
| var player = this.mover_.animate([
|
| { transform: parameters.transformBegin },
|
| { transform: parameters.transformEnd },
|
| ], {
|
| - duration: parameters.distance * this.scrollDelay / this.scrollAmount,
|
| + duration: this.scrollAmount == 0 ? 0 : parameters.distance * scrollDelay / this.scrollAmount,
|
| fill: 'forwards',
|
| });
|
| + player.marquee_ = this;
|
| + player.onfinish = animationFinished_;
|
|
|
| this.player_ = player;
|
| -
|
| - player.addEventListener('finish', function() {
|
| - if (player != this.player_)
|
| - return;
|
| - ++this.loopCount_;
|
| - this.continue_();
|
| - if (this.player_ && this.behavior === kBehaviorAlternate)
|
| - this.dispatchEvent(new Event('bounce', false, true));
|
| - }.bind(this));
|
| };
|
|
|
| HTMLMarqueeElementPrototype.start = function() {
|
| - if (this.continueCallback_ || this.player_)
|
| + if (this.continueCallback_)
|
| return;
|
| this.continueCallback_ = requestAnimationFrame(function() {
|
| this.continueCallback_ = null;
|
| this.continue_();
|
| }.bind(this));
|
| - this.dispatchEvent(new Event('start', false, true));
|
| };
|
|
|
| HTMLMarqueeElementPrototype.stop = function() {
|
| - if (!this.continueCallback_ && !this.player_)
|
| - return;
|
| -
|
| if (this.continueCallback_) {
|
| cancelAnimationFrame(this.continueCallback_);
|
| this.continueCallback_ = null;
|
| return;
|
| }
|
|
|
| - // FIXME: Rather than canceling the animation, we really should just
|
| - // pause the animation, but the pause function is still flagged as
|
| - // experimental.
|
| if (this.player_) {
|
| - var player = this.player_;
|
| - this.player_ = null;
|
| - player.cancel();
|
| + this.player_.pause();
|
| }
|
| };
|
| -
|
| - // FIXME: We have to inject this HTMLMarqueeElement as a custom element in order to make
|
| - // createdCallback, attachedCallback, detachedCallback and attributeChangedCallback workable.
|
| - // document.registerElement('i-marquee', {
|
| - // prototype: HTMLMarqueeElementPrototype,
|
| - // });
|
| });
|
|
|