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 1556f3f95a8d727ebf87253c37022fc7356ed060..1931ef6369e68e23e2603d2094fefe1e51760539 100644 |
--- a/Source/devtools/front_end/animation/AnimationTimeline.js |
+++ b/Source/devtools/front_end/animation/AnimationTimeline.js |
@@ -21,9 +21,14 @@ WebInspector.AnimationTimeline = function() |
this._underlyingPlaybackRate = 1; |
this.contentElement.appendChild(this._createHeader()); |
this._animationsContainer = this.contentElement.createChild("div", "animation-timeline-rows"); |
+ |
+ this._emptyTimelineMessage = this._animationsContainer.createChild("div", "animation-timeline-empty-message"); |
+ var message = this._emptyTimelineMessage.createChild("div"); |
+ message.textContent = WebInspector.UIString("Trigger animations on the page to view and tweak them on the animation timeline."); |
+ |
this._duration = this._defaultDuration(); |
- this._scrubberRadius = 25; |
- this._timelineControlsWidth = 200; |
+ this._scrubberRadius = 30; |
+ this._timelineControlsWidth = 230; |
/** @type {!Map.<!DOMAgent.BackendNodeId, !WebInspector.AnimationTimeline.NodeUI>} */ |
this._nodesMap = new Map(); |
this._symbol = Symbol("animationTimeline"); |
@@ -126,11 +131,7 @@ WebInspector.AnimationTimeline.prototype = { |
function playbackSliderInputHandler(event) |
{ |
this._underlyingPlaybackRate = WebInspector.AnimationTimeline.GlobalPlaybackRates[event.target.value]; |
- this._setPlaybackRate(this._playbackRate()); |
- this._playbackLabel.textContent = this._underlyingPlaybackRate + "✕"; |
- WebInspector.userMetrics.AnimationsPlaybackRateChanged.record(); |
- if (this._scrubberPlayer) |
- this._scrubberPlayer.playbackRate = this._playbackRate(); |
+ this._updatePlaybackControls(); |
} |
var container = createElementWithClass("div", "animation-timeline-header"); |
@@ -139,14 +140,11 @@ WebInspector.AnimationTimeline.prototype = { |
var toolbar = new WebInspector.Toolbar(controls); |
toolbar.element.classList.add("animation-controls-toolbar"); |
- this._pauseButton = new WebInspector.ToolbarButton(WebInspector.UIString("Pause timeline"), "pause-toolbar-item"); |
- this._pauseButton.addEventListener("click", this._togglePause.bind(this)); |
- toolbar.appendToolbarItem(this._pauseButton); |
- var replayButton = new WebInspector.ToolbarButton(WebInspector.UIString("Replay timeline"), "replay-toolbar-item"); |
- replayButton.addEventListener("click", this._replay.bind(this)); |
- toolbar.appendToolbarItem(replayButton); |
- |
- this._playbackLabel = controls.createChild("div", "animation-playback-label"); |
+ this._controlButton = new WebInspector.ToolbarButton(WebInspector.UIString("Replay timeline"), "replay-outline-toolbar-item"); |
+ this._controlButton.addEventListener("click", this._controlButtonToggle.bind(this)); |
+ toolbar.appendToolbarItem(this._controlButton); |
+ |
+ this._playbackLabel = controls.createChild("span", "animation-playback-label"); |
this._playbackLabel.createTextChild("1x"); |
this._playbackSlider = controls.createChild("input", "animation-playback-slider"); |
@@ -160,6 +158,53 @@ WebInspector.AnimationTimeline.prototype = { |
return container; |
}, |
+ _updatePlaybackControls: function() |
+ { |
+ this._playbackLabel.textContent = this._underlyingPlaybackRate + "x"; |
+ var playbackSliderValue = 0; |
+ for (var rate of WebInspector.AnimationTimeline.GlobalPlaybackRates) { |
+ if (this._underlyingPlaybackRate > rate) |
+ playbackSliderValue++; |
+ } |
+ this._playbackSlider.value = playbackSliderValue; |
+ |
+ for (var target of WebInspector.targetManager.targets(WebInspector.Target.Type.Page)) |
+ WebInspector.AnimationModel.fromTarget(target).setPlaybackRate(this._playbackRate()); |
+ WebInspector.userMetrics.AnimationsPlaybackRateChanged.record(); |
+ if (this._scrubberPlayer) |
+ this._scrubberPlayer.playbackRate = this._playbackRate(); |
+ }, |
+ |
+ _controlButtonToggle: function() |
+ { |
+ if (this._emptyTimelineMessage) |
+ return; |
+ if (this._controlButton.element.classList.contains("play-outline-toolbar-item")) |
+ this._togglePause(false); |
+ else if (this._controlButton.element.classList.contains("replay-outline-toolbar-item")) |
+ this._replay(); |
+ else |
+ this._togglePause(true); |
+ this._updateControlButton(); |
+ }, |
+ |
+ _updateControlButton: function() |
+ { |
+ this._controlButton.element.classList.remove("play-outline-toolbar-item"); |
+ this._controlButton.element.classList.remove("replay-outline-toolbar-item"); |
+ this._controlButton.element.classList.remove("pause-outline-toolbar-item"); |
+ if (this._paused) { |
+ this._controlButton.element.classList.add("play-outline-toolbar-item"); |
+ this._controlButton.setTitle(WebInspector.UIString("Play timeline")); |
+ } else if (!this._scrubberPlayer || this._scrubberPlayer.currentTime >= this.duration() - this._scrubberRadius / this.pixelMsRatio()) { |
+ this._controlButton.element.classList.add("replay-outline-toolbar-item"); |
+ this._controlButton.setTitle(WebInspector.UIString("Replay timeline")); |
+ } else { |
+ this._controlButton.element.classList.add("pause-outline-toolbar-item"); |
+ this._controlButton.setTitle(WebInspector.UIString("Pause timeline")); |
+ } |
+ }, |
+ |
_updateAnimationsPlaybackRate: function() |
{ |
/** |
@@ -171,15 +216,15 @@ WebInspector.AnimationTimeline.prototype = { |
{ |
if (playbackRate === 0) { |
playbackRate = 1; |
- target.animationAgent().setPlaybackRate(1); |
+ if (target) |
+ WebInspector.AnimationModel.fromTarget(target).setPlaybackRate(1); |
} |
this._underlyingPlaybackRate = playbackRate; |
- this._playbackSlider.value = WebInspector.AnimationTimeline.GlobalPlaybackRates.indexOf(playbackRate); |
- this._playbackLabel.textContent = playbackRate + "✕"; |
+ this._updatePlaybackControls(); |
} |
- var target = WebInspector.targetManager.mainTarget(); |
- if (target) |
+ delete this._paused; |
+ for (var target of WebInspector.targetManager.targets(WebInspector.Target.Type.Page)) |
target.animationAgent().getPlaybackRate(setPlaybackRate.bind(this)); |
}, |
@@ -191,13 +236,15 @@ WebInspector.AnimationTimeline.prototype = { |
return this._paused ? 0 : this._underlyingPlaybackRate; |
}, |
- _togglePause: function() |
+ /** |
+ * @param {boolean} pause |
+ */ |
+ _togglePause: function(pause) |
{ |
- this._paused = !this._paused; |
- this._setPlaybackRate(this._playbackRate()); |
+ this._paused = pause; |
+ for (var target of WebInspector.targetManager.targets(WebInspector.Target.Type.Page)) |
+ WebInspector.AnimationModel.fromTarget(target).setPlaybackRate(this._playbackRate()); |
WebInspector.userMetrics.AnimationsPlaybackRateChanged.record(); |
- this._pauseButton.element.classList.toggle("pause-toolbar-item"); |
- this._pauseButton.element.classList.toggle("play-toolbar-item"); |
if (this._scrubberPlayer) |
this._scrubberPlayer.playbackRate = this._playbackRate(); |
}, |
@@ -268,6 +315,7 @@ WebInspector.AnimationTimeline.prototype = { |
this._scrubberPlayer.cancel(); |
delete this._scrubberPlayer; |
this._timelineScrubberHead.textContent = WebInspector.UIString(Number.millisToString(0)); |
+ this._updateControlButton(); |
}, |
/** |
@@ -290,10 +338,17 @@ WebInspector.AnimationTimeline.prototype = { |
*/ |
function nodeResolved(node) |
{ |
+ if (!node) |
+ return; |
uiAnimation.setNode(node); |
node[this._symbol] = nodeUI; |
} |
+ if (this._emptyTimelineMessage) { |
+ this._emptyTimelineMessage.remove(); |
+ delete this._emptyTimelineMessage; |
+ } |
+ |
if (resetTimeline) |
this._reset(); |
@@ -364,7 +419,7 @@ WebInspector.AnimationTimeline.prototype = { |
} |
for (var time = 0; time < this.duration(); time += gridSize) { |
var gridWidth = time * this.pixelMsRatio(); |
- if (time && (!lastDraw || gridWidth - lastDraw > 50)) { |
+ if (!lastDraw || gridWidth - lastDraw > 50) { |
lastDraw = gridWidth; |
var label = this._grid.createSVGChild("text", "animation-timeline-grid-label"); |
label.setAttribute("x", gridWidth + 5); |
@@ -442,6 +497,8 @@ WebInspector.AnimationTimeline.prototype = { |
{ transform: "translateX(" + (this.width() - this._scrubberRadius) + "px)" } |
], { duration: this.duration() - this._scrubberRadius / this.pixelMsRatio(), fill: "forwards" }); |
this._scrubberPlayer.playbackRate = this._playbackRate(); |
+ this._scrubberPlayer.onfinish = this._updateControlButton.bind(this); |
+ this._updateControlButton(); |
if (time !== undefined) |
this._scrubberPlayer.currentTime = time; |
@@ -494,7 +551,8 @@ WebInspector.AnimationTimeline.prototype = { |
this._scrubberPlayer.pause(); |
this._originalMousePosition = new WebInspector.Geometry.Point(event.x, event.y); |
- this._setPlaybackRate(0); |
+ this._togglePause(true); |
+ this._updateControlButton(); |
return true; |
}, |
@@ -516,20 +574,10 @@ WebInspector.AnimationTimeline.prototype = { |
*/ |
_scrubberDragEnd: function(event) |
{ |
- if (this._scrubberPlayer.currentTime < this.duration() - this._scrubberRadius / this.pixelMsRatio()) |
- this._scrubberPlayer.play(); |
+ var currentTime = Math.max(0, this._scrubberPlayer.currentTime); |
+ this._scrubberPlayer.play(); |
+ this._scrubberPlayer.currentTime = currentTime; |
this._timelineScrubberHead.window().requestAnimationFrame(this._updateScrubber.bind(this)); |
- this._setPlaybackRate(this._playbackRate()); |
- }, |
- |
- /** |
- * @param {number} playbackRate |
- */ |
- _setPlaybackRate: function(playbackRate) |
- { |
- var target = WebInspector.targetManager.mainTarget(); |
- if (target) |
- WebInspector.AnimationModel.fromTarget(target).setPlaybackRate(playbackRate); |
}, |
__proto__: WebInspector.VBox.prototype |
@@ -546,8 +594,10 @@ WebInspector.AnimationTimeline.NodeUI = function(animationEffect) { |
*/ |
function nodeResolved(node) |
{ |
+ if (!node) |
+ return; |
this._node = node; |
- this._description.appendChild(WebInspector.DOMPresentationUtils.linkifyNodeReference(node)); |
+ WebInspector.DOMPresentationUtils.decorateNodeLabel(node, this._description); |
this.element.addEventListener("click", WebInspector.Revealer.reveal.bind(WebInspector.Revealer, node, undefined), false); |
} |
@@ -982,8 +1032,7 @@ WebInspector.AnimationUI.prototype = { |
this._setDelay(delay); |
this._setDuration(duration); |
if (this._animation.type() !== "CSSAnimation") { |
- var target = WebInspector.targetManager.mainTarget(); |
- if (target) |
+ for (var target of WebInspector.targetManager.targets(WebInspector.Target.Type.Page)) |
target.animationAgent().setTiming(this._animation.id(), duration, delay); |
} |
} |
@@ -1091,7 +1140,6 @@ WebInspector.AnimationUI.Colors = { |
"Deep Orange": WebInspector.Color.parse("#FF5722"), |
"Blue": WebInspector.Color.parse("#5677FC"), |
"Lime": WebInspector.Color.parse("#CDDC39"), |
- "Blue Grey": WebInspector.Color.parse("#607D8B"), |
"Pink": WebInspector.Color.parse("#E91E63"), |
"Green": WebInspector.Color.parse("#0F9D58"), |
"Brown": WebInspector.Color.parse("#795548"), |