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

Unified Diff: Source/devtools/front_end/elements/AnimationsSidebarPane.js

Issue 620783002: Devtools Animations: Basic animation inspection & control in Styles pane (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Remove keyframe view Created 6 years, 2 months 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: Source/devtools/front_end/elements/AnimationsSidebarPane.js
diff --git a/Source/devtools/front_end/elements/AnimationsSidebarPane.js b/Source/devtools/front_end/elements/AnimationsSidebarPane.js
new file mode 100644
index 0000000000000000000000000000000000000000..3cd92c925dc1ef6aecf2577709db14e0f9672097
--- /dev/null
+++ b/Source/devtools/front_end/elements/AnimationsSidebarPane.js
@@ -0,0 +1,221 @@
+// Copyright (c) 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.
+
+/**
+ * @constructor
+ * @extends {WebInspector.SidebarPane}
+ */
+WebInspector.AnimationsSidebarPane = function(stylesPane)
+{
+ WebInspector.SidebarPane.call(this, WebInspector.UIString("Animations"));
+ this._stylesPane = stylesPane;
+
+ this._emptyElement = document.createElement("div");
+ this._emptyElement.className = "info";
+ this._emptyElement.textContent = WebInspector.UIString("No Animations");
+
+ this.bodyElement.appendChild(this._emptyElement);
+}
+
+WebInspector.AnimationsSidebarPane.prototype = {
+ /**
+ * @param {?WebInspector.DOMNode} node
+ */
+ update: function(node)
+ {
+ /**
+ * @param {?Array.<!WebInspector.DOMModel.AnimationPlayer>} animationPlayers
+ * @this {WebInspector.AnimationsSidebarPane}
+ */
+ function animationPlayersCallback(animationPlayers)
+ {
+ this.bodyElement.removeChildren();
+ this._animationSections = [];
+ if (!animationPlayers || !animationPlayers.length) {
+ this.bodyElement.appendChild(this._emptyElement);
+ return;
+ }
+
+ for (var i = 0; i < animationPlayers.length; ++i) {
+ var player = animationPlayers[i];
+ this._animationSections[i] = new WebInspector.AnimationSection(this, player);
+ var separatorElement = this.bodyElement.createChild("div", "sidebar-separator");
+ var id = player.animation().name() ? player.animation().name() : player.id();
+ separatorElement.createTextChild(WebInspector.UIString("Animation") + " " + id);
+ this.bodyElement.appendChild(this._animationSections[i].element);
+ }
+ }
+
+ if (this._selectedNode == node) {
vsevik 2014/10/14 09:08:08 We use ===
samli 2014/10/15 08:46:44 Done.
+ for (var i = 0; i < this._animationSections.length; ++i) {
vsevik 2014/10/14 09:08:09 no need to use {} for one line loops / ifs
samli 2014/10/15 08:46:44 Done.
+ this._animationSections[i].updateCurrentTime();
+ }
+ return;
+ }
+ this._selectedNode = node;
+ node.animationPlayers(animationPlayersCallback.bind(this));
+ },
+ __proto__: WebInspector.SidebarPane.prototype
+}
+
+/**
+ * @constructor
+ * @param {!WebInspector.AnimationsSidebarPane} parentPane
+ * @param {?WebInspector.DOMModel.AnimationPlayer} animationPlayer
+ */
+WebInspector.AnimationSection = function(parentPane, animationPlayer)
+{
+ this._parentPane = parentPane;
+ this.propertiesSection = document.createElement("div");
+ this._setAnimationPlayer(animationPlayer);
+
+ this.element = document.createElement("div");
+ this.element.className = "styles-section";
+
+ this._updateThrottler = new WebInspector.Throttler(WebInspector.AnimationSection.updateTimeout);
+ this.element.appendChild(this._createAnimationControls());
+ this.element.appendChild(this.propertiesSection);
+}
+
+WebInspector.AnimationSection.updateTimeout = 100;
+
+WebInspector.AnimationSection.prototype = {
+ updateCurrentTime: function()
+ {
+ this._updateThrottler.schedule(this._updateCurrentTime.bind(this), false);
+ },
+
+ /**
+ * @param {!WebInspector.Throttler.FinishCallback} finishCallback
+ * @private
vsevik 2014/10/14 09:08:08 we do not use @private annotations.
samli 2014/10/15 08:46:44 Done.
+ */
+ _updateCurrentTime: function(finishCallback)
+ {
+ /**
+ * @param {number} currentTime
+ * @param {boolean} isRunning
+ * @this {WebInspector.AnimationSection}
+ */
+ function updateSliderCallback(currentTime, isRunning)
+ {
+ this.currentTimeSlider.value = this.player.animation().iterationCount() == null ? currentTime % this.player.animation().duration() : currentTime;
+ finishCallback();
+ if (isRunning && this._parentPane.isShowing())
+ this.updateCurrentTime();
+ }
+ this.player.getCurrentState(updateSliderCallback.bind(this));
+ },
+
+ /**
+ * @return {!Element}
+ * @private
+ */
+ _createCurrentTimeSlider: function()
+ {
+ /**
+ * @param {!Event} e
+ * @this {WebInspector.AnimationSection}
+ */
+ function sliderInputHandler(e)
+ {
+ this.player.setCurrentTime(parseFloat(e.target.value), this._setAnimationPlayer.bind(this));
+ }
vsevik 2014/10/14 09:08:08 Please add a blank line after a funciton
samli 2014/10/15 08:46:44 Done.
+ var iterationDuration = this.player.animation().duration();
+ var iterationCount = this.player.animation().iterationCount();
+ var slider = document.createElement("input");
+ slider.type = "range";
+ slider.min = 0;
+ slider.step = 0.01;
+
+ if (!iterationCount) {
+ // Infinite iterations
+ slider.max = iterationDuration;
+ slider.value = this.player.currentTime() % iterationDuration;
+ } else {
+ slider.max = iterationCount * iterationDuration;
+ slider.value = this.player.currentTime();
+ }
+
+ slider.addEventListener("input", sliderInputHandler.bind(this));
+ this.updateCurrentTime();
+ return slider;
+ },
+
+ /**
+ * @return {!Element}
+ * @private
+ */
+ _createAnimationControls: function()
+ {
+ /**
+ * @this {WebInspector.AnimationSection}
+ */
+ function pauseButtonHandler()
+ {
+ if (this.player.paused()) {
+ this.player.play(this._setAnimationPlayer.bind(this));
+ updatePauseButton.call(this, false);
+ this.updateCurrentTime();
+ } else {
+ this.player.pause(this._setAnimationPlayer.bind(this));
+ updatePauseButton.call(this, true);
+ }
+ }
+
+ /**
+ * @param {boolean} paused
+ * @this {WebInspector.AnimationSection}
+ */
+ function updatePauseButton(paused)
+ {
+ this._pauseButton.state = paused;
+ if (paused)
+ this._pauseButton.title = WebInspector.UIString("Play animation");
vsevik 2014/10/14 09:08:09 this._pauseButton.title = paused ? WebInspector.UI
samli 2014/10/15 08:46:44 Done.
+ else
+ this._pauseButton.title = WebInspector.UIString("Pause animation");
+ }
+
+ this._pauseButton = new WebInspector.StatusBarButton("", "animation-pause");
+ updatePauseButton.call(this, this.player.paused());
+ this._pauseButton.addEventListener("click", pauseButtonHandler, this);
+
+ this.currentTimeSlider = this._createCurrentTimeSlider();
+
+ var controls = document.createElement("div");
+ controls.appendChild(this._pauseButton.element);
+ controls.appendChild(this.currentTimeSlider);
+
+ return controls;
+ },
+
+ /**
+ * @param {?WebInspector.DOMModel.AnimationPlayer} p
+ * @private
+ */
+ _setAnimationPlayer: function(p)
+ {
+ if (!p || p === this.player)
+ return;
+ this.player = p;
+ this.propertiesSection.removeChildren();
+ var animationObject = {
+ "paused": p.paused(),
+ "finished": p.finished(),
+ "start-time": p.startTime(),
+ "player-playback-rate": p.playbackRate(),
+ "id": p.id(),
+ "start-delay": p.animation().startDelay(),
+ "playback-rate": p.animation().playbackRate(),
+ "iteration-start": p.animation().iterationStart(),
+ "iteration-count": p.animation().iterationCount(),
+ "duration": p.animation().duration(),
+ "direction": p.animation().direction(),
+ "fill-mode": p.animation().fillMode(),
+ "time-fraction": p.animation().timeFraction()
+ };
+ var obj = WebInspector.RemoteObject.fromLocalObject(animationObject);
+ var section = new WebInspector.ObjectPropertiesSection(obj, WebInspector.UIString("Animation Properties"));
+ this.propertiesSection.appendChild(section.element);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698