Chromium Code Reviews| Index: chrome/browser/resources/chromeos/login/oobe_screen_network.js |
| diff --git a/chrome/browser/resources/chromeos/login/oobe_screen_network.js b/chrome/browser/resources/chromeos/login/oobe_screen_network.js |
| index 179c1fbfd5b9b841f9ce996127201d886a148a3c..a153ddff14aa6cfb8e817541414aad997c4c5d6e 100644 |
| --- a/chrome/browser/resources/chromeos/login/oobe_screen_network.js |
| +++ b/chrome/browser/resources/chromeos/login/oobe_screen_network.js |
| @@ -3,6 +3,146 @@ |
| // found in the LICENSE file. |
| /** |
| + * Creates dropdown element. |
| + * @param {!Element} root Root element, where dropdown is inserted to. |
| + * @param {string} title Text on dropdown. |
| + * @param {Array} items Initial array of dropdown items. |
| + */ |
| +function DropDown(root, title, items) { |
|
xiyuan
2011/07/29 21:39:33
we probably want to put this into a cr.define name
xiyuan
2011/07/29 21:39:33
It would be better to merge DropDown a HTMLDivElem
Nikita (slow)
2011/08/05 23:40:26
Done.
Nikita (slow)
2011/08/05 23:40:26
Done.
|
| + this.root_ = root; |
| + this.container_ = document.createElement('div'); |
| + this.container_.classList.add('dropdown-container'); |
|
xiyuan
2011/07/29 21:39:33
this.container_ element seems not used.
Nikita (slow)
2011/08/05 23:40:26
Done.
|
| + this.isShown = false; |
| + |
| + this.setTitle(title); |
| + this.setItems(items); |
| +} |
| + |
| +DropDown.prototype = { |
| + /** |
| + * Sets title and icon. |
| + * @param {string} title Text on dropdown. |
| + * @param {string} icon Icon in dataURL format. |
| + */ |
| + setTitle: function(title, icon) { |
| + var titleHtml = title; |
| + var image = document.createElement('img'); |
| + if (icon) |
| + image.src = icon; |
| + this.root_.insertBefore( |
| + this.createDiv_('dropdown-title', image, titleHtml, -1, true), |
| + this.root_.childNodes[0]); |
| + if (this.root_.childNodes.length > 1) |
| + this.root_.removeChild(this.root_.childNodes[1]); |
|
xiyuan
2011/07/29 21:39:33
It seems a DropDown has two immediate child: title
Nikita (slow)
2011/08/05 23:40:26
Done.
|
| + }, |
| + |
| + /** |
| + * Sets dropdown items. |
| + * @param {Array} items Dropdown items array. |
| + */ |
| + setItems: function(items) { |
| + if (this.root_.childNodes.length > 1) { |
| + this.root_.removeChild(this.root_.childNodes[1]); |
|
xiyuan
2011/07/29 21:39:33
see above. Instead of creating the container every
Nikita (slow)
2011/08/05 23:40:26
Done.
|
| + } |
| + |
| + var container = document.createElement('div') |
| + container.classList.add('dropdown-container'); |
| + |
| + for (var i = 0; i < items.length; ++i) { |
| + var item = items[i]; |
| + if ('sub' in item) { |
| + // Workaround for submenus, add items on top level. |
| + // TODO(altimofeev): support submenus. |
| + // item = item.sub[0]; |
| + for (var j = 0; j < item.sub.length; ++j) |
| + this.createItem_(container, item.sub[j]); |
| + |
| + continue; |
| + } |
| + this.createItem_(container, item); |
| + } |
| + |
| + this.root_.appendChild(container); |
| + container.style.display = this.isShown ? 'block' : 'none'; |
|
xiyuan
2011/07/29 21:39:33
suggest to use container.hidden instead of display
Nikita (slow)
2011/08/05 23:40:26
Done.
|
| + }, |
| + |
| + /** |
| + * Creates dropdown element (div/button) for dropdown item / title. |
| + * @param {string} className Element class. |
| + * @param {HTMLElement} image Image element with icon. |
| + * @param {string} innerHtml Inner contents of the element. |
| + * @param {number} iid Internal ID of the element. |
| + * @param {bool} enabled Whether element is enabled. |
| + * @type {HTMLElement} |
| + * @private |
| + */ |
| + createDiv_: function(className, image, innerHtml, iid, enabled) { |
| + var el = document.createElement( |
| + className == 'dropdown-title' ? 'button' : 'div'); |
| + el.classList.add(className); |
| + el.innerHTML = innerHtml; |
|
xiyuan
2011/07/29 21:39:33
we probably should try to get rid of this use.
Nikita (slow)
2011/08/05 23:40:26
Done.
|
| + el.iid = iid; |
| + el.link = this; |
|
xiyuan
2011/07/29 21:39:33
nit: why DropDown is called "link"? Why not use pa
Nikita (slow)
2011/08/05 23:40:26
Done.
|
| + el.addEventListener('click', function f(e) { |
| + if (this.iid < -1 || this.classList.contains('disabled-item')) |
| + return; |
| + this.link.isShown = !this.link.isShown; |
|
xiyuan
2011/07/29 21:39:33
Do we really toggle isShown here?
Nikita (slow)
2011/08/05 23:40:26
Yes, menu is hidden on a click.
|
| + this.link.root_.childNodes[1].style.display = |
|
xiyuan
2011/07/29 21:39:33
use hidden attribute.
Nikita (slow)
2011/08/05 23:40:26
Done.
|
| + this.link.isShown ? 'block' : 'none'; |
| + if (this.iid >= 0) { |
| + chrome.send('networkItemChosen', [this.iid]); |
| + } |
| + }); |
| + |
| + if (!enabled) |
| + el.classList.add('disabled-item'); |
| + |
| + // TODO(nkostylev): Icon support for title. |
| + if (className != 'dropdown-title' && iid > 0) { |
| + var wrapperDiv = document.createElement('div'); |
| + wrapperDiv.classList.add('dropdown-item-container'); |
| + var imageDiv = document.createElement('div'); |
| + imageDiv.classList.add('dropdown-image'); |
| + imageDiv.appendChild(image); |
| + wrapperDiv.appendChild(imageDiv); |
| + wrapperDiv.appendChild(el); |
| + el = wrapperDiv; |
| + } |
| + return el; |
| + }, |
| + |
| + /** |
| + * Creates dropdown item element and adds into container. |
| + * @param {HTMLElement} container Container where item is added. |
| + * @param {!Object} item Item to be added. |
| + * @private |
| + */ |
| + createItem_ : function(container, item) { |
| + var text = item.label; |
| + if ('bold' in item && item.bold) { |
| + text = '<b>' + text + "</b>"; |
| + } |
| + var itemHtml = '<span>' + text + '</span>'; |
| + |
| + var className = 'dropdown-item'; |
| + // Separator. |
| + if (item.id == -2) { |
| + className = 'dropdown-divider'; |
| + itemHtml = "<hr>"; |
| + } |
| + |
| + var image = document.createElement('img'); |
| + if (item.icon) |
| + image.src = item.icon; |
| + var enabled = 'enabled' in item && item.enabled; |
| + container.appendChild( |
| + this.createDiv_(className, image, itemHtml, item.id, enabled)); |
| + }, |
| +}; |
| + |
| +var dropdown = undefined; |
|
xiyuan
2011/07/29 21:39:33
we should avoid using global vars. Let's put this
Nikita (slow)
2011/08/05 23:40:26
Done.
|
| + |
| +/** |
| * @fileoverview Oobe network screen implementation. |
| */ |
| @@ -21,6 +161,8 @@ cr.define('oobe', function() { |
| var screen = $('connect'); |
| NetworkScreen.decorate(screen); |
| Oobe.getInstance().registerScreen(screen); |
| + |
| + dropdown = new DropDown($('networks-list'), "empty", []); |
| }; |
| NetworkScreen.prototype = { |
| @@ -64,6 +206,14 @@ cr.define('oobe', function() { |
| } |
| }; |
| + NetworkScreen.updateNetworks = function(data) { |
| + dropdown.setItems(data[0].sub); |
| + }; |
| + |
| + NetworkScreen.updateNetworkTitle = function(title, icon) { |
| + dropdown.setTitle(title, icon); |
| + }; |
| + |
| return { |
| NetworkScreen: NetworkScreen |
| }; |