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

Side by Side Diff: chrome/browser/resources/file_manager/audio_player/js/audio_player.js

Issue 185653014: [AudioPlayer] Fix a bug on changing 'expanded' status (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Adressed the comment Created 6 years, 9 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 'use strict'; 5 'use strict';
6 6
7 /** 7 /**
8 * @param {HTMLElement} container Container element. 8 * @param {HTMLElement} container Container element.
9 * @constructor 9 * @constructor
10 */ 10 */
11 function AudioPlayer(container) { 11 function AudioPlayer(container) {
12 this.container_ = container; 12 this.container_ = container;
13 this.volumeManager_ = new VolumeManagerWrapper( 13 this.volumeManager_ = new VolumeManagerWrapper(
14 VolumeManagerWrapper.DriveEnabledStatus.DRIVE_ENABLED); 14 VolumeManagerWrapper.DriveEnabledStatus.DRIVE_ENABLED);
15 this.metadataCache_ = MetadataCache.createFull(this.volumeManager_); 15 this.metadataCache_ = MetadataCache.createFull(this.volumeManager_);
16 this.selectedEntry_ = null; 16 this.selectedEntry_ = null;
17 17
18 this.model_ = new AudioPlayerModel(); 18 this.model_ = new AudioPlayerModel();
19 var observer = new PathObserver(this.model_, 'expanded'); 19 var observer = new PathObserver(this.model_, 'expanded');
20 observer.open(function(newValue, oldValue) { 20 observer.open(function(newValue, oldValue) {
21 // Inverse arguments intentionally to match the Polymer way. 21 // Inverse arguments intentionally to match the Polymer way.
22 this.onModelExpandedChanged(oldValue, newValue); 22 this.onModelExpandedChanged(oldValue, newValue);
23 }.bind(this)); 23 }.bind(this));
24 this.trackListItems_ = [];
25 24
26 this.entries_ = []; 25 this.entries_ = [];
27 this.currentTrackIndex_ = -1; 26 this.currentTrackIndex_ = -1;
28 this.playlistGeneration_ = 0; 27 this.playlistGeneration_ = 0;
29 28
30 /** 29 /**
31 * Whether if the playlist is expanded or not. This value is changed by 30 * Whether if the playlist is expanded or not. This value is changed by
32 * this.syncExpanded(). 31 * this.syncExpanded().
33 * True: expanded, false: collapsed, null: unset. 32 * True: expanded, false: collapsed, null: unset.
34 * 33 *
35 * @type {?boolean} 34 * @type {?boolean}
36 * @private 35 * @private
37 */ 36 */
38 this.isExpanded_ = null; // Initial value is null. It'll be set in load(). 37 this.isExpanded_ = null; // Initial value is null. It'll be set in load().
39 38
40 this.player_ = document.querySelector('audio-player'); 39 this.player_ = document.querySelector('audio-player');
41 this.player_.tracks = this.trackListItems_; 40 // TODO(yoshiki): Move tracks into the model.
41 this.player_.tracks = [];
42 this.player_.model = this.model_; 42 this.player_.model = this.model_;
43 Platform.performMicrotaskCheckpoint(); 43 Platform.performMicrotaskCheckpoint();
44 44
45 this.errorString_ = ''; 45 this.errorString_ = '';
46 this.offlineString_ = ''; 46 this.offlineString_ = '';
47 chrome.fileBrowserPrivate.getStrings(function(strings) { 47 chrome.fileBrowserPrivate.getStrings(function(strings) {
48 container.ownerDocument.title = strings['AUDIO_PLAYER_TITLE']; 48 container.ownerDocument.title = strings['AUDIO_PLAYER_TITLE'];
49 this.errorString_ = strings['AUDIO_ERROR']; 49 this.errorString_ = strings['AUDIO_ERROR'];
50 this.offlineString_ = strings['AUDIO_OFFLINE']; 50 this.offlineString_ = strings['AUDIO_OFFLINE'];
51 AudioPlayer.TrackInfo.DEFAULT_ARTIST = 51 AudioPlayer.TrackInfo.DEFAULT_ARTIST =
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 */ 96 */
97 AudioPlayer.prototype.load = function(playlist) { 97 AudioPlayer.prototype.load = function(playlist) {
98 this.playlistGeneration_++; 98 this.playlistGeneration_++;
99 this.currentTrackIndex_ = -1; 99 this.currentTrackIndex_ = -1;
100 100
101 // Save the app state, in case of restart. Make a copy of the object, so the 101 // Save the app state, in case of restart. Make a copy of the object, so the
102 // playlist member is not changed after entries are resolved. 102 // playlist member is not changed after entries are resolved.
103 window.appState = JSON.parse(JSON.stringify(playlist)); // cloning 103 window.appState = JSON.parse(JSON.stringify(playlist)); // cloning
104 util.saveAppState(); 104 util.saveAppState();
105 105
106 this.isExpanded_ = this.model_.expanded;
107
106 // Resolving entries has to be done after the volume manager is initialized. 108 // Resolving entries has to be done after the volume manager is initialized.
107 this.volumeManager_.ensureInitialized(function() { 109 this.volumeManager_.ensureInitialized(function() {
108 util.URLsToEntries(playlist.items, function(entries) { 110 util.URLsToEntries(playlist.items, function(entries) {
109 this.entries_ = entries; 111 this.entries_ = entries;
110 112
111 var position = playlist.position || 0; 113 var position = playlist.position || 0;
112 var time = playlist.time || 0; 114 var time = playlist.time || 0;
113 115
114 if (this.entries_.length == 0) 116 if (this.entries_.length == 0)
115 return; 117 return;
116 118
117 this.trackListItems_.splice(0); 119 var newTracks = [];
118 120
119 for (var i = 0; i != this.entries_.length; i++) { 121 for (var i = 0; i != this.entries_.length; i++) {
120 var entry = this.entries_[i]; 122 var entry = this.entries_[i];
121 var onClick = this.select_.bind(this, i, false /* no restore */); 123 var onClick = this.select_.bind(this, i, false /* no restore */);
122 this.trackListItems_.push(new AudioPlayer.TrackInfo(entry, onClick)); 124 newTracks.push(new AudioPlayer.TrackInfo(entry, onClick));
123 } 125 }
124 126
127 this.player_.tracks = newTracks;
128
125 // Makes it sure that the handler of the track list is called, before the 129 // Makes it sure that the handler of the track list is called, before the
126 // handler of the track index. 130 // handler of the track index.
127 Platform.performMicrotaskCheckpoint(); 131 Platform.performMicrotaskCheckpoint();
128 132
129 this.select_(position, !!time); 133 this.select_(position, !!time);
130 134
131 // Load the selected track metadata first, then load the rest. 135 // Load the selected track metadata first, then load the rest.
132 this.loadMetadata_(position); 136 this.loadMetadata_(position);
133 for (i = 0; i != this.entries_.length; i++) { 137 for (i = 0; i != this.entries_.length; i++) {
134 if (i != position) 138 if (i != position)
(...skipping 14 matching lines...) Expand all
149 }; 153 };
150 154
151 /** 155 /**
152 * Displays track's metadata. 156 * Displays track's metadata.
153 * @param {number} track Track number. 157 * @param {number} track Track number.
154 * @param {Object} metadata Metadata object. 158 * @param {Object} metadata Metadata object.
155 * @param {string=} opt_error Error message. 159 * @param {string=} opt_error Error message.
156 * @private 160 * @private
157 */ 161 */
158 AudioPlayer.prototype.displayMetadata_ = function(track, metadata, opt_error) { 162 AudioPlayer.prototype.displayMetadata_ = function(track, metadata, opt_error) {
159 this.trackListItems_[track].setMetadata(metadata, opt_error); 163 this.player_.tracks[track].setMetadata(metadata, opt_error);
160 }; 164 };
161 165
162 /** 166 /**
163 * Closes audio player when a volume containing the selected item is unmounted. 167 * Closes audio player when a volume containing the selected item is unmounted.
164 * @param {Event} event The unmount event. 168 * @param {Event} event The unmount event.
165 * @private 169 * @private
166 */ 170 */
167 AudioPlayer.prototype.onExternallyUnmounted_ = function(event) { 171 AudioPlayer.prototype.onExternallyUnmounted_ = function(event) {
168 if (!this.selectedEntry_) 172 if (!this.selectedEntry_)
169 return; 173 return;
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 } 265 }
262 }; 266 };
263 267
264 /* Keep the below constants in sync with the CSS. */ 268 /* Keep the below constants in sync with the CSS. */
265 269
266 /** 270 /**
267 * Window header size in pixels. 271 * Window header size in pixels.
268 * @type {number} 272 * @type {number}
269 * @const 273 * @const
270 */ 274 */
271 AudioPlayer.HEADER_HEIGHT = 28; 275 AudioPlayer.HEADER_HEIGHT = 33; // 32px + border 1px
272 276
273 /** 277 /**
274 * Track height in pixels. 278 * Track height in pixels.
275 * @type {number} 279 * @type {number}
276 * @const 280 * @const
277 */ 281 */
278 AudioPlayer.TRACK_HEIGHT = 44; 282 AudioPlayer.TRACK_HEIGHT = 44;
279 283
280 /** 284 /**
281 * Controls bar height in pixels. 285 * Controls bar height in pixels.
282 * @type {number} 286 * @type {number}
283 * @const 287 * @const
284 */ 288 */
285 AudioPlayer.CONTROLS_HEIGHT = 72; 289 AudioPlayer.CONTROLS_HEIGHT = 73; // 72px + border 1px
286 290
287 /** 291 /**
288 * Default number of items in the expanded mode. 292 * Default number of items in the expanded mode.
289 * @type {number} 293 * @type {number}
290 * @const 294 * @const
291 */ 295 */
292 AudioPlayer.DEFAULT_EXPANDED_ITEMS = 5; 296 AudioPlayer.DEFAULT_EXPANDED_ITEMS = 5;
293 297
294 /** 298 /**
295 * Minimum size of the window in the expanded mode in pixels. 299 * Minimum size of the window in the expanded mode in pixels.
(...skipping 12 matching lines...) Expand all
308 if (this.isExpanded_ !== null && 312 if (this.isExpanded_ !== null &&
309 this.isExpanded_ === newValue) 313 this.isExpanded_ === newValue)
310 return; 314 return;
311 315
312 if (this.isExpanded_ && !newValue) 316 if (this.isExpanded_ && !newValue)
313 this.lastExpandedHeight_ = window.innerHeight; 317 this.lastExpandedHeight_ = window.innerHeight;
314 318
315 if (this.isExpanded_ !== newValue) { 319 if (this.isExpanded_ !== newValue) {
316 this.isExpanded_ = newValue; 320 this.isExpanded_ = newValue;
317 this.syncHeight_(); 321 this.syncHeight_();
322
323 // Saves new state.
324 window.appState.expanded = newValue;
325 util.saveAppState();
318 } 326 }
319 }; 327 };
320 328
321 /** 329 /**
322 * @private 330 * @private
323 */ 331 */
324 AudioPlayer.prototype.syncHeight_ = function() { 332 AudioPlayer.prototype.syncHeight_ = function() {
325 var targetHeight; 333 var targetHeight;
326 334
327 if (this.model_.expanded) { 335 if (this.model_.expanded) {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 this.title = (metadata.media && metadata.media.title) || 413 this.title = (metadata.media && metadata.media.title) ||
406 this.getDefaultTitle(); 414 this.getDefaultTitle();
407 this.artist = error || 415 this.artist = error ||
408 (metadata.media && metadata.media.artist) || this.getDefaultArtist(); 416 (metadata.media && metadata.media.artist) || this.getDefaultArtist();
409 }; 417 };
410 418
411 // Starts loading the audio player. 419 // Starts loading the audio player.
412 window.addEventListener('WebComponentsReady', function(e) { 420 window.addEventListener('WebComponentsReady', function(e) {
413 AudioPlayer.load(); 421 AudioPlayer.load();
414 }); 422 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698