• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/**
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 */
14
15cr.define('uiAccountTweaks', function() {
16
17  /////////////////////////////////////////////////////////////////////////////
18  // UIAccountTweaks class:
19
20  // String specificators for different types of sessions.
21  /** @const */ var SESSION_TYPE_GUEST = 'guest';
22  /** @const */ var SESSION_TYPE_PUBLIC = 'public-account';
23
24  /**
25   * Encapsulated handling of ChromeOS accounts options page.
26   * @constructor
27   */
28  function UIAccountTweaks() {
29  }
30
31  /**
32   * @return {boolean} Whether the current user is owner or not.
33   */
34  UIAccountTweaks.currentUserIsOwner = function() {
35    return loadTimeData.getBoolean('currentUserIsOwner');
36  };
37
38  /**
39   * @return {boolean} Whether we're currently in guest session.
40   */
41  UIAccountTweaks.loggedInAsGuest = function() {
42    return loadTimeData.getBoolean('loggedInAsGuest');
43  };
44
45  /**
46   * @return {boolean} Whether we're currently in public session.
47   */
48  UIAccountTweaks.loggedInAsPublicAccount = function() {
49    return loadTimeData.getBoolean('loggedInAsPublicAccount');
50  };
51
52  /**
53   * @return {boolean} Whether we're currently in supervised user mode.
54   */
55  UIAccountTweaks.loggedInAsSupervisedUser = function() {
56    return loadTimeData.getBoolean('loggedInAsSupervisedUser');
57  };
58
59  /**
60   * Disables or hides some elements in specified type of session in ChromeOS.
61   * All elements within given document with *sessionType*-visibility
62   * attribute are either hidden (for *sessionType*-visibility="hidden")
63   * or disabled (for *sessionType*-visibility="disabled").
64   *
65   * @param {Document} document Document that should processed.
66   * @param {string} sessionType name of the session type processed.
67   * @private
68   */
69  UIAccountTweaks.applySessionTypeVisibility_ = function(document,
70                                                         sessionType) {
71    var elements = document.querySelectorAll('['+ sessionType +'-visibility]');
72    for (var i = 0; i < elements.length; i++) {
73      var element = elements[i];
74      var visibility = element.getAttribute(sessionType +'-visibility');
75      if (visibility == 'hidden')
76        element.hidden = true;
77      else if (visibility == 'disabled')
78        UIAccountTweaks.disableElementsForSessionType(element, sessionType);
79    }
80  }
81
82  /**
83   * Updates specific visibility of elements for Guest session in ChromeOS.
84   * Calls applySessionTypeVisibility_ method.
85   *
86   * @param {Document} document Document that should processed.
87   */
88  UIAccountTweaks.applyGuestSessionVisibility = function(document) {
89    if (!cr.isChromeOS || !UIAccountTweaks.loggedInAsGuest())
90      return;
91    UIAccountTweaks.applySessionTypeVisibility_(document, SESSION_TYPE_GUEST);
92  }
93
94  /**
95   * Updates specific visibility of elements for Public account session in
96   * ChromeOS. Calls applySessionTypeVisibility_ method.
97   *
98   * @param {Document} document Document that should processed.
99   */
100  UIAccountTweaks.applyPublicSessionVisibility = function(document) {
101    if (!cr.isChromeOS || !UIAccountTweaks.loggedInAsPublicAccount())
102      return;
103    UIAccountTweaks.applySessionTypeVisibility_(document, SESSION_TYPE_PUBLIC);
104  }
105
106  /**
107   * Disables and marks page elements for specified session type.
108   * Adds #-disabled css class to all elements within given subtree,
109   * disables interactive elements (input/select/button), and removes href
110   * attribute from <a> elements.
111   *
112   * @param {!Element} element Root element of DOM subtree that should be
113   *     disabled.
114   * @param {string} sessionType session type specificator.
115   */
116  UIAccountTweaks.disableElementsForSessionType = function(element,
117                                                           sessionType) {
118    UIAccountTweaks.disableElementForSessionType_(element, sessionType);
119
120    // Walk the tree, searching each ELEMENT node.
121    var walker = document.createTreeWalker(element,
122                                           NodeFilter.SHOW_ELEMENT,
123                                           null,
124                                           false);
125
126    var node = walker.nextNode();
127    while (node) {
128      UIAccountTweaks.disableElementForSessionType_(
129          /** @type {!Element} */(node), sessionType);
130      node = walker.nextNode();
131    }
132  };
133
134  /**
135   * Disables single element for given session type.
136   * Adds *sessionType*-disabled css class, adds disabled attribute for
137   * appropriate elements (input/select/button), and removes href attribute from
138   * <a> element.
139   *
140   * @private
141   * @param {!Element} element Element that should be disabled.
142   * @param {string} sessionType account session Type specificator.
143   */
144  UIAccountTweaks.disableElementForSessionType_ = function(element,
145                                                           sessionType) {
146    element.classList.add(sessionType + '-disabled');
147    if (element.nodeName == 'INPUT' ||
148        element.nodeName == 'SELECT' ||
149        element.nodeName == 'BUTTON') {
150      element.disabled = true;
151    } else if (element.nodeName == 'A') {
152      element.onclick = function() {
153        return false;
154      };
155    }
156  };
157
158  // Export
159  return {
160    UIAccountTweaks: UIAccountTweaks
161  };
162
163});
164