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

Unified Diff: third_party/WebKit/Source/core/html/HTMLMarqueeElement.js

Issue 2549443003: Move <marquee> implementation to HTMLMarqueeElement.cpp (Closed)
Patch Set: Add asserts for didParse Created 4 years 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/html/HTMLMarqueeElement.js
diff --git a/third_party/WebKit/Source/core/html/HTMLMarqueeElement.js b/third_party/WebKit/Source/core/html/HTMLMarqueeElement.js
deleted file mode 100644
index fbaff76581a9593f39838fe25f376c1723478133..0000000000000000000000000000000000000000
--- a/third_party/WebKit/Source/core/html/HTMLMarqueeElement.js
+++ /dev/null
@@ -1,402 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-'use strict';
-
-privateScriptController.installClass('HTMLMarqueeElement', function(HTMLMarqueeElementPrototype) {
-
- var kDefaultScrollAmount = 6;
- var kDefaultScrollDelayMS = 85;
- var kMinimumScrollDelayMS = 60;
-
- var kDefaultLoopLimit = -1;
-
- var kBehaviorScroll = 'scroll';
- var kBehaviorSlide = 'slide';
- var kBehaviorAlternate = 'alternate';
-
- var kDirectionLeft = 'left';
- var kDirectionRight = 'right';
- var kDirectionUp = 'up';
- var kDirectionDown = 'down';
-
- var kPresentationalAttributes = [
- 'bgcolor',
- 'height',
- 'hspace',
- 'vspace',
- 'width',
- ];
-
- function convertHTMLLengthToCSSLength(value) {
- var match = value.match(/^\s*([\d.]+)(%)?\s*/);
- if (match)
- return match[2] === '%' ? match[1] + '%' : match[1] + 'px';
- return null;
- }
-
- // FIXME: Consider moving these utility functions to PrivateScriptRunner.js.
- var kInt32Max = Math.pow(2, 31);
-
- function convertToLong(n) {
- // Using parseInt() is wrong but this aligns with the existing behavior of StringImpl::toInt().
- // FIXME: Implement a correct algorithm of the Web IDL value conversion.
- var value = parseInt(n);
- if (!isNaN(value) && -kInt32Max <= value && value < kInt32Max)
- return value;
- return NaN;
- }
-
- function reflectAttribute(prototype, attributeName, propertyName) {
- Object.defineProperty(prototype, propertyName, {
- get: function() {
- return this.getAttribute(attributeName) || '';
- },
- set: function(value) {
- this.setAttribute(attributeName, value);
- },
- configurable: true,
- enumerable: true,
- });
- }
-
- function reflectBooleanAttribute(prototype, attributeName, propertyName) {
- Object.defineProperty(prototype, propertyName, {
- get: function() {
- return this.getAttribute(attributeName);
- },
- set: function(value) {
- if (value)
- this.setAttribute(attributeName, '');
- else
- this.removeAttribute(attributeName);
- },
- });
- }
-
- reflectAttribute(HTMLMarqueeElementPrototype, 'behavior', 'behavior');
- reflectAttribute(HTMLMarqueeElementPrototype, 'bgcolor', 'bgColor');
- reflectAttribute(HTMLMarqueeElementPrototype, 'direction', 'direction');
- reflectAttribute(HTMLMarqueeElementPrototype, 'height', 'height');
- reflectAttribute(HTMLMarqueeElementPrototype, 'hspace', 'hspace');
- reflectAttribute(HTMLMarqueeElementPrototype, 'vspace', 'vspace');
- reflectAttribute(HTMLMarqueeElementPrototype, 'width', 'width');
- reflectBooleanAttribute(HTMLMarqueeElementPrototype, 'truespeed', 'trueSpeed');
-
- 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; white-space: nowrap; }'
- + ':host([direction="up"]), :host([direction="down"]) { overflow: initial; overflow-y: hidden; white-space: initial; }';
- shadow.appendChild(style);
-
- var mover = document.createElement('div');
- shadow.appendChild(mover);
-
- mover.appendChild(document.createElement('content'));
-
- this.loopCount_ = 0;
- this.mover_ = mover;
- this.player_ = null;
- this.continueCallback_ = null;
- };
-
- HTMLMarqueeElementPrototype.attachedCallback = function() {
- for (var i = 0; i < kPresentationalAttributes.length; ++i) {
- this.initializeAttribute_(kPresentationalAttributes[i]);
- }
-
- this.start();
- };
-
- HTMLMarqueeElementPrototype.detachedCallback = function() {
- this.stop();
- };
-
- HTMLMarqueeElementPrototype.attributeChangedCallback = function(name, oldValue, newValue) {
- switch (name) {
- case 'bgcolor':
- this.style.backgroundColor = newValue;
- break;
- case 'height':
- this.style.height = convertHTMLLengthToCSSLength(newValue);
- break;
- case 'hspace':
- var margin = convertHTMLLengthToCSSLength(newValue);
- this.style.marginLeft = margin;
- this.style.marginRight = margin;
- break;
- case 'vspace':
- var margin = convertHTMLLengthToCSSLength(newValue);
- this.style.marginTop = margin;
- this.style.marginBottom = margin;
- break;
- case 'width':
- this.style.width = convertHTMLLengthToCSSLength(newValue);
- break;
- case 'behavior':
- case 'direction':
- case 'loop':
- case 'scrollAmount':
- case 'scrollDelay':
- case 'trueSpeed':
- // FIXME: Not implemented.
- break;
- }
- };
-
- HTMLMarqueeElementPrototype.initializeAttribute_ = function(name) {
- var value = this.getAttribute(name);
- if (value === null)
- return;
- this.attributeChangedCallback(name, null, value);
- };
-
- Object.defineProperty(HTMLMarqueeElementPrototype, 'scrollAmount', {
- get: function() {
- var value = this.getAttribute('scrollamount');
- var scrollAmount = convertToLong(value);
- if (isNaN(scrollAmount) || scrollAmount < 0)
- return kDefaultScrollAmount;
- return scrollAmount;
- },
- set: function(value) {
- if (value < 0)
- privateScriptController.throwException(privateScriptController.DOMException.IndexSizeError, "The provided value (" + value + ") is negative.");
- this.setAttribute('scrollamount', value);
- },
- });
-
- Object.defineProperty(HTMLMarqueeElementPrototype, 'scrollDelay', {
- get: function() {
- var value = this.getAttribute('scrolldelay');
- var scrollDelay = convertToLong(value);
- if (isNaN(scrollDelay) || scrollDelay < 0)
- return kDefaultScrollDelayMS;
- return scrollDelay;
- },
- set: function(value) {
- if (value < 0)
- privateScriptController.throwException(privateScriptController.DOMException.IndexSizeError, "The provided value (" + value + ") is negative.");
- this.setAttribute('scrolldelay', value);
- },
- });
-
- Object.defineProperty(HTMLMarqueeElementPrototype, 'loop', {
- get: function() {
- var value = this.getAttribute('loop');
- var loop = convertToLong(value);
- if (isNaN(loop) || loop <= 0)
- return kDefaultLoopLimit;
- return loop;
- },
- set: function(value) {
- if (value <= 0 && value != -1)
- privateScriptController.throwException(privateScriptController.DOMException.IndexSizeError, "The provided value (" + value + ") is neither positive nor -1.");
- this.setAttribute('loop', value);
- },
- });
-
- HTMLMarqueeElementPrototype.getGetMetrics_ = function() {
- var direction = this.direction.toLowerCase();
- if (direction === 'up' || 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);
-
- var metrics = {};
- metrics.contentWidth = parseInt(moverStyle.width);
- metrics.contentHeight = parseInt(moverStyle.height);
- metrics.marqueeWidth = parseInt(marqueeStyle.width);
- metrics.marqueeHeight = parseInt(marqueeStyle.height);
-
- if (direction === 'up' || direction === 'down')
- this.mover_.style.height = '';
- else
- this.mover_.style.width = '';
- return metrics;
- };
-
- HTMLMarqueeElementPrototype.getAnimationParameters_ = function() {
- var metrics = this.getGetMetrics_();
-
- var totalWidth = metrics.marqueeWidth + metrics.contentWidth;
- var totalHeight = metrics.marqueeHeight + metrics.contentHeight;
-
- var innerWidth = metrics.marqueeWidth - metrics.contentWidth;
- var innerHeight = metrics.marqueeHeight - metrics.contentHeight;
-
- var parameters = {};
- var direction = this.direction.toLowerCase();
-
- switch (this.behavior) {
- case kBehaviorScroll:
- default:
- switch (direction) {
- case kDirectionLeft:
- default:
- parameters.transformBegin = 'translateX(' + metrics.marqueeWidth + 'px)';
- parameters.transformEnd = 'translateX(-' + metrics.contentWidth + 'px)';
- parameters.distance = totalWidth;
- break;
- case kDirectionRight:
- parameters.transformBegin = 'translateX(-' + metrics.contentWidth + 'px)';
- parameters.transformEnd = 'translateX(' + metrics.marqueeWidth + 'px)';
- parameters.distance = totalWidth;
- break;
- case kDirectionUp:
- parameters.transformBegin = 'translateY(' + metrics.marqueeHeight + 'px)';
- parameters.transformEnd = 'translateY(-' + metrics.contentHeight + 'px)';
- parameters.distance = totalHeight;
- break;
- case kDirectionDown:
- parameters.transformBegin = 'translateY(-' + metrics.contentHeight + 'px)';
- parameters.transformEnd = 'translateY(' + metrics.marqueeHeight + 'px)';
- parameters.distance = totalHeight;
- break;
- }
- break;
- case kBehaviorAlternate:
- switch (direction) {
- case kDirectionLeft:
- default:
- parameters.transformBegin = 'translateX(' + (innerWidth >= 0 ? innerWidth : 0) + 'px)';
- parameters.transformEnd = 'translateX(' + (innerWidth >= 0 ? 0 : innerWidth) + 'px)';
- parameters.distance = Math.abs(innerWidth);
- break;
- case kDirectionRight:
- parameters.transformBegin = 'translateX(' + (innerWidth >= 0 ? 0 : innerWidth) + 'px)';
- parameters.transformEnd = 'translateX(' + (innerWidth >= 0 ? innerWidth : 0) + 'px)';
- parameters.distance = Math.abs(innerWidth);
- break;
- case kDirectionUp:
- parameters.transformBegin = 'translateY(' + (innerHeight >= 0 ? innerHeight : 0) + 'px)';
- parameters.transformEnd = 'translateY(' + (innerHeight >= 0 ? 0 : innerHeight) + 'px)';
- parameters.distance = Math.abs(innerHeight);
- break;
- case kDirectionDown:
- parameters.transformBegin = 'translateY(' + (innerHeight >= 0 ? 0 : innerHeight) + 'px)';
- parameters.transformEnd = 'translateY(' + (innerHeight >= 0 ? innerHeight : 0) + 'px)';
- parameters.distance = Math.abs(innerHeight);
- break;
- }
-
- if (this.loopCount_ % 2) {
- var transform = parameters.transformBegin;
- parameters.transformBegin = parameters.transformEnd;
- parameters.transformEnd = transform;
- }
-
- break;
- case kBehaviorSlide:
- switch (direction) {
- case kDirectionLeft:
- default:
- parameters.transformBegin = 'translateX(' + metrics.marqueeWidth + 'px)';
- parameters.transformEnd = 'translateX(0)';
- parameters.distance = metrics.marqueeWidth;
- break;
- case kDirectionRight:
- parameters.transformBegin = 'translateX(-' + metrics.contentWidth + 'px)';
- parameters.transformEnd = 'translateX(' + innerWidth + 'px)';
- parameters.distance = metrics.marqueeWidth;
- break;
- case kDirectionUp:
- parameters.transformBegin = 'translateY(' + metrics.marqueeHeight + 'px)';
- parameters.transformEnd = 'translateY(0)';
- parameters.distance = metrics.marqueeHeight;
- break;
- case kDirectionDown:
- parameters.transformBegin = 'translateY(-' + metrics.contentHeight + 'px)';
- parameters.transformEnd = 'translateY(' + innerHeight + 'px)';
- parameters.distance = metrics.marqueeHeight;
- break;
- }
- break;
- }
-
- return parameters
- };
-
- function animationFinished_(event) {
- var player = event.target;
- var marquee = player.marquee_;
- marquee.loopCount_++;
- marquee.start();
- };
-
- HTMLMarqueeElementPrototype.shouldContinue_ = function() {
- var loop = this.loop;
-
- // By default, slide loops only once.
- if (loop <= 0 && this.behavior === kBehaviorSlide)
- loop = 1;
-
- if (loop <= 0)
- return true;
- return this.loopCount_ < loop;
- };
-
- HTMLMarqueeElementPrototype.continue_ = function() {
- if (!this.shouldContinue_()) {
- return;
- }
-
- 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 duration = 0;
- if (this.scrollAmount && !isNaN(parameters.distance))
- duration = parameters.distance * scrollDelay / this.scrollAmount;
- var player = this.mover_.animate([
- { transform: parameters.transformBegin },
- { transform: parameters.transformEnd },
- ], {
- duration,
- fill: 'forwards',
- });
- player.marquee_ = this;
- player.onfinish = animationFinished_;
-
- this.player_ = player;
- };
-
- HTMLMarqueeElementPrototype.start = function() {
- // User script must not run in a SVGImage, but it's okay to run user
- // agent's script such as <marquee>. However, a function scheduled with
- // requestAnimationFrame is indistinguishable if it's scheduled by user
- // script or user agent's script. Thus we disallow scheduling a task
- // in svg (not limited to SVGImage) entirely.
- if (document.rootElement instanceof SVGElement)
- return;
-
- if (this.continueCallback_)
- return;
- this.continueCallback_ = requestAnimationFrame(function() {
- this.continueCallback_ = null;
- this.continue_();
- }.bind(this));
- };
-
- HTMLMarqueeElementPrototype.stop = function() {
- if (this.continueCallback_) {
- cancelAnimationFrame(this.continueCallback_);
- this.continueCallback_ = null;
- return;
- }
-
- if (this.player_) {
- this.player_.pause();
- }
- };
-});

Powered by Google App Engine
This is Rietveld 408576698