15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @fileoverview This file contains methods that allow to tweak
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * internal page UI based on the status of current user (owner/user/guest).
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * It is assumed that required data is passed via i18n strings
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (using loadTimeData dictionary) that are filled with call to
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * AddAccountUITweaksLocalizedValues in ui_account_tweaks.cc.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * It is also assumed that tweaked page has chrome://resources/css/widgets.css
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * included.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cr.define('uiAccountTweaks', function() {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /////////////////////////////////////////////////////////////////////////////
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UIAccountTweaks class:
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Encapsulated handling of ChromeOS accounts options page.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @constructor
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function UIAccountTweaks() {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return {boolean} Whether the current user is owner or not.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UIAccountTweaks.currentUserIsOwner = function() {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return loadTimeData.getBoolean('currentUserIsOwner');
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return {boolean} Whether we're currently in guest mode.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UIAccountTweaks.loggedInAsGuest = function() {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return loadTimeData.getBoolean('loggedInAsGuest');
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   * @return {boolean} Whether we're currently in supervised user mode.
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   */
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UIAccountTweaks.loggedInAsLocallyManagedUser = function() {
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return loadTimeData.getBoolean('loggedInAsLocallyManagedUser');
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /**
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Disables or hides some elements in Guest mode in ChromeOS.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * All elements within given document with guest-visibility
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * attribute are either hidden (for guest-visibility="hidden")
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * or disabled (for guest-visibility="disabled").
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {Document} document Document that should processed.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UIAccountTweaks.applyGuestModeVisibility = function(document) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!cr.isChromeOS || !UIAccountTweaks.loggedInAsGuest())
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var elements = document.querySelectorAll('[guest-visibility]');
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < elements.length; i++) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var element = elements[i];
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var visibility = element.getAttribute('guest-visibility');
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (visibility == 'hidden')
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        element.hidden = true;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (visibility == 'disabled')
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UIAccountTweaks.disableElementsForGuest(element);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Disables and marks page elements for Guest mode.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Adds guest-disabled css class to all elements within given subtree,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * disables interactive elements (input/select/button), and removes href
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * attribute from <a> elements.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {Element} element Root element of DOM subtree that should be
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     disabled.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UIAccountTweaks.disableElementsForGuest = function(element) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UIAccountTweaks.disableElementForGuest_(element);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Walk the tree, searching each ELEMENT node.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var walker = document.createTreeWalker(element,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           NodeFilter.SHOW_ELEMENT,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           null,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           false);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var node = walker.nextNode();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (node) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UIAccountTweaks.disableElementForGuest_(node);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      node = walker.nextNode();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Disables single element for Guest mode.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Adds guest-disabled css class, adds disabled attribute for appropriate
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * elements (input/select/button), and removes href attribute from
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * <a> element.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @private
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {Element} element Element that should be disabled.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UIAccountTweaks.disableElementForGuest_ = function(element) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    element.classList.add('guest-disabled');
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (element.nodeName == 'INPUT' ||
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        element.nodeName == 'SELECT' ||
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        element.nodeName == 'BUTTON')
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      element.disabled = true;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (element.nodeName == 'A') {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      element.onclick = function() {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      };
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Export
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UIAccountTweaks: UIAccountTweaks
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
123