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

Side by Side Diff: Source/devtools/front_end/animation/AnimationTimeline.js

Issue 1156323003: Devtools Animations: Update timeline controls and UI (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 3 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | Source/devtools/front_end/animation/animationTimeline.css » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** 5 /**
6 * @constructor 6 * @constructor
7 * @extends {WebInspector.VBox} 7 * @extends {WebInspector.VBox}
8 * @implements {WebInspector.TargetManager.Observer} 8 * @implements {WebInspector.TargetManager.Observer}
9 */ 9 */
10 WebInspector.AnimationTimeline = function() 10 WebInspector.AnimationTimeline = function()
11 { 11 {
12 WebInspector.VBox.call(this, true); 12 WebInspector.VBox.call(this, true);
13 this.registerRequiredCSS("animation/animationTimeline.css"); 13 this.registerRequiredCSS("animation/animationTimeline.css");
14 this.element.classList.add("animations-timeline"); 14 this.element.classList.add("animations-timeline");
15 15
16 this._grid = this.contentElement.createSVGChild("svg", "animation-timeline-g rid"); 16 this._grid = this.contentElement.createSVGChild("svg", "animation-timeline-g rid");
17 this.contentElement.appendChild(this._createScrubber()); 17 this.contentElement.appendChild(this._createScrubber());
18 WebInspector.installDragHandle(this._timelineScrubberHead, this._scrubberDra gStart.bind(this), this._scrubberDragMove.bind(this), this._scrubberDragEnd.bind (this), "move"); 18 WebInspector.installDragHandle(this._timelineScrubberHead, this._scrubberDra gStart.bind(this), this._scrubberDragMove.bind(this), this._scrubberDragEnd.bind (this), "move");
19 this._timelineScrubberHead.textContent = WebInspector.UIString(Number.millis ToString(0)); 19 this._timelineScrubberHead.textContent = WebInspector.UIString(Number.millis ToString(0));
20 20
21 this._underlyingPlaybackRate = 1; 21 this._underlyingPlaybackRate = 1;
22 this.contentElement.appendChild(this._createHeader()); 22 this.contentElement.appendChild(this._createHeader());
23 this._animationsContainer = this.contentElement.createChild("div", "animatio n-timeline-rows"); 23 this._animationsContainer = this.contentElement.createChild("div", "animatio n-timeline-rows");
24
25 this._emptyTimelineMessage = this._animationsContainer.createChild("div", "a nimation-timeline-empty-message");
26 var message = this._emptyTimelineMessage.createChild("div");
27 message.textContent = WebInspector.UIString("Trigger animations on the page to view and tweak them on the animation timeline.");
28
24 this._duration = this._defaultDuration(); 29 this._duration = this._defaultDuration();
25 this._scrubberRadius = 25; 30 this._scrubberRadius = 30;
26 this._timelineControlsWidth = 200; 31 this._timelineControlsWidth = 230;
27 /** @type {!Map.<!DOMAgent.BackendNodeId, !WebInspector.AnimationTimeline.No deUI>} */ 32 /** @type {!Map.<!DOMAgent.BackendNodeId, !WebInspector.AnimationTimeline.No deUI>} */
28 this._nodesMap = new Map(); 33 this._nodesMap = new Map();
29 this._symbol = Symbol("animationTimeline"); 34 this._symbol = Symbol("animationTimeline");
30 /** @type {!Map.<string, !WebInspector.AnimationModel.Animation>} */ 35 /** @type {!Map.<string, !WebInspector.AnimationModel.Animation>} */
31 this._animationsMap = new Map(); 36 this._animationsMap = new Map();
32 WebInspector.targetManager.addModelListener(WebInspector.ResourceTreeModel, WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._mainFrameNav igated, this); 37 WebInspector.targetManager.addModelListener(WebInspector.ResourceTreeModel, WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._mainFrameNav igated, this);
33 WebInspector.targetManager.addModelListener(WebInspector.DOMModel, WebInspec tor.DOMModel.Events.NodeRemoved, this._nodeRemoved, this); 38 WebInspector.targetManager.addModelListener(WebInspector.DOMModel, WebInspec tor.DOMModel.Events.NodeRemoved, this._nodeRemoved, this);
34 39
35 WebInspector.targetManager.observeTargets(this, WebInspector.Target.Type.Pag e); 40 WebInspector.targetManager.observeTargets(this, WebInspector.Target.Type.Pag e);
36 } 41 }
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 */ 124 */
120 _createHeader: function() 125 _createHeader: function()
121 { 126 {
122 /** 127 /**
123 * @param {!Event} event 128 * @param {!Event} event
124 * @this {WebInspector.AnimationTimeline} 129 * @this {WebInspector.AnimationTimeline}
125 */ 130 */
126 function playbackSliderInputHandler(event) 131 function playbackSliderInputHandler(event)
127 { 132 {
128 this._underlyingPlaybackRate = WebInspector.AnimationTimeline.Global PlaybackRates[event.target.value]; 133 this._underlyingPlaybackRate = WebInspector.AnimationTimeline.Global PlaybackRates[event.target.value];
129 this._setPlaybackRate(this._playbackRate()); 134 this._updatePlaybackControls();
130 this._playbackLabel.textContent = this._underlyingPlaybackRate + "✕" ;
131 WebInspector.userMetrics.AnimationsPlaybackRateChanged.record();
132 if (this._scrubberPlayer)
133 this._scrubberPlayer.playbackRate = this._playbackRate();
134 } 135 }
135 136
136 var container = createElementWithClass("div", "animation-timeline-header "); 137 var container = createElementWithClass("div", "animation-timeline-header ");
137 var controls = container.createChild("div", "animation-controls"); 138 var controls = container.createChild("div", "animation-controls");
138 container.createChild("div", "animation-timeline-markers"); 139 container.createChild("div", "animation-timeline-markers");
139 140
140 var toolbar = new WebInspector.Toolbar(controls); 141 var toolbar = new WebInspector.Toolbar(controls);
141 toolbar.element.classList.add("animation-controls-toolbar"); 142 toolbar.element.classList.add("animation-controls-toolbar");
142 this._pauseButton = new WebInspector.ToolbarButton(WebInspector.UIString ("Pause timeline"), "pause-toolbar-item"); 143 this._controlButton = new WebInspector.ToolbarButton(WebInspector.UIStri ng("Replay timeline"), "replay-outline-toolbar-item");
143 this._pauseButton.addEventListener("click", this._togglePause.bind(this) ); 144 this._controlButton.addEventListener("click", this._controlButtonToggle. bind(this));
144 toolbar.appendToolbarItem(this._pauseButton); 145 toolbar.appendToolbarItem(this._controlButton);
145 var replayButton = new WebInspector.ToolbarButton(WebInspector.UIString( "Replay timeline"), "replay-toolbar-item");
146 replayButton.addEventListener("click", this._replay.bind(this));
147 toolbar.appendToolbarItem(replayButton);
148 146
149 this._playbackLabel = controls.createChild("div", "animation-playback-la bel"); 147 this._playbackLabel = controls.createChild("span", "animation-playback-l abel");
150 this._playbackLabel.createTextChild("1x"); 148 this._playbackLabel.createTextChild("1x");
151 149
152 this._playbackSlider = controls.createChild("input", "animation-playback -slider"); 150 this._playbackSlider = controls.createChild("input", "animation-playback -slider");
153 this._playbackSlider.type = "range"; 151 this._playbackSlider.type = "range";
154 this._playbackSlider.min = 0; 152 this._playbackSlider.min = 0;
155 this._playbackSlider.max = WebInspector.AnimationTimeline.GlobalPlayback Rates.length - 1; 153 this._playbackSlider.max = WebInspector.AnimationTimeline.GlobalPlayback Rates.length - 1;
156 this._playbackSlider.value = this._playbackSlider.max; 154 this._playbackSlider.value = this._playbackSlider.max;
157 this._playbackSlider.addEventListener("input", playbackSliderInputHandle r.bind(this)); 155 this._playbackSlider.addEventListener("input", playbackSliderInputHandle r.bind(this));
158 this._updateAnimationsPlaybackRate(); 156 this._updateAnimationsPlaybackRate();
159 157
160 return container; 158 return container;
161 }, 159 },
162 160
161 _updatePlaybackControls: function()
162 {
163 this._playbackLabel.textContent = this._underlyingPlaybackRate + "x";
164 var playbackSliderValue = 0;
165 for (var rate of WebInspector.AnimationTimeline.GlobalPlaybackRates) {
166 if (this._underlyingPlaybackRate > rate)
167 playbackSliderValue++;
168 }
169 this._playbackSlider.value = playbackSliderValue;
170
171 for (var target of WebInspector.targetManager.targets(WebInspector.Targe t.Type.Page))
172 WebInspector.AnimationModel.fromTarget(target).setPlaybackRate(this. _playbackRate());
173 WebInspector.userMetrics.AnimationsPlaybackRateChanged.record();
174 if (this._scrubberPlayer)
175 this._scrubberPlayer.playbackRate = this._playbackRate();
176 },
177
178 _controlButtonToggle: function()
179 {
180 if (this._emptyTimelineMessage)
181 return;
182 if (this._controlButton.element.classList.contains("play-outline-toolbar -item"))
183 this._togglePause(false);
184 else if (this._controlButton.element.classList.contains("replay-outline- toolbar-item"))
185 this._replay();
186 else
187 this._togglePause(true);
188 this._updateControlButton();
189 },
190
191 _updateControlButton: function()
192 {
193 this._controlButton.element.classList.remove("play-outline-toolbar-item" );
194 this._controlButton.element.classList.remove("replay-outline-toolbar-ite m");
195 this._controlButton.element.classList.remove("pause-outline-toolbar-item ");
196 if (this._paused) {
197 this._controlButton.element.classList.add("play-outline-toolbar-item ");
198 this._controlButton.setTitle(WebInspector.UIString("Play timeline")) ;
199 } else if (!this._scrubberPlayer || this._scrubberPlayer.currentTime >= this.duration() - this._scrubberRadius / this.pixelMsRatio()) {
200 this._controlButton.element.classList.add("replay-outline-toolbar-it em");
201 this._controlButton.setTitle(WebInspector.UIString("Replay timeline" ));
202 } else {
203 this._controlButton.element.classList.add("pause-outline-toolbar-ite m");
204 this._controlButton.setTitle(WebInspector.UIString("Pause timeline") );
205 }
206 },
207
163 _updateAnimationsPlaybackRate: function() 208 _updateAnimationsPlaybackRate: function()
164 { 209 {
165 /** 210 /**
166 * @param {?Protocol.Error} error 211 * @param {?Protocol.Error} error
167 * @param {number} playbackRate 212 * @param {number} playbackRate
168 * @this {WebInspector.AnimationTimeline} 213 * @this {WebInspector.AnimationTimeline}
169 */ 214 */
170 function setPlaybackRate(error, playbackRate) 215 function setPlaybackRate(error, playbackRate)
171 { 216 {
172 if (playbackRate === 0) { 217 if (playbackRate === 0) {
173 playbackRate = 1; 218 playbackRate = 1;
174 target.animationAgent().setPlaybackRate(1); 219 if (target)
220 WebInspector.AnimationModel.fromTarget(target).setPlaybackRa te(1);
175 } 221 }
176 this._underlyingPlaybackRate = playbackRate; 222 this._underlyingPlaybackRate = playbackRate;
177 this._playbackSlider.value = WebInspector.AnimationTimeline.GlobalPl aybackRates.indexOf(playbackRate); 223 this._updatePlaybackControls();
178 this._playbackLabel.textContent = playbackRate + "✕";
179 } 224 }
180 225
181 var target = WebInspector.targetManager.mainTarget(); 226 delete this._paused;
182 if (target) 227 for (var target of WebInspector.targetManager.targets(WebInspector.Targe t.Type.Page))
183 target.animationAgent().getPlaybackRate(setPlaybackRate.bind(this)); 228 target.animationAgent().getPlaybackRate(setPlaybackRate.bind(this));
184 }, 229 },
185 230
186 /** 231 /**
187 * @return {number} 232 * @return {number}
188 */ 233 */
189 _playbackRate: function() 234 _playbackRate: function()
190 { 235 {
191 return this._paused ? 0 : this._underlyingPlaybackRate; 236 return this._paused ? 0 : this._underlyingPlaybackRate;
192 }, 237 },
193 238
194 _togglePause: function() 239 /**
240 * @param {boolean} pause
241 */
242 _togglePause: function(pause)
195 { 243 {
196 this._paused = !this._paused; 244 this._paused = pause;
197 this._setPlaybackRate(this._playbackRate()); 245 for (var target of WebInspector.targetManager.targets(WebInspector.Targe t.Type.Page))
246 WebInspector.AnimationModel.fromTarget(target).setPlaybackRate(this. _playbackRate());
198 WebInspector.userMetrics.AnimationsPlaybackRateChanged.record(); 247 WebInspector.userMetrics.AnimationsPlaybackRateChanged.record();
199 this._pauseButton.element.classList.toggle("pause-toolbar-item");
200 this._pauseButton.element.classList.toggle("play-toolbar-item");
201 if (this._scrubberPlayer) 248 if (this._scrubberPlayer)
202 this._scrubberPlayer.playbackRate = this._playbackRate(); 249 this._scrubberPlayer.playbackRate = this._playbackRate();
203 }, 250 },
204 251
205 _replay: function() 252 _replay: function()
206 { 253 {
207 if (this.startTime() === undefined) 254 if (this.startTime() === undefined)
208 return; 255 return;
209 for (var target of WebInspector.targetManager.targets(WebInspector.Targe t.Type.Page)) 256 for (var target of WebInspector.targetManager.targets(WebInspector.Targe t.Type.Page))
210 target.animationAgent().setCurrentTime(/** @type {number} */(this.st artTime())); 257 target.animationAgent().setCurrentTime(/** @type {number} */(this.st artTime()));
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 * @param {!WebInspector.Event} event 308 * @param {!WebInspector.Event} event
262 */ 309 */
263 _mainFrameNavigated: function(event) 310 _mainFrameNavigated: function(event)
264 { 311 {
265 this._reset(); 312 this._reset();
266 this._updateAnimationsPlaybackRate(); 313 this._updateAnimationsPlaybackRate();
267 if (this._scrubberPlayer) 314 if (this._scrubberPlayer)
268 this._scrubberPlayer.cancel(); 315 this._scrubberPlayer.cancel();
269 delete this._scrubberPlayer; 316 delete this._scrubberPlayer;
270 this._timelineScrubberHead.textContent = WebInspector.UIString(Number.mi llisToString(0)); 317 this._timelineScrubberHead.textContent = WebInspector.UIString(Number.mi llisToString(0));
318 this._updateControlButton();
271 }, 319 },
272 320
273 /** 321 /**
274 * @param {!WebInspector.Event} event 322 * @param {!WebInspector.Event} event
275 */ 323 */
276 _animationCreated: function(event) 324 _animationCreated: function(event)
277 { 325 {
278 this._addAnimation(/** @type {!WebInspector.AnimationModel.Animation} */ (event.data.player), event.data.resetTimeline) 326 this._addAnimation(/** @type {!WebInspector.AnimationModel.Animation} */ (event.data.player), event.data.resetTimeline)
279 }, 327 },
280 328
281 /** 329 /**
282 * @param {!WebInspector.AnimationModel.Animation} animation 330 * @param {!WebInspector.AnimationModel.Animation} animation
283 * @param {boolean} resetTimeline 331 * @param {boolean} resetTimeline
284 */ 332 */
285 _addAnimation: function(animation, resetTimeline) 333 _addAnimation: function(animation, resetTimeline)
286 { 334 {
287 /** 335 /**
288 * @param {?WebInspector.DOMNode} node 336 * @param {?WebInspector.DOMNode} node
289 * @this {WebInspector.AnimationTimeline} 337 * @this {WebInspector.AnimationTimeline}
290 */ 338 */
291 function nodeResolved(node) 339 function nodeResolved(node)
292 { 340 {
341 if (!node)
342 return;
293 uiAnimation.setNode(node); 343 uiAnimation.setNode(node);
294 node[this._symbol] = nodeUI; 344 node[this._symbol] = nodeUI;
295 } 345 }
296 346
347 if (this._emptyTimelineMessage) {
348 this._emptyTimelineMessage.remove();
349 delete this._emptyTimelineMessage;
350 }
351
297 if (resetTimeline) 352 if (resetTimeline)
298 this._reset(); 353 this._reset();
299 354
300 // Ignore Web Animations custom effects & groups 355 // Ignore Web Animations custom effects & groups
301 if (animation.type() === "WebAnimation" && animation.source().keyframesR ule().keyframes().length === 0) 356 if (animation.type() === "WebAnimation" && animation.source().keyframesR ule().keyframes().length === 0)
302 return; 357 return;
303 358
304 if (this._resizeWindow(animation)) 359 if (this._resizeWindow(animation))
305 this.scheduleRedraw(); 360 this.scheduleRedraw();
306 361
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 var lastDraw = undefined; 412 var lastDraw = undefined;
358 for (var time = 0; time < this.duration(); time += gridSize) { 413 for (var time = 0; time < this.duration(); time += gridSize) {
359 var line = this._grid.createSVGChild("rect", "animation-timeline-gri d-line"); 414 var line = this._grid.createSVGChild("rect", "animation-timeline-gri d-line");
360 line.setAttribute("x", time * this.pixelMsRatio()); 415 line.setAttribute("x", time * this.pixelMsRatio());
361 line.setAttribute("y", 0); 416 line.setAttribute("y", 0);
362 line.setAttribute("height", "100%"); 417 line.setAttribute("height", "100%");
363 line.setAttribute("width", 1); 418 line.setAttribute("width", 1);
364 } 419 }
365 for (var time = 0; time < this.duration(); time += gridSize) { 420 for (var time = 0; time < this.duration(); time += gridSize) {
366 var gridWidth = time * this.pixelMsRatio(); 421 var gridWidth = time * this.pixelMsRatio();
367 if (time && (!lastDraw || gridWidth - lastDraw > 50)) { 422 if (!lastDraw || gridWidth - lastDraw > 50) {
368 lastDraw = gridWidth; 423 lastDraw = gridWidth;
369 var label = this._grid.createSVGChild("text", "animation-timelin e-grid-label"); 424 var label = this._grid.createSVGChild("text", "animation-timelin e-grid-label");
370 label.setAttribute("x", gridWidth + 5); 425 label.setAttribute("x", gridWidth + 5);
371 label.setAttribute("y", 35); 426 label.setAttribute("y", 35);
372 label.textContent = WebInspector.UIString(Number.millisToString( time)); 427 label.textContent = WebInspector.UIString(Number.millisToString( time));
373 } 428 }
374 } 429 }
375 }, 430 },
376 431
377 scheduleRedraw: function() { 432 scheduleRedraw: function() {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 */ 490 */
436 _animateTime: function(time) 491 _animateTime: function(time)
437 { 492 {
438 var oldPlayer = this._scrubberPlayer; 493 var oldPlayer = this._scrubberPlayer;
439 494
440 this._scrubberPlayer = this._timelineScrubber.animate([ 495 this._scrubberPlayer = this._timelineScrubber.animate([
441 { transform: "translateX(0px)" }, 496 { transform: "translateX(0px)" },
442 { transform: "translateX(" + (this.width() - this._scrubberRadius) + "px)" } 497 { transform: "translateX(" + (this.width() - this._scrubberRadius) + "px)" }
443 ], { duration: this.duration() - this._scrubberRadius / this.pixelMsRati o(), fill: "forwards" }); 498 ], { duration: this.duration() - this._scrubberRadius / this.pixelMsRati o(), fill: "forwards" });
444 this._scrubberPlayer.playbackRate = this._playbackRate(); 499 this._scrubberPlayer.playbackRate = this._playbackRate();
500 this._scrubberPlayer.onfinish = this._updateControlButton.bind(this);
501 this._updateControlButton();
445 502
446 if (time !== undefined) 503 if (time !== undefined)
447 this._scrubberPlayer.currentTime = time; 504 this._scrubberPlayer.currentTime = time;
448 else if (oldPlayer.playState === "finished") 505 else if (oldPlayer.playState === "finished")
449 this._scrubberPlayer.finish(); 506 this._scrubberPlayer.finish();
450 else 507 else
451 this._scrubberPlayer.startTime = oldPlayer.startTime; 508 this._scrubberPlayer.startTime = oldPlayer.startTime;
452 509
453 if (oldPlayer) 510 if (oldPlayer)
454 oldPlayer.cancel(); 511 oldPlayer.cancel();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
487 _scrubberDragStart: function(event) 544 _scrubberDragStart: function(event)
488 { 545 {
489 if (!this._scrubberPlayer) 546 if (!this._scrubberPlayer)
490 return false; 547 return false;
491 548
492 this._originalScrubberTime = this._scrubberPlayer.currentTime; 549 this._originalScrubberTime = this._scrubberPlayer.currentTime;
493 this._timelineScrubber.classList.remove("animation-timeline-end"); 550 this._timelineScrubber.classList.remove("animation-timeline-end");
494 this._scrubberPlayer.pause(); 551 this._scrubberPlayer.pause();
495 this._originalMousePosition = new WebInspector.Geometry.Point(event.x, e vent.y); 552 this._originalMousePosition = new WebInspector.Geometry.Point(event.x, e vent.y);
496 553
497 this._setPlaybackRate(0); 554 this._togglePause(true);
555 this._updateControlButton();
498 return true; 556 return true;
499 }, 557 },
500 558
501 /** 559 /**
502 * @param {!Event} event 560 * @param {!Event} event
503 */ 561 */
504 _scrubberDragMove: function(event) 562 _scrubberDragMove: function(event)
505 { 563 {
506 var delta = event.x - this._originalMousePosition.x; 564 var delta = event.x - this._originalMousePosition.x;
507 this._scrubberPlayer.currentTime = Math.min(this._originalScrubberTime + delta / this.pixelMsRatio(), this.duration() - this._scrubberRadius / this.pixe lMsRatio()); 565 this._scrubberPlayer.currentTime = Math.min(this._originalScrubberTime + delta / this.pixelMsRatio(), this.duration() - this._scrubberRadius / this.pixe lMsRatio());
508 var currentTime = Math.max(0, Math.round(this._scrubberPlayer.currentTim e)); 566 var currentTime = Math.max(0, Math.round(this._scrubberPlayer.currentTim e));
509 this._timelineScrubberHead.textContent = WebInspector.UIString(Number.mi llisToString(currentTime)); 567 this._timelineScrubberHead.textContent = WebInspector.UIString(Number.mi llisToString(currentTime));
510 for (var target of WebInspector.targetManager.targets(WebInspector.Targe t.Type.Page)) 568 for (var target of WebInspector.targetManager.targets(WebInspector.Targe t.Type.Page))
511 target.animationAgent().setCurrentTime(/** @type {number} */(this.st artTime() + currentTime)); 569 target.animationAgent().setCurrentTime(/** @type {number} */(this.st artTime() + currentTime));
512 }, 570 },
513 571
514 /** 572 /**
515 * @param {!Event} event 573 * @param {!Event} event
516 */ 574 */
517 _scrubberDragEnd: function(event) 575 _scrubberDragEnd: function(event)
518 { 576 {
519 if (this._scrubberPlayer.currentTime < this.duration() - this._scrubberR adius / this.pixelMsRatio()) 577 var currentTime = Math.max(0, this._scrubberPlayer.currentTime);
520 this._scrubberPlayer.play(); 578 this._scrubberPlayer.play();
579 this._scrubberPlayer.currentTime = currentTime;
521 this._timelineScrubberHead.window().requestAnimationFrame(this._updateSc rubber.bind(this)); 580 this._timelineScrubberHead.window().requestAnimationFrame(this._updateSc rubber.bind(this));
522 this._setPlaybackRate(this._playbackRate());
523 },
524
525 /**
526 * @param {number} playbackRate
527 */
528 _setPlaybackRate: function(playbackRate)
529 {
530 var target = WebInspector.targetManager.mainTarget();
531 if (target)
532 WebInspector.AnimationModel.fromTarget(target).setPlaybackRate(playb ackRate);
533 }, 581 },
534 582
535 __proto__: WebInspector.VBox.prototype 583 __proto__: WebInspector.VBox.prototype
536 } 584 }
537 585
538 /** 586 /**
539 * @constructor 587 * @constructor
540 * @param {!WebInspector.AnimationModel.AnimationEffect} animationEffect 588 * @param {!WebInspector.AnimationModel.AnimationEffect} animationEffect
541 */ 589 */
542 WebInspector.AnimationTimeline.NodeUI = function(animationEffect) { 590 WebInspector.AnimationTimeline.NodeUI = function(animationEffect) {
543 /** 591 /**
544 * @param {?WebInspector.DOMNode} node 592 * @param {?WebInspector.DOMNode} node
545 * @this {WebInspector.AnimationTimeline.NodeUI} 593 * @this {WebInspector.AnimationTimeline.NodeUI}
546 */ 594 */
547 function nodeResolved(node) 595 function nodeResolved(node)
548 { 596 {
597 if (!node)
598 return;
549 this._node = node; 599 this._node = node;
550 this._description.appendChild(WebInspector.DOMPresentationUtils.linkifyN odeReference(node)); 600 WebInspector.DOMPresentationUtils.decorateNodeLabel(node, this._descript ion);
551 this.element.addEventListener("click", WebInspector.Revealer.reveal.bind (WebInspector.Revealer, node, undefined), false); 601 this.element.addEventListener("click", WebInspector.Revealer.reveal.bind (WebInspector.Revealer, node, undefined), false);
552 } 602 }
553 603
554 this._rows = []; 604 this._rows = [];
555 this.element = createElementWithClass("div", "animation-node-row"); 605 this.element = createElementWithClass("div", "animation-node-row");
556 this._description = this.element.createChild("div", "animation-node-descript ion"); 606 this._description = this.element.createChild("div", "animation-node-descript ion");
557 animationEffect.deferredNode().resolve(nodeResolved.bind(this)); 607 animationEffect.deferredNode().resolve(nodeResolved.bind(this));
558 this._timelineElement = this.element.createChild("div", "animation-node-time line"); 608 this._timelineElement = this.element.createChild("div", "animation-node-time line");
559 } 609 }
560 610
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
975 1025
976 // Commit changes 1026 // Commit changes
977 if (this._mouseEventType === WebInspector.AnimationUI.MouseEvents.Keyfra meMove) { 1027 if (this._mouseEventType === WebInspector.AnimationUI.MouseEvents.Keyfra meMove) {
978 this._keyframes[this._keyframeMoved].setOffset(this._offset(this._ke yframeMoved)); 1028 this._keyframes[this._keyframeMoved].setOffset(this._offset(this._ke yframeMoved));
979 } else { 1029 } else {
980 var delay = this._delay(); 1030 var delay = this._delay();
981 var duration = this._duration(); 1031 var duration = this._duration();
982 this._setDelay(delay); 1032 this._setDelay(delay);
983 this._setDuration(duration); 1033 this._setDuration(duration);
984 if (this._animation.type() !== "CSSAnimation") { 1034 if (this._animation.type() !== "CSSAnimation") {
985 var target = WebInspector.targetManager.mainTarget(); 1035 for (var target of WebInspector.targetManager.targets(WebInspect or.Target.Type.Page))
986 if (target)
987 target.animationAgent().setTiming(this._animation.id(), dura tion, delay); 1036 target.animationAgent().setTiming(this._animation.id(), dura tion, delay);
988 } 1037 }
989 } 1038 }
990 1039
991 this._movementInMs = 0; 1040 this._movementInMs = 0;
992 this.redraw(); 1041 this.redraw();
993 1042
994 this._parentElement.ownerDocument.removeEventListener("mousemove", this. _mouseMoveHandler); 1043 this._parentElement.ownerDocument.removeEventListener("mousemove", this. _mouseMoveHandler);
995 this._parentElement.ownerDocument.removeEventListener("mouseup", this._m ouseUpHandler); 1044 this._parentElement.ownerDocument.removeEventListener("mouseup", this._m ouseUpHandler);
996 delete this._mouseMoveHandler; 1045 delete this._mouseMoveHandler;
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1084 EndpointsClickRegionSize: 10, 1133 EndpointsClickRegionSize: 10,
1085 GridCanvasHeight: 40 1134 GridCanvasHeight: 40
1086 } 1135 }
1087 1136
1088 WebInspector.AnimationUI.Colors = { 1137 WebInspector.AnimationUI.Colors = {
1089 "Purple": WebInspector.Color.parse("#9C27B0"), 1138 "Purple": WebInspector.Color.parse("#9C27B0"),
1090 "Light Blue": WebInspector.Color.parse("#03A9F4"), 1139 "Light Blue": WebInspector.Color.parse("#03A9F4"),
1091 "Deep Orange": WebInspector.Color.parse("#FF5722"), 1140 "Deep Orange": WebInspector.Color.parse("#FF5722"),
1092 "Blue": WebInspector.Color.parse("#5677FC"), 1141 "Blue": WebInspector.Color.parse("#5677FC"),
1093 "Lime": WebInspector.Color.parse("#CDDC39"), 1142 "Lime": WebInspector.Color.parse("#CDDC39"),
1094 "Blue Grey": WebInspector.Color.parse("#607D8B"),
1095 "Pink": WebInspector.Color.parse("#E91E63"), 1143 "Pink": WebInspector.Color.parse("#E91E63"),
1096 "Green": WebInspector.Color.parse("#0F9D58"), 1144 "Green": WebInspector.Color.parse("#0F9D58"),
1097 "Brown": WebInspector.Color.parse("#795548"), 1145 "Brown": WebInspector.Color.parse("#795548"),
1098 "Cyan": WebInspector.Color.parse("#00BCD4") 1146 "Cyan": WebInspector.Color.parse("#00BCD4")
1099 } 1147 }
OLDNEW
« no previous file with comments | « no previous file | Source/devtools/front_end/animation/animationTimeline.css » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698