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

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

Issue 682423002: Devtools Animations: Show subtree animations for a given node (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 1 month 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
index 417854d28df64e9577976ff0ef8612e26c97e033..bc0a14a93278327444128bcec7dfafb0c340524d 100644
--- a/Source/devtools/front_end/elements/AnimationsSidebarPane.js
+++ b/Source/devtools/front_end/elements/AnimationsSidebarPane.js
@@ -11,16 +11,42 @@ WebInspector.AnimationsSidebarPane = function(stylesPane)
WebInspector.ElementsSidebarPane.call(this, WebInspector.UIString("Animations"));
this._stylesPane = stylesPane;
+ this.headerElement = createElementWithClass("div", "animationsSettings");
+ this._showSubtreeSetting = WebInspector.settings.createSetting("showSubtreeAnimations", true);
+ this.headerElement.appendChild(WebInspector.AnimationsSidebarPane._showSubtreeAnimationsCheckbox(this._showSubtreeSetting));
+ this._showSubtreeSetting.addChangeListener(this._showSubtreeSettingChanged.bind(this));
this._emptyElement = createElement("div");
this._emptyElement.className = "info";
this._emptyElement.textContent = WebInspector.UIString("No Animations");
+ this.animationsElement = createElement("div");
+ this.animationsElement.appendChild(this._emptyElement);
this._animationSections = [];
- this.bodyElement.appendChild(this._emptyElement);
+ this.bodyElement.appendChild(this.headerElement);
+ this.bodyElement.appendChild(this.animationsElement);
+}
+
+/**
+ * @param {!WebInspector.Setting} setting
+ * @return {!Element}
+ */
+WebInspector.AnimationsSidebarPane._showSubtreeAnimationsCheckbox = function(setting)
+{
+ if (!WebInspector.AnimationsSidebarPane._showSubtreeAnimationsCheckboxElement) {
+ WebInspector.AnimationsSidebarPane._showSubtreeAnimationsCheckboxElement = WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show subtree animations"), setting, true);
+ WebInspector.AnimationsSidebarPane._showSubtreeAnimationsCheckboxElement.classList.add("checkbox-with-label");
+ }
+ return WebInspector.AnimationsSidebarPane._showSubtreeAnimationsCheckboxElement;
}
WebInspector.AnimationsSidebarPane.prototype = {
+ _showSubtreeSettingChanged: function()
+ {
+ this._forceUpdate = true;
+ this.update();
+ },
+
/**
* @param {!WebInspector.Throttler.FinishCallback} finishCallback
* @protected
@@ -33,37 +59,38 @@ WebInspector.AnimationsSidebarPane.prototype = {
*/
function animationPlayersCallback(animationPlayers)
{
- this.bodyElement.removeChildren();
+ this.animationsElement.removeChildren();
this._animationSections = [];
if (!animationPlayers || !animationPlayers.length) {
- this.bodyElement.appendChild(this._emptyElement);
+ this.animationsElement.appendChild(this._emptyElement);
finishCallback();
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");
- separatorElement.createTextChild(WebInspector.UIString("Animation") + " " + player.name());
- this.bodyElement.appendChild(this._animationSections[i].element);
-
- if (player.source().keyframesRule()) {
- var keyframes = player.source().keyframesRule().keyframes();
- for (var j = 0; j < keyframes.length; j++) {
- var style = { selectorText: keyframes[j].offset(), style: keyframes[j].style(), isAttribute: true };
- var section = new WebInspector.StylePropertiesSection(this._stylesPane, style, true, false);
- section.expanded = true;
- this.bodyElement.appendChild(section.element);
- }
- }
+ this._animationSections[i] = new WebInspector.AnimationSection(this, this._stylesPane, player);
+ if (animationPlayers.length < 5)
+ this._animationSections[i].expand(true);
+ this.animationsElement.appendChild(this._animationSections[i].element);
}
finishCallback();
}
- if (!this.node())
+ if (!this.node()) {
+ finishCallback();
+ return;
+ }
+
+ if (!this._forceUpdate && this._selectedNode === this.node()) {
+ for (var i = 0; i < this._animationSections.length; ++i)
+ this._animationSections[i].updateCurrentTime();
+ finishCallback();
return;
- this.node().target().animationModel.getAnimationPlayers(this.node().id, animationPlayersCallback.bind(this));
+ }
+
+ this._forceUpdate = false;
+ this._selectedNode = this.node();
+ this.node().target().animationModel.getAnimationPlayers(this.node().id, this._showSubtreeSetting.get(), animationPlayersCallback.bind(this));
},
__proto__: WebInspector.ElementsSidebarPane.prototype
@@ -72,28 +99,57 @@ WebInspector.AnimationsSidebarPane.prototype = {
/**
* @constructor
* @param {!WebInspector.AnimationsSidebarPane} parentPane
+ * @param {!WebInspector.StylesSidebarPane} stylesPane
* @param {?WebInspector.AnimationModel.AnimationPlayer} animationPlayer
*/
-WebInspector.AnimationSection = function(parentPane, animationPlayer)
+WebInspector.AnimationSection = function(parentPane, stylesPane, animationPlayer)
{
this._parentPane = parentPane;
- this.propertiesSection = createElement("div");
+ this._stylesPane = stylesPane;
+ this._propertiesElement = createElement("div");
+ this._keyframesElement = createElement("div");
this._setAnimationPlayer(animationPlayer);
- this.element = 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);
+
+ this.element = createElement("div");
+ this.element.appendChild(this._createHeader());
+ this.bodyElement = this.element.createChild("div", "animationSectionBody");
+ this.bodyElement.appendChild(this._createAnimationControls());
+ this.bodyElement.appendChild(this._propertiesElement);
+ this.bodyElement.appendChild(this._keyframesElement);
}
WebInspector.AnimationSection.updateTimeout = 100;
WebInspector.AnimationSection.prototype = {
+ /**
+ * @return {boolean}
+ */
+ _expanded: function()
+ {
+ return this.bodyElement.classList.contains("expanded");
+ },
+
+ _toggle: function()
+ {
+ this.bodyElement.classList.toggle("expanded");
+ this.updateCurrentTime();
+ },
+
+ /**
+ * @param {boolean} expanded
+ */
+ expand: function(expanded)
+ {
+ this.bodyElement.classList.toggle("expanded", expanded);
+ this.updateCurrentTime();
+ },
+
updateCurrentTime: function()
{
- this._updateThrottler.schedule(this._updateCurrentTime.bind(this), false);
+ if (this._expanded())
+ this._updateThrottler.schedule(this._updateCurrentTime.bind(this), false);
},
/**
@@ -154,6 +210,28 @@ WebInspector.AnimationSection.prototype = {
/**
* @return {!Element}
*/
+ _createHeader: function()
+ {
+ /**
+ * @param {?WebInspector.DOMNode} node
+ */
+ function nodeResolved(node)
+ {
+ headerElement.addEventListener("mouseover", node.highlight.bind(node, undefined, undefined), false);
+ headerElement.addEventListener("mouseleave", node.domModel().hideDOMNodeHighlight.bind(node.domModel()), false);
+ }
+
+ var headerElement = createElementWithClass("div", "sidebar-separator");
+ var id = this.player.source().name() ? this.player.source().name() : this.player.id();
+ headerElement.createTextChild(WebInspector.UIString("Animation") + " " + id);
+ headerElement.addEventListener("click", this._toggle.bind(this), false);
+ this.player.source().getNode(nodeResolved);
+ return headerElement;
+ },
+
+ /**
+ * @return {!Element}
+ */
_createAnimationControls: function()
{
/**
@@ -202,7 +280,7 @@ WebInspector.AnimationSection.prototype = {
if (!p || p === this.player)
return;
this.player = p;
- this.propertiesSection.removeChildren();
+ this._propertiesElement.removeChildren();
var animationObject = {
"playState": p.playState(),
"start-time": p.startTime(),
@@ -218,7 +296,17 @@ WebInspector.AnimationSection.prototype = {
"time-fraction": p.source().timeFraction()
};
var obj = WebInspector.RemoteObject.fromLocalObject(animationObject);
- var section = new WebInspector.ObjectPropertiesSection(obj, WebInspector.UIString("Animation Properties"));
- this.propertiesSection.appendChild(section.element);
+ var objSection = new WebInspector.ObjectPropertiesSection(obj, WebInspector.UIString("Animation Properties"));
+ this._propertiesElement.appendChild(objSection.element);
+
+ if (this.player.source().keyframesRule()) {
+ var keyframes = this.player.source().keyframesRule().keyframes();
+ for (var j = 0; j < keyframes.length; j++) {
+ var inlineStyle = { selectorText: keyframes[j].offset(), style: keyframes[j].style(), isAttribute: true };
+ var styleSection = new WebInspector.StylePropertiesSection(this._stylesPane, inlineStyle, true, false);
+ styleSection.expanded = true;
+ this._keyframesElement.appendChild(styleSection.element);
+ }
+ }
}
}
« no previous file with comments | « Source/core/inspector/InspectorAnimationAgent.cpp ('k') | Source/devtools/front_end/elements/StylesSidebarPane.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698