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

Side by Side Diff: chrome/common/extensions/docs/examples/apps/cycler/playback_tab.js

Issue 10832191: Major revision of page cycler UI. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Newer version with requested decomposition into separate sources Created 8 years, 4 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
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 var PlaybackTab = function (cyclerUI, cyclerData) {
Jeffrey Yasskin 2012/08/15 01:03:59 Each class could use a comment saying what its pur
clintstaley 2012/08/15 23:54:20 Done.
6 /**
7 * Enum for different capture tab states, showing variously a page for
Jeffrey Yasskin 2012/08/15 01:03:59 I think I'd move the descriptions of each state in
Jeffrey Yasskin 2012/08/15 01:03:59 s/capture/playback/?
clintstaley 2012/08/15 23:54:20 Done.
clintstaley 2012/08/15 23:54:20 Done.
8 * choosing a playback, one for showing an already-chosen playback, and
9 * one for indicating that no playback choices yet exist.
10 * @enum {number}
11 * @private
12 */
13 var EnableState_ = {
14 choosePlayback: 1, showPlayback: 2, showNoCaptures: 3};
15
16 this.cyclerUI_ = cyclerUI;
17 this.cyclerData_ = cyclerData;
18
19 /**
20 * Create members for all UI elements with which we'll interact.
21 */
22 this.playbackTab_ = $('#playback-tab');
23 this.noCaptures_ = $('#no-captures');
24 this.yesCaptures_ = $('#yes-captures');
25
26 this.playbackName_ = $('#playback-name');
27 this.playbackDetails_ = $('#playback-details');
28 this.playbackURLs_ = $('#playback-urls');
29 this.playbackRepeats_ = $('#playback-repeats');
30 this.playbackExtension_ = $('#playback-extension');
31 this.doPlaybackButton_ = $('#do-playback');
32 this.doDeleteButton_ = $('#do-delete');
33
34 /*
35 * Enable the playback tab, showing no current playback choice, by
36 * hiding the playbackDetails_ div.
37 * @private
38 */
39 this.enableChoosePlayback_ = function() {
40 this.playbackTab_.hidden = false;
41 if (this.enableState != EnableState_.choosePlayback) {
42 this.enableState = EnableState_.choosePlayback;
43 this.noCaptures_.hidden = true;
44 this.yesCaptures_.hidden = false;
45 this.playbackDetails_.hidden = true;
46 }
47 };
48
49 /*
50 * Enable the playback tab, showing a current playback choice by showing
51 * the playbackDetails_ div.
52 * @private
53 */
54 this.enableShowPlayback_ = function() {
55 this.playbackTab_.hidden = false;
56 if (this.enableState != EnableState_.showPlayback) {
57 this.enableState = EnableState_.showPlayback;
58 this.noCaptures_.hidden = true;
59 this.yesCaptures_.hidden = false;
60 this.playbackDetails_.hidden = false;
61 }
62 };
63
64 /*
65 * Enable the playback tab and adjust tab labels appropriately. Show
66 * no available captures by hiding the yesCaptures_ div and showing the
67 * noCaptures_ div instead.
68 * @private
69 */
70 this.enableShowNoCaptures_ = function() {
71 this.playbackTab_.hidden = false;
72 if (this.enableState != EnableState_.showNoCaptures) {
73 this.enableState = EnableState_.showNoCaptures;
74 this.noCaptures_.hidden = false;
75 this.yesCaptures_.hidden = true;
Jeffrey Yasskin 2012/08/15 01:03:59 Did you forget to hide playbackDetails_ here? You
clintstaley 2012/08/15 23:54:20 Sort of. I forgot to nest playbackDetails under y
Jeffrey Yasskin 2012/08/16 20:19:31 Ok.
76 }
77 };
78
79 /**
80 * Enable the playback tab, showing either its "no captures", "choose
81 * a capture" or "display chosen capture" form, depending on the state
82 * of existing captures and |currentCaptureName_|.
83 */
84 this.enable = function() {
85 if (this.cyclerData_.getCaptures().length == 0) {
86 this.enableShowNoCaptures_();
87 } else if (this.cyclerUI_.currentCaptureName == null) {
88 this.enableChoosePlayback_();
89 } else {
90 this.enableShowPlayback_();
91 }
92 }
93
94 /**
95 * Disable the playback tab altogether, presumably in favor of some
96 * other tab.
97 */
98 this.disable = function() {
99 this.playbackTab_.hidden = true;
100 }
101
102 /**
103 * Utility function to refresh the selection list of captures that may
104 * be chosen for playback. Show all current captures, and also a
105 * "Choose a capture" default text if no capture is currently selected.
106 * @private
107 */
108 this.updatePlaybackChoices_ = function() {
109 var captureNames = this.cyclerData_.getCaptures();
110 var options = this.playbackName_.options;
111 var nextIndex = 0;
112
113 options.length = 0;
114
115 if (this.cyclerUI_.currentCaptureName == null) {
116 options.add(new Option('Choose a capture', null));
117 options.selectedIndex = nextIndex++;
118 }
119 for (var i = 0; i < captureNames.length; i++) {
120 options.add(new Option(captureNames[i], captureNames[i]));
121 if (captureNames[i] == this.cyclerUI_.currentCaptureName) {
122 options.selectedIndex = nextIndex;
123 }
124 nextIndex++;
125 }
126 }
127
128 /**
129 * Event callback for selection of a capture to play back. Save the
130 * choice in |currentCaptureName_|. Update the selection list because the
131 * default reminder message is no longer needed when a capture is chosen.
132 * Change playback tab to show-chosen-capture mode.
133 */
134 this.selectPlaybackName = function() {
135 this.cyclerUI_.currentCaptureName = this.playbackName_.value;
136 this.updatePlaybackChoices_();
137 this.enableShowPlayback_();
Jeffrey Yasskin 2012/08/15 01:03:59 What happens if they select the 'Choose a capture'
clintstaley 2012/08/15 23:54:20 Nothing. It's disabled in the HTML.
Jeffrey Yasskin 2012/08/16 20:19:31 Hm ... In updatePlaybackChoices_(), I see you clea
clintstaley 2012/08/17 04:12:25 Hmm. Right you are. It wasn't making any choices
138 }
139
140 /**
141 * Event callback for pressing the playback button, which button is only
142 * enabled if a capture has been chosen for playback. Check for errors
143 * on playback page, and either display a message with such errors, or
144 * call the extenion api to initiate a playback.
145 * @private
146 */
147 this.doPlayback_ = function() {
148 var extensionPath = this.playbackExtension_.value;
149 var repeatCount = parseInt(this.playbackRepeats_.value);
150 var errors = [];
151
152 // Check local errors
153 if (isNaN(repeatCount)) {
154 errors.push('Enter a number for repeat count');
155 } else if (repeatCount < 1 || repeatCount > 100) {
156 errors.push('Repeat count must be between 1 and 100');
157 }
158
159 if (errors.length > 0) {
160 this.cyclerUI_.showMessage(errors.join('\n'), 'Ok');
161 } else {
162 this.doPlaybackButton_.disabled = true;
163 chrome.experimental.record.replayURLs(
164 this.cyclerUI_.currentCaptureName,
165 repeatCount,
166 {'extensionPath': extensionPath},
167 this.onPlaybackDone.bind(this));
168 }
169 }
170
171 /**
172 * Extension API calls this back when a playback is done.
173 * @param {!number} runtime Number of ms it took to run the playback.
174 * @param {!string} stats Statistics from the playback.
175 * @param {!Array.<!string>} errors List of error messages, if any,
176 * resuting from the playback.
177 */
178 this.onPlaybackDone = function(runTime, stats, errors) {
179 this.doPlaybackButton_.disabled = false;
180
181 if (errors.length > 0) {
182 this.cyclerUI_.showMessage(errors.join('\n'), 'Ok');
183 } else {
184 this.cyclerUI_.showMessage('Test took ' + runTime + 'mS :\n' +
185 stats, 'Ok');
186 }
187 }
188
189 /**
190 * Delete the capture with name |currentCaptureName_|. For this method
191 * to be callable, there must be a selected currentCaptureName_. Change
192 * the displayed HTML to show no captures if none exist now, or to show
193 * none selected (since we just deleted the selected one).
194 * @private
195 */
196 this.doDelete_ = function() {
197 this.cyclerData_.deleteCapture(this.cyclerUI_.currentCaptureName);
198 this.cyclerUI_.currentCaptureName = null;
199 this.updatePlaybackChoices_();
200 if (this.cyclerData_.getCaptures().length == 0) {
201 this.enableShowNoCaptures_();
202 } else {
203 this.enableChoosePlayback_();
204 }
205 }
206
207 // Set up listeners on buttons.
208 this.doPlaybackButton_.addEventListener('click', this.doPlayback_.bind(this));
209 this.doDeleteButton_.addEventListener('click', this.doDelete_.bind(this));
210
211 // Set up initial selection list for existing captures, and selection
212 // event listener.
213 this.updatePlaybackChoices_();
214 this.playbackName_.addEventListener('change',
215 this.selectPlaybackName.bind(this));
216 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698