Index: Source/devtools/front_end/animation/AnimationTimeline.js |
diff --git a/Source/devtools/front_end/animation/AnimationTimeline.js b/Source/devtools/front_end/animation/AnimationTimeline.js |
index 1931ef6369e68e23e2603d2094fefe1e51760539..fe9bce5727786b11129c49c3e908d5d5fb0d9150 100644 |
--- a/Source/devtools/front_end/animation/AnimationTimeline.js |
+++ b/Source/devtools/front_end/animation/AnimationTimeline.js |
@@ -31,6 +31,10 @@ WebInspector.AnimationTimeline = function() |
this._timelineControlsWidth = 230; |
/** @type {!Map.<!DOMAgent.BackendNodeId, !WebInspector.AnimationTimeline.NodeUI>} */ |
this._nodesMap = new Map(); |
+ this._groupBuffer = []; |
+ this._groupBufferSize = 8; |
+ /** @type {!Map.<!WebInspector.AnimationModel.AnimationGroup, !WebInspector.AnimationGroupPreviewUI>} */ |
+ this._previewMap = new Map(); |
this._symbol = Symbol("animationTimeline"); |
/** @type {!Map.<string, !WebInspector.AnimationModel.Animation>} */ |
this._animationsMap = new Map(); |
@@ -81,7 +85,7 @@ WebInspector.AnimationTimeline.prototype = { |
{ |
var animationModel = WebInspector.AnimationModel.fromTarget(target); |
animationModel.ensureEnabled(); |
- animationModel.addEventListener(WebInspector.AnimationModel.Events.AnimationCreated, this._animationCreated, this); |
+ animationModel.addEventListener(WebInspector.AnimationModel.Events.AnimationGroupStarted, this._animationGroupStarted, this); |
animationModel.addEventListener(WebInspector.AnimationModel.Events.AnimationCanceled, this._animationCanceled, this); |
}, |
@@ -91,7 +95,7 @@ WebInspector.AnimationTimeline.prototype = { |
_removeEventListeners: function(target) |
{ |
var animationModel = WebInspector.AnimationModel.fromTarget(target); |
- animationModel.removeEventListener(WebInspector.AnimationModel.Events.AnimationCreated, this._animationCreated, this); |
+ animationModel.removeEventListener(WebInspector.AnimationModel.Events.AnimationGroupStarted, this._animationGroupStarted, this); |
animationModel.removeEventListener(WebInspector.AnimationModel.Events.AnimationCanceled, this._animationCanceled, this); |
}, |
@@ -136,7 +140,7 @@ WebInspector.AnimationTimeline.prototype = { |
var container = createElementWithClass("div", "animation-timeline-header"); |
var controls = container.createChild("div", "animation-controls"); |
- container.createChild("div", "animation-timeline-markers"); |
+ this._previewContainer = container.createChild("div", "animation-timeline-buffer"); |
var toolbar = new WebInspector.Toolbar(controls); |
toolbar.element.classList.add("animation-controls-toolbar"); |
@@ -316,21 +320,75 @@ WebInspector.AnimationTimeline.prototype = { |
delete this._scrubberPlayer; |
this._timelineScrubberHead.textContent = WebInspector.UIString(Number.millisToString(0)); |
this._updateControlButton(); |
+ this._groupBuffer = []; |
+ this._previewMap.clear(); |
+ this._previewContainer.removeChildren(); |
}, |
/** |
* @param {!WebInspector.Event} event |
*/ |
- _animationCreated: function(event) |
+ _animationGroupStarted: function(event) |
{ |
- this._addAnimation(/** @type {!WebInspector.AnimationModel.Animation} */ (event.data.player), event.data.resetTimeline) |
+ /** |
+ * @param {!WebInspector.AnimationModel.AnimationGroup} left |
+ * @param {!WebInspector.AnimationModel.AnimationGroup} right |
+ */ |
+ function startTimeComparator(left, right) |
+ { |
+ return left.startTime() > right.startTime(); |
+ } |
+ |
+ var newGroup = /** @type {!WebInspector.AnimationModel.AnimationGroup} */(event.data); |
+ this._groupBuffer.push(newGroup); |
+ this._groupBuffer.sort(startTimeComparator); |
+ // Discard oldest groups from buffer if necessary |
+ var groupsToDiscard = []; |
+ while (this._groupBuffer.length > this._groupBufferSize) { |
+ var toDiscard = this._groupBuffer.splice(this._groupBuffer[0] === this._selectedGroup ? 1 : 0, 1); |
+ groupsToDiscard.push(toDiscard[0]); |
+ } |
+ for (var g of groupsToDiscard) { |
+ this._previewMap.get(g).element.remove(); |
+ this._previewMap.delete(g); |
+ // TODO(samli): needs to discard model too |
+ } |
+ // Generate preview |
+ var preview = new WebInspector.AnimationGroupPreviewUI(newGroup); |
+ this._previewMap.set(newGroup, preview); |
+ this._previewContainer.appendChild(preview.element); |
+ preview.element.addEventListener("click", this._selectAnimationGroup.bind(this, newGroup)); |
+ }, |
+ |
+ /** |
+ * @param {!WebInspector.AnimationModel.AnimationGroup} group |
+ */ |
+ _selectAnimationGroup: function(group) |
+ { |
+ /** |
+ * @param {!WebInspector.AnimationGroupPreviewUI} ui |
+ * @param {!WebInspector.AnimationModel.AnimationGroup} group |
+ * @this {!WebInspector.AnimationTimeline} |
+ */ |
+ function applySelectionClass(ui, group) |
+ { |
+ ui.element.classList.toggle("selected", this._selectedGroup === group); |
+ } |
+ |
+ if (this._selectedGroup === group) |
+ return; |
+ this._selectedGroup = group; |
+ this._previewMap.forEach(applySelectionClass, this); |
+ this._reset(); |
+ for (var anim of group.animations()) |
+ this._addAnimation(anim); |
+ this.scheduleRedraw(); |
}, |
/** |
* @param {!WebInspector.AnimationModel.Animation} animation |
- * @param {boolean} resetTimeline |
*/ |
- _addAnimation: function(animation, resetTimeline) |
+ _addAnimation: function(animation) |
{ |
/** |
* @param {?WebInspector.DOMNode} node |
@@ -349,15 +407,11 @@ WebInspector.AnimationTimeline.prototype = { |
delete this._emptyTimelineMessage; |
} |
- if (resetTimeline) |
- this._reset(); |
- |
// Ignore Web Animations custom effects & groups |
if (animation.type() === "WebAnimation" && animation.source().keyframesRule().keyframes().length === 0) |
return; |
- if (this._resizeWindow(animation)) |
- this.scheduleRedraw(); |
+ this._resizeWindow(animation); |
var nodeUI = this._nodesMap.get(animation.source().backendNodeId()); |
if (!nodeUI) { |
@@ -423,7 +477,7 @@ WebInspector.AnimationTimeline.prototype = { |
lastDraw = gridWidth; |
var label = this._grid.createSVGChild("text", "animation-timeline-grid-label"); |
label.setAttribute("x", gridWidth + 5); |
- label.setAttribute("y", 35); |
+ label.setAttribute("y", 15); |
label.textContent = WebInspector.UIString(Number.millisToString(time)); |
} |
} |
@@ -587,7 +641,8 @@ WebInspector.AnimationTimeline.prototype = { |
* @constructor |
* @param {!WebInspector.AnimationModel.AnimationEffect} animationEffect |
*/ |
-WebInspector.AnimationTimeline.NodeUI = function(animationEffect) { |
+WebInspector.AnimationTimeline.NodeUI = function(animationEffect) |
+{ |
/** |
* @param {?WebInspector.DOMNode} node |
* @this {WebInspector.AnimationTimeline.NodeUI} |
@@ -694,454 +749,3 @@ WebInspector.AnimationTimeline.StepTimingFunction.parse = function(text) { |
return new WebInspector.AnimationTimeline.StepTimingFunction(parseInt(match[1], 10), match[2]); |
return null; |
} |
- |
-/** |
- * @constructor |
- * @param {!WebInspector.AnimationModel.Animation} animation |
- * @param {!WebInspector.AnimationTimeline} timeline |
- * @param {!Element} parentElement |
- */ |
-WebInspector.AnimationUI = function(animation, timeline, parentElement) { |
- this._animation = animation; |
- this._timeline = timeline; |
- this._parentElement = parentElement; |
- |
- if (this._animation.source().keyframesRule()) |
- this._keyframes = this._animation.source().keyframesRule().keyframes(); |
- |
- this._nameElement = parentElement.createChild("div", "animation-name"); |
- this._nameElement.textContent = this._animation.name(); |
- |
- this._svg = parentElement.createSVGChild("svg", "animation-ui"); |
- this._svg.setAttribute("height", WebInspector.AnimationUI.Options.AnimationSVGHeight); |
- this._svg.style.marginLeft = "-" + WebInspector.AnimationUI.Options.AnimationMargin + "px"; |
- this._svg.addEventListener("mousedown", this._mouseDown.bind(this, WebInspector.AnimationUI.MouseEvents.AnimationDrag, null)); |
- this._activeIntervalGroup = this._svg.createSVGChild("g"); |
- |
- /** @type {!Array.<{group: ?Element, animationLine: ?Element, keyframePoints: !Object.<number, !Element>, keyframeRender: !Object.<number, !Element>}>} */ |
- this._cachedElements = []; |
- |
- this._movementInMs = 0; |
- this.redraw(); |
-} |
- |
-/** |
- * @enum {string} |
- */ |
-WebInspector.AnimationUI.MouseEvents = { |
- AnimationDrag: "AnimationDrag", |
- KeyframeMove: "KeyframeMove", |
- StartEndpointMove: "StartEndpointMove", |
- FinishEndpointMove: "FinishEndpointMove" |
-} |
- |
-WebInspector.AnimationUI.prototype = { |
- /** |
- * @return {!WebInspector.AnimationModel.Animation} |
- */ |
- animation: function() |
- { |
- return this._animation; |
- }, |
- |
- /** |
- * @param {?WebInspector.DOMNode} node |
- */ |
- setNode: function(node) |
- { |
- this._node = node; |
- }, |
- |
- /** |
- * @param {!Element} parentElement |
- * @param {string} className |
- */ |
- _createLine: function(parentElement, className) |
- { |
- var line = parentElement.createSVGChild("line", className); |
- line.setAttribute("x1", WebInspector.AnimationUI.Options.AnimationMargin); |
- line.setAttribute("y1", WebInspector.AnimationUI.Options.AnimationHeight); |
- line.setAttribute("y2", WebInspector.AnimationUI.Options.AnimationHeight); |
- line.style.stroke = this._color(); |
- return line; |
- }, |
- |
- /** |
- * @param {number} iteration |
- * @param {!Element} parentElement |
- */ |
- _drawAnimationLine: function(iteration, parentElement) |
- { |
- var cache = this._cachedElements[iteration]; |
- if (!cache.animationLine) |
- cache.animationLine = this._createLine(parentElement, "animation-line"); |
- cache.animationLine.setAttribute("x2", (this._duration() * this._timeline.pixelMsRatio() + WebInspector.AnimationUI.Options.AnimationMargin).toFixed(2)); |
- }, |
- |
- /** |
- * @param {!Element} parentElement |
- */ |
- _drawDelayLine: function(parentElement) |
- { |
- if (!this._delayLine) { |
- this._delayLine = this._createLine(parentElement, "animation-delay-line"); |
- this._endDelayLine = this._createLine(parentElement, "animation-delay-line"); |
- } |
- this._delayLine.setAttribute("x1", WebInspector.AnimationUI.Options.AnimationMargin); |
- this._delayLine.setAttribute("x2", (this._delay() * this._timeline.pixelMsRatio() + WebInspector.AnimationUI.Options.AnimationMargin).toFixed(2)); |
- var leftMargin = (this._delay() + this._duration() * this._animation.source().iterations()) * this._timeline.pixelMsRatio(); |
- this._endDelayLine.style.transform = "translateX(" + Math.min(leftMargin, this._timeline.width()).toFixed(2) + "px)"; |
- this._endDelayLine.setAttribute("x1", WebInspector.AnimationUI.Options.AnimationMargin); |
- this._endDelayLine.setAttribute("x2", (this._animation.source().endDelay() * this._timeline.pixelMsRatio() + WebInspector.AnimationUI.Options.AnimationMargin).toFixed(2)); |
- }, |
- |
- /** |
- * @param {number} iteration |
- * @param {!Element} parentElement |
- * @param {number} x |
- * @param {number} keyframeIndex |
- * @param {boolean} attachEvents |
- */ |
- _drawPoint: function(iteration, parentElement, x, keyframeIndex, attachEvents) |
- { |
- if (this._cachedElements[iteration].keyframePoints[keyframeIndex]) { |
- this._cachedElements[iteration].keyframePoints[keyframeIndex].setAttribute("cx", x.toFixed(2)); |
- return; |
- } |
- |
- var circle = parentElement.createSVGChild("circle", keyframeIndex <= 0 ? "animation-endpoint" : "animation-keyframe-point"); |
- circle.setAttribute("cx", x.toFixed(2)); |
- circle.setAttribute("cy", WebInspector.AnimationUI.Options.AnimationHeight); |
- circle.style.stroke = this._color(); |
- circle.setAttribute("r", WebInspector.AnimationUI.Options.AnimationMargin / 2); |
- |
- if (keyframeIndex <= 0) |
- circle.style.fill = this._color(); |
- |
- this._cachedElements[iteration].keyframePoints[keyframeIndex] = circle; |
- |
- if (!attachEvents) |
- return; |
- |
- if (keyframeIndex === 0) { |
- circle.addEventListener("mousedown", this._mouseDown.bind(this, WebInspector.AnimationUI.MouseEvents.StartEndpointMove, keyframeIndex)); |
- } else if (keyframeIndex === -1) { |
- circle.addEventListener("mousedown", this._mouseDown.bind(this, WebInspector.AnimationUI.MouseEvents.FinishEndpointMove, keyframeIndex)); |
- } else { |
- circle.addEventListener("mousedown", this._mouseDown.bind(this, WebInspector.AnimationUI.MouseEvents.KeyframeMove, keyframeIndex)); |
- } |
- }, |
- |
- /** |
- * @param {number} iteration |
- * @param {number} keyframeIndex |
- * @param {!Element} parentElement |
- * @param {number} leftDistance |
- * @param {number} width |
- * @param {string} easing |
- */ |
- _renderKeyframe: function(iteration, keyframeIndex, parentElement, leftDistance, width, easing) |
- { |
- /** |
- * @param {!Element} parentElement |
- * @param {number} x |
- * @param {string} strokeColor |
- */ |
- function createStepLine(parentElement, x, strokeColor) |
- { |
- var line = parentElement.createSVGChild("line"); |
- line.setAttribute("x1", x); |
- line.setAttribute("x2", x); |
- line.setAttribute("y1", WebInspector.AnimationUI.Options.AnimationMargin); |
- line.setAttribute("y2", WebInspector.AnimationUI.Options.AnimationHeight); |
- line.style.stroke = strokeColor; |
- } |
- |
- var bezier = WebInspector.Geometry.CubicBezier.parse(easing); |
- var cache = this._cachedElements[iteration].keyframeRender; |
- if (!cache[keyframeIndex]) |
- cache[keyframeIndex] = bezier ? parentElement.createSVGChild("path", "animation-keyframe") : parentElement.createSVGChild("g", "animation-keyframe-step"); |
- var group = cache[keyframeIndex]; |
- group.style.transform = "translateX(" + leftDistance.toFixed(2) + "px)"; |
- |
- if (bezier) { |
- group.style.fill = this._color(); |
- WebInspector.BezierUI.drawVelocityChart(bezier, group, width); |
- } else { |
- var stepFunction = WebInspector.AnimationTimeline.StepTimingFunction.parse(easing); |
- group.removeChildren(); |
- const offsetMap = {"start": 0, "middle": 0.5, "end": 1}; |
- const offsetWeight = offsetMap[stepFunction.stepAtPosition]; |
- for (var i = 0; i < stepFunction.steps; i++) |
- createStepLine(group, (i + offsetWeight) * width / stepFunction.steps, this._color()); |
- } |
- }, |
- |
- redraw: function() |
- { |
- var durationWithDelay = this._delay() + this._duration() * this._animation.source().iterations() + this._animation.source().endDelay(); |
- var leftMargin = ((this._animation.startTime() - this._timeline.startTime()) * this._timeline.pixelMsRatio()); |
- var maxWidth = this._timeline.width() - WebInspector.AnimationUI.Options.AnimationMargin - leftMargin; |
- var svgWidth = Math.min(maxWidth, durationWithDelay * this._timeline.pixelMsRatio()); |
- |
- this._svg.classList.toggle("animation-ui-canceled", this._animation.playState() === "idle"); |
- this._svg.setAttribute("width", (svgWidth + 2 * WebInspector.AnimationUI.Options.AnimationMargin).toFixed(2)); |
- this._svg.style.transform = "translateX(" + leftMargin.toFixed(2) + "px)"; |
- this._activeIntervalGroup.style.transform = "translateX(" + (this._delay() * this._timeline.pixelMsRatio()).toFixed(2) + "px)"; |
- |
- this._nameElement.style.transform = "translateX(" + (leftMargin + this._delay() * this._timeline.pixelMsRatio() + WebInspector.AnimationUI.Options.AnimationMargin).toFixed(2) + "px)"; |
- this._nameElement.style.width = (this._duration() * this._timeline.pixelMsRatio().toFixed(2)) + "px"; |
- this._drawDelayLine(this._svg); |
- |
- if (this._animation.type() === "CSSTransition") { |
- this._renderTransition(); |
- return; |
- } |
- |
- this._renderIteration(this._activeIntervalGroup, 0); |
- if (!this._tailGroup) |
- this._tailGroup = this._activeIntervalGroup.createSVGChild("g", "animation-tail-iterations"); |
- var iterationWidth = this._duration() * this._timeline.pixelMsRatio(); |
- for (var iteration = 1; iteration < this._animation.source().iterations() && iterationWidth * (iteration - 1) < this._timeline.width(); iteration++) |
- this._renderIteration(this._tailGroup, iteration); |
- while (iteration < this._cachedElements.length) |
- this._cachedElements.pop().group.remove(); |
- }, |
- |
- |
- _renderTransition: function() |
- { |
- if (!this._cachedElements[0]) |
- this._cachedElements[0] = { animationLine: null, keyframePoints: {}, keyframeRender: {}, group: null }; |
- this._drawAnimationLine(0, this._activeIntervalGroup); |
- this._renderKeyframe(0, 0, this._activeIntervalGroup, WebInspector.AnimationUI.Options.AnimationMargin, this._duration() * this._timeline.pixelMsRatio(), this._animation.source().easing()); |
- this._drawPoint(0, this._activeIntervalGroup, WebInspector.AnimationUI.Options.AnimationMargin, 0, true); |
- this._drawPoint(0, this._activeIntervalGroup, this._duration() * this._timeline.pixelMsRatio() + WebInspector.AnimationUI.Options.AnimationMargin, -1, true); |
- }, |
- |
- /** |
- * @param {!Element} parentElement |
- * @param {number} iteration |
- */ |
- _renderIteration: function(parentElement, iteration) |
- { |
- if (!this._cachedElements[iteration]) |
- this._cachedElements[iteration] = { animationLine: null, keyframePoints: {}, keyframeRender: {}, group: parentElement.createSVGChild("g") }; |
- var group = this._cachedElements[iteration].group; |
- group.style.transform = "translateX(" + (iteration * this._duration() * this._timeline.pixelMsRatio()).toFixed(2) + "px)"; |
- this._drawAnimationLine(iteration, group); |
- console.assert(this._keyframes.length > 1); |
- for (var i = 0; i < this._keyframes.length - 1; i++) { |
- var leftDistance = this._offset(i) * this._duration() * this._timeline.pixelMsRatio() + WebInspector.AnimationUI.Options.AnimationMargin; |
- var width = this._duration() * (this._offset(i + 1) - this._offset(i)) * this._timeline.pixelMsRatio(); |
- this._renderKeyframe(iteration, i, group, leftDistance, width, this._keyframes[i].easing()); |
- if (i || (!i && iteration === 0)) |
- this._drawPoint(iteration, group, leftDistance, i, iteration === 0); |
- } |
- this._drawPoint(iteration, group, this._duration() * this._timeline.pixelMsRatio() + WebInspector.AnimationUI.Options.AnimationMargin, -1, iteration === 0); |
- }, |
- |
- /** |
- * @return {number} |
- */ |
- _delay: function() |
- { |
- var delay = this._animation.source().delay(); |
- if (this._mouseEventType === WebInspector.AnimationUI.MouseEvents.AnimationDrag || this._mouseEventType === WebInspector.AnimationUI.MouseEvents.StartEndpointMove) |
- delay += this._movementInMs; |
- // FIXME: add support for negative start delay |
- return Math.max(0, delay); |
- }, |
- |
- /** |
- * @return {number} |
- */ |
- _duration: function() |
- { |
- var duration = this._animation.source().duration(); |
- if (this._mouseEventType === WebInspector.AnimationUI.MouseEvents.FinishEndpointMove) |
- duration += this._movementInMs; |
- else if (this._mouseEventType === WebInspector.AnimationUI.MouseEvents.StartEndpointMove) |
- duration -= Math.max(this._movementInMs, -this._animation.source().delay()); // Cannot have negative delay |
- return Math.max(0, duration); |
- }, |
- |
- /** |
- * @param {number} i |
- * @return {number} offset |
- */ |
- _offset: function(i) |
- { |
- var offset = this._keyframes[i].offsetAsNumber(); |
- if (this._mouseEventType === WebInspector.AnimationUI.MouseEvents.KeyframeMove && i === this._keyframeMoved) { |
- console.assert(i > 0 && i < this._keyframes.length - 1, "First and last keyframe cannot be moved"); |
- offset += this._movementInMs / this._animation.source().duration(); |
- offset = Math.max(offset, this._keyframes[i - 1].offsetAsNumber()); |
- offset = Math.min(offset, this._keyframes[i + 1].offsetAsNumber()); |
- } |
- return offset; |
- }, |
- |
- /** |
- * @param {!WebInspector.AnimationUI.MouseEvents} mouseEventType |
- * @param {?number} keyframeIndex |
- * @param {!Event} event |
- */ |
- _mouseDown: function(mouseEventType, keyframeIndex, event) |
- { |
- if (this._animation.playState() === "idle") |
- return; |
- this._mouseEventType = mouseEventType; |
- this._keyframeMoved = keyframeIndex; |
- this._downMouseX = event.clientX; |
- this._mouseMoveHandler = this._mouseMove.bind(this); |
- this._mouseUpHandler = this._mouseUp.bind(this); |
- this._parentElement.ownerDocument.addEventListener("mousemove", this._mouseMoveHandler); |
- this._parentElement.ownerDocument.addEventListener("mouseup", this._mouseUpHandler); |
- event.preventDefault(); |
- event.stopPropagation(); |
- |
- if (this._node) |
- WebInspector.Revealer.reveal(this._node); |
- }, |
- |
- /** |
- * @param {!Event} event |
- */ |
- _mouseMove: function (event) |
- { |
- this._movementInMs = (event.clientX - this._downMouseX) / this._timeline.pixelMsRatio(); |
- if (this._animation.startTime() + this._delay() + this._duration() - this._timeline.startTime() > this._timeline.duration() * 0.8) |
- this._timeline.setDuration(this._timeline.duration() * 1.2); |
- this.redraw(); |
- }, |
- |
- /** |
- * @param {!Event} event |
- */ |
- _mouseUp: function(event) |
- { |
- this._movementInMs = (event.clientX - this._downMouseX) / this._timeline.pixelMsRatio(); |
- |
- // Commit changes |
- if (this._mouseEventType === WebInspector.AnimationUI.MouseEvents.KeyframeMove) { |
- this._keyframes[this._keyframeMoved].setOffset(this._offset(this._keyframeMoved)); |
- } else { |
- var delay = this._delay(); |
- var duration = this._duration(); |
- this._setDelay(delay); |
- this._setDuration(duration); |
- if (this._animation.type() !== "CSSAnimation") { |
- for (var target of WebInspector.targetManager.targets(WebInspector.Target.Type.Page)) |
- target.animationAgent().setTiming(this._animation.id(), duration, delay); |
- } |
- } |
- |
- this._movementInMs = 0; |
- this.redraw(); |
- |
- this._parentElement.ownerDocument.removeEventListener("mousemove", this._mouseMoveHandler); |
- this._parentElement.ownerDocument.removeEventListener("mouseup", this._mouseUpHandler); |
- delete this._mouseMoveHandler; |
- delete this._mouseUpHandler; |
- delete this._mouseEventType; |
- delete this._downMouseX; |
- delete this._keyframeMoved; |
- }, |
- |
- /** |
- * @param {number} value |
- */ |
- _setDelay: function(value) |
- { |
- if (!this._node || this._animation.source().delay() == this._delay()) |
- return; |
- |
- this._animation.source().setDelay(this._delay()); |
- var propertyName; |
- if (this._animation.type() == "CSSTransition") |
- propertyName = "transition-delay"; |
- else if (this._animation.type() == "CSSAnimation") |
- propertyName = "animation-delay"; |
- else |
- return; |
- this._setNodeStyle(propertyName, Math.round(value) + "ms"); |
- }, |
- |
- /** |
- * @param {number} value |
- */ |
- _setDuration: function(value) |
- { |
- if (!this._node || this._animation.source().duration() == value) |
- return; |
- |
- this._animation.source().setDuration(value); |
- var propertyName; |
- if (this._animation.type() == "CSSTransition") |
- propertyName = "transition-duration"; |
- else if (this._animation.type() == "CSSAnimation") |
- propertyName = "animation-duration"; |
- else |
- return; |
- this._setNodeStyle(propertyName, Math.round(value) + "ms"); |
- }, |
- |
- /** |
- * @param {string} name |
- * @param {string} value |
- */ |
- _setNodeStyle: function(name, value) |
- { |
- var style = this._node.getAttribute("style") || ""; |
- if (style) |
- style = style.replace(new RegExp("\\s*(-webkit-)?" + name + ":[^;]*;?\\s*", "g"), ""); |
- var valueString = name + ": " + value; |
- this._node.setAttributeValue("style", style + " " + valueString + "; -webkit-" + valueString + ";"); |
- }, |
- |
- /** |
- * @return {string} |
- */ |
- _color: function() |
- { |
- /** |
- * @param {string} string |
- * @return {number} |
- */ |
- function hash(string) |
- { |
- var hash = 0; |
- for (var i = 0; i < string.length; i++) |
- hash = (hash << 5) + hash + string.charCodeAt(i); |
- return Math.abs(hash); |
- } |
- |
- if (!this._selectedColor) { |
- var names = Object.keys(WebInspector.AnimationUI.Colors); |
- var color = WebInspector.AnimationUI.Colors[names[hash(this._animation.name() || this._animation.id()) % names.length]]; |
- this._selectedColor = color.asString(WebInspector.Color.Format.RGB); |
- } |
- return this._selectedColor; |
- } |
-} |
- |
-WebInspector.AnimationUI.Options = { |
- AnimationHeight: 32, |
- AnimationSVGHeight: 80, |
- AnimationMargin: 7, |
- EndpointsClickRegionSize: 10, |
- GridCanvasHeight: 40 |
-} |
- |
-WebInspector.AnimationUI.Colors = { |
- "Purple": WebInspector.Color.parse("#9C27B0"), |
- "Light Blue": WebInspector.Color.parse("#03A9F4"), |
- "Deep Orange": WebInspector.Color.parse("#FF5722"), |
- "Blue": WebInspector.Color.parse("#5677FC"), |
- "Lime": WebInspector.Color.parse("#CDDC39"), |
- "Pink": WebInspector.Color.parse("#E91E63"), |
- "Green": WebInspector.Color.parse("#0F9D58"), |
- "Brown": WebInspector.Color.parse("#795548"), |
- "Cyan": WebInspector.Color.parse("#00BCD4") |
-} |