Supervised user whitelists: Cleanup
[chromium-blink-merge.git] / ui / webui / resources / js / chromeos / ui_account_tweaks.js
blob6dab42b4e55e719ef8ebfe1928d5ee2b0beb0f6f
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.
5 /**
6  * @fileoverview This file contains methods that allow to tweak
7  * internal page UI based on the status of current user (owner/user/guest).
8  * It is assumed that required data is passed via i18n strings
9  * (using loadTimeData dictionary) that are filled with call to
10  * AddAccountUITweaksLocalizedValues in ui_account_tweaks.cc.
11  * It is also assumed that tweaked page has chrome://resources/css/widgets.css
12  * included.
13  */
15 cr.define('uiAccountTweaks', function() {
17   /////////////////////////////////////////////////////////////////////////////
18   // UIAccountTweaks class:
20   // String specificators for different types of sessions.
21   /** @const */ var SESSION_TYPE_GUEST = 'guest';
22   /** @const */ var SESSION_TYPE_PUBLIC = 'public-account';
24   /**
25    * Encapsulated handling of ChromeOS accounts options page.
26    * @constructor
27    */
28   function UIAccountTweaks() {
29   }
31   /**
32    * @return {boolean} Whether the current user is owner or not.
33    */
34   UIAccountTweaks.currentUserIsOwner = function() {
35     return loadTimeData.getBoolean('currentUserIsOwner');
36   };
38   /**
39    * @return {boolean} Whether we're currently in guest session.
40    */
41   UIAccountTweaks.loggedInAsGuest = function() {
42     return loadTimeData.getBoolean('loggedInAsGuest');
43   };
45   /**
46    * @return {boolean} Whether we're currently in public session.
47    */
48   UIAccountTweaks.loggedInAsPublicAccount = function() {
49     return loadTimeData.getBoolean('loggedInAsPublicAccount');
50   };
52   /**
53    * @return {boolean} Whether we're currently in supervised user mode.
54    */
55   UIAccountTweaks.loggedInAsSupervisedUser = function() {
56     return loadTimeData.getBoolean('loggedInAsSupervisedUser');
57   };
59   /**
60    * Enables an element unless it should be disabled for the session type.
61    *
62    * @param {!Element} element Element that should be enabled.
63    */
64   UIAccountTweaks.enableElementIfPossible = function(element) {
65     var sessionType;
66     if (UIAccountTweaks.loggedInAsGuest())
67       sessionType = SESSION_TYPE_GUEST;
68     else if (UIAccountTweaks.loggedInAsPublicAccount())
69       sessionType = SESSION_TYPE_PUBLIC;
71     if (sessionType &&
72         element.getAttribute(sessionType + '-visibility') == 'disabled') {
73       return;
74     }
76     element.disabled = false;
77   }
79   /**
80    * Disables or hides some elements in specified type of session in ChromeOS.
81    * All elements within given document with *sessionType*-visibility
82    * attribute are either hidden (for *sessionType*-visibility="hidden")
83    * or disabled (for *sessionType*-visibility="disabled").
84    *
85    * @param {Document} document Document that should processed.
86    * @param {string} sessionType name of the session type processed.
87    * @private
88    */
89   UIAccountTweaks.applySessionTypeVisibility_ = function(document,
90                                                          sessionType) {
91     var elements = document.querySelectorAll('['+ sessionType + '-visibility]');
92     for (var i = 0; i < elements.length; i++) {
93       var element = elements[i];
94       var visibility = element.getAttribute(sessionType + '-visibility');
95       if (visibility == 'hidden')
96         element.hidden = true;
97       else if (visibility == 'disabled')
98         UIAccountTweaks.disableElementsForSessionType(element, sessionType);
99     }
100   }
102   /**
103    * Updates specific visibility of elements for Guest session in ChromeOS.
104    * Calls applySessionTypeVisibility_ method.
105    *
106    * @param {Document} document Document that should processed.
107    */
108   UIAccountTweaks.applyGuestSessionVisibility = function(document) {
109     if (!UIAccountTweaks.loggedInAsGuest())
110       return;
111     UIAccountTweaks.applySessionTypeVisibility_(document, SESSION_TYPE_GUEST);
112   }
114   /**
115    * Updates specific visibility of elements for Public account session in
116    * ChromeOS. Calls applySessionTypeVisibility_ method.
117    *
118    * @param {Document} document Document that should processed.
119    */
120   UIAccountTweaks.applyPublicSessionVisibility = function(document) {
121     if (!UIAccountTweaks.loggedInAsPublicAccount())
122       return;
123     UIAccountTweaks.applySessionTypeVisibility_(document, SESSION_TYPE_PUBLIC);
124   }
126   /**
127    * Disables and marks page elements for specified session type.
128    * Adds #-disabled css class to all elements within given subtree,
129    * disables interactive elements (input/select/button), and removes href
130    * attribute from <a> elements.
131    *
132    * @param {!Element} element Root element of DOM subtree that should be
133    *     disabled.
134    * @param {string} sessionType session type specificator.
135    */
136   UIAccountTweaks.disableElementsForSessionType = function(element,
137                                                            sessionType) {
138     UIAccountTweaks.disableElementForSessionType_(element, sessionType);
140     // Walk the tree, searching each ELEMENT node.
141     var walker = document.createTreeWalker(element,
142                                            NodeFilter.SHOW_ELEMENT,
143                                            null,
144                                            false);
146     var node = walker.nextNode();
147     while (node) {
148       UIAccountTweaks.disableElementForSessionType_(
149           /** @type {!Element} */(node), sessionType);
150       node = walker.nextNode();
151     }
152   };
154   /**
155    * Disables single element for given session type.
156    * Adds *sessionType*-disabled css class, adds disabled attribute for
157    * appropriate elements (input/select/button), and removes href attribute from
158    * <a> element.
159    *
160    * @private
161    * @param {!Element} element Element that should be disabled.
162    * @param {string} sessionType account session Type specificator.
163    */
164   UIAccountTweaks.disableElementForSessionType_ = function(element,
165                                                            sessionType) {
166     element.classList.add(sessionType + '-disabled');
167     if (element.nodeName == 'INPUT' ||
168         element.nodeName == 'SELECT' ||
169         element.nodeName == 'BUTTON') {
170       element.disabled = true;
171     } else if (element.nodeName == 'A') {
172       element.onclick = function() {
173         return false;
174       };
175     }
176   };
178   // Export
179   return {
180     UIAccountTweaks: UIAccountTweaks
181   };