OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 cr.define('extensions', function() { | 5 cr.define('extensions', function() { |
6 'use strict'; | 6 'use strict'; |
7 | 7 |
8 /** | 8 /** |
9 * The ExtensionOptionsOverlay will show an extension's options page using | 9 * The ExtensionOptionsOverlay will show an extension's options page using |
10 * an <extensionoptions> element. | 10 * an <extensionoptions> element. |
(...skipping 22 matching lines...) Expand all Loading... |
33 initializePage: function(showOverlay) { | 33 initializePage: function(showOverlay) { |
34 var overlay = $('overlay'); | 34 var overlay = $('overlay'); |
35 | 35 |
36 cr.ui.overlay.setupOverlay(overlay); | 36 cr.ui.overlay.setupOverlay(overlay); |
37 cr.ui.overlay.globalInitialization(); | 37 cr.ui.overlay.globalInitialization(); |
38 overlay.addEventListener('cancelOverlay', this.handleDismiss_.bind(this)); | 38 overlay.addEventListener('cancelOverlay', this.handleDismiss_.bind(this)); |
39 | 39 |
40 this.showOverlay_ = showOverlay; | 40 this.showOverlay_ = showOverlay; |
41 }, | 41 }, |
42 | 42 |
| 43 setInitialFocus: function() { |
| 44 this.getExtensionOptions_().focus(); |
| 45 }, |
| 46 |
| 47 /** @return {?Element} */ |
| 48 getExtensionOptions_: function() { |
| 49 return $('extension-options-overlay-guest').querySelector( |
| 50 'extensionoptions'); |
| 51 }, |
| 52 |
43 /** | 53 /** |
44 * Handles a click on the close button. | 54 * Handles a click on the close button. |
45 * @param {Event} event The click event. | 55 * @param {Event} event The click event. |
46 * @private | 56 * @private |
47 */ | 57 */ |
48 handleDismiss_: function(event) { | 58 handleDismiss_: function(event) { |
49 this.setVisible_(false); | 59 this.setVisible_(false); |
50 var extensionoptions = | 60 var extensionoptions = this.getExtensionOptions_(); |
51 $('extension-options-overlay-guest') | |
52 .querySelector('extensionoptions'); | |
53 | |
54 if (extensionoptions) | 61 if (extensionoptions) |
55 $('extension-options-overlay-guest').removeChild(extensionoptions); | 62 $('extension-options-overlay-guest').removeChild(extensionoptions); |
56 | 63 |
57 $('extension-options-overlay-icon').removeAttribute('src'); | 64 $('extension-options-overlay-icon').removeAttribute('src'); |
58 | 65 |
59 // Remove the options query string. | 66 // Remove the options query string. |
60 uber.replaceState({}, ''); | 67 uber.replaceState({}, ''); |
61 }, | 68 }, |
62 | 69 |
63 /** | 70 /** |
64 * Associate an extension with the overlay and display it. | 71 * Associate an extension with the overlay and display it. |
65 * @param {string} extensionId The id of the extension whose options page | 72 * @param {string} extensionId The id of the extension whose options page |
66 * should be displayed in the overlay. | 73 * should be displayed in the overlay. |
67 * @param {string} extensionName The name of the extension, which is used | 74 * @param {string} extensionName The name of the extension, which is used |
68 * as the header of the overlay. | 75 * as the header of the overlay. |
69 * @param {string} extensionIcon The URL of the extension's icon. | 76 * @param {string} extensionIcon The URL of the extension's icon. |
| 77 * @param {function():void} shownCallback A function called when show |
| 78 * animation completes. |
70 * @suppress {checkTypes} | 79 * @suppress {checkTypes} |
71 * TODO(vitalyp): remove the suppression after adding | 80 * TODO(vitalyp): remove the suppression after adding |
72 * chrome/renderer/resources/extensions/extension_options.js | 81 * chrome/renderer/resources/extensions/extension_options.js |
73 * to dependencies. | 82 * to dependencies. |
74 */ | 83 */ |
75 setExtensionAndShowOverlay: function(extensionId, | 84 setExtensionAndShowOverlay: function(extensionId, |
76 extensionName, | 85 extensionName, |
77 extensionIcon) { | 86 extensionIcon, |
| 87 shownCallback) { |
78 var overlay = $('extension-options-overlay'); | 88 var overlay = $('extension-options-overlay'); |
79 var overlayHeader = $('extension-options-overlay-header'); | 89 var overlayHeader = $('extension-options-overlay-header'); |
80 var overlayGuest = $('extension-options-overlay-guest'); | 90 var overlayGuest = $('extension-options-overlay-guest'); |
81 var overlayStyle = window.getComputedStyle(overlay); | 91 var overlayStyle = window.getComputedStyle(overlay); |
82 | 92 |
83 $('extension-options-overlay-title').textContent = extensionName; | 93 $('extension-options-overlay-title').textContent = extensionName; |
84 $('extension-options-overlay-icon').src = extensionIcon; | 94 $('extension-options-overlay-icon').src = extensionIcon; |
85 | 95 |
86 this.setVisible_(true); | 96 this.setVisible_(true); |
87 | 97 |
(...skipping 30 matching lines...) Expand all Loading... |
118 var newHeight = Math.min(evt.height, maxHeight); | 128 var newHeight = Math.min(evt.height, maxHeight); |
119 | 129 |
120 // animationTime is the amount of time in ms that will be used to resize | 130 // animationTime is the amount of time in ms that will be used to resize |
121 // the overlay. It is calculated by multiplying the pythagorean distance | 131 // the overlay. It is calculated by multiplying the pythagorean distance |
122 // between old and the new size (in px) with a constant speed of | 132 // between old and the new size (in px) with a constant speed of |
123 // 0.25 ms/px. | 133 // 0.25 ms/px. |
124 var animationTime = 0.25 * Math.sqrt( | 134 var animationTime = 0.25 * Math.sqrt( |
125 Math.pow(newWidth - oldWidth, 2) + | 135 Math.pow(newWidth - oldWidth, 2) + |
126 Math.pow(newHeight - oldHeight, 2)); | 136 Math.pow(newHeight - oldHeight, 2)); |
127 | 137 |
128 if (animation) { | 138 if (animation) |
129 animation.cancel(); | 139 animation.cancel(); |
130 } | 140 |
131 animation = overlay.animate([ | 141 animation = overlay.animate([ |
132 {width: oldWidth + 'px', height: oldHeight + 'px'}, | 142 {width: oldWidth + 'px', height: oldHeight + 'px'}, |
133 {width: newWidth + 'px', height: newHeight + 'px'} | 143 {width: newWidth + 'px', height: newHeight + 'px'} |
134 ], { | 144 ], { |
135 duration: animationTime, | 145 duration: animationTime, |
136 delay: 0 | 146 delay: 0 |
137 }); | 147 }); |
138 | 148 |
139 animation.onfinish = function(e) { | 149 animation.onfinish = function(e) { |
140 animation = null; | 150 animation = null; |
| 151 |
141 // The <extensionoptions> element is ready to place back in the | 152 // The <extensionoptions> element is ready to place back in the |
142 // overlay. Make sure that it's sized to take up the full | 153 // overlay. Make sure that it's sized to take up the full width/height |
143 // width/height of the overlay. | 154 // of the overlay. |
144 overlayGuest.style.position = ''; | 155 overlayGuest.style.position = ''; |
145 overlayGuest.style.left = ''; | 156 overlayGuest.style.left = ''; |
146 overlayGuest.style.width = newWidth + 'px'; | 157 overlayGuest.style.width = newWidth + 'px'; |
147 overlayGuest.style.height = newHeight + 'px'; | 158 overlayGuest.style.height = newHeight + 'px'; |
| 159 |
| 160 if (shownCallback) { |
| 161 shownCallback(); |
| 162 shownCallback = null; |
| 163 } |
148 }; | 164 }; |
149 }.bind(this); | 165 }.bind(this); |
150 | 166 |
151 // Move the <extensionoptions> off screen until the overlay is ready. | 167 // Move the <extensionoptions> off screen until the overlay is ready. |
152 overlayGuest.style.position = 'fixed'; | 168 overlayGuest.style.position = 'fixed'; |
153 overlayGuest.style.left = window.outerWidth + 'px'; | 169 overlayGuest.style.left = window.outerWidth + 'px'; |
154 // Begin rendering at the default dimensions. This is also necessary to | 170 // Begin rendering at the default dimensions. This is also necessary to |
155 // cancel any width/height set on a previous render. | 171 // cancel any width/height set on a previous render. |
156 // TODO(kalman): This causes a visual jag where the overlay guest shows | 172 // TODO(kalman): This causes a visual jag where the overlay guest shows |
157 // up briefly. It would be better to render this off-screen first, then | 173 // up briefly. It would be better to render this off-screen first, then |
(...skipping 15 matching lines...) Expand all Loading... |
173 /** @type {HTMLDivElement} */($('extension-options-overlay')) : | 189 /** @type {HTMLDivElement} */($('extension-options-overlay')) : |
174 null); | 190 null); |
175 } | 191 } |
176 }; | 192 }; |
177 | 193 |
178 // Export | 194 // Export |
179 return { | 195 return { |
180 ExtensionOptionsOverlay: ExtensionOptionsOverlay | 196 ExtensionOptionsOverlay: ExtensionOptionsOverlay |
181 }; | 197 }; |
182 }); | 198 }); |
OLD | NEW |