Home | History | Annotate | Download | only in options
      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
      3 // found in the LICENSE file.
      4 
      5 cr.define('options.ContentSettings', function() {
      6   /** @const */ var Page = cr.ui.pageManager.Page;
      7   /** @const */ var PageManager = cr.ui.pageManager.PageManager;
      8   /** @const */ var ArrayDataModel = cr.ui.ArrayDataModel;
      9 
     10   // Lookup table to generate the i18n strings.
     11   /** @const */ var permissionsLookup = {
     12     'geolocation': 'location',
     13     'notifications': 'notifications',
     14     'media-stream': 'mediaStream',
     15     'cookies': 'cookies',
     16     'multiple-automatic-downloads': 'multipleAutomaticDownloads',
     17     'images': 'images',
     18     'plugins': 'plugins',
     19     'popups': 'popups',
     20     'javascript': 'javascript',
     21     'battery': 'battery',
     22     'storage': 'storage'
     23   };
     24 
     25   /////////////////////////////////////////////////////////////////////////////
     26   // WebsiteSettingsManager class:
     27 
     28   /**
     29    * Encapsulated handling of the website settings page.
     30    * @constructor
     31    * @extends {cr.ui.pageManager.Page}
     32    */
     33   function WebsiteSettingsManager() {
     34     Page.call(this, 'websiteSettings',
     35               loadTimeData.getString('websitesOptionsPageTabTitle'),
     36               'website-settings-page');
     37   }
     38 
     39   cr.addSingletonGetter(WebsiteSettingsManager);
     40 
     41   WebsiteSettingsManager.prototype = {
     42     __proto__: Page.prototype,
     43 
     44     /**
     45      * The saved allowed origins list.
     46      * @type {options.OriginList}
     47      * @private
     48      */
     49     allowedList_: null,
     50 
     51     /**
     52      * The saved blocked origins list.
     53      * @type {options.OriginList}
     54      * @private
     55      */
     56     blockedList_: null,
     57 
     58     /** @override */
     59     initializePage: function() {
     60       Page.prototype.initializePage.call(this);
     61 
     62       $('website-settings-overlay-confirm').onclick =
     63           PageManager.closeOverlay.bind(PageManager);
     64 
     65       $('global-setting').onchange = function(event) {
     66         chrome.send('setDefaultContentSetting', [this.value]);
     67       };
     68 
     69       $('global-setting-toggle').onchange = function(event) {
     70         var value = event.target.checked;
     71         chrome.send('setGlobalEnabled', [value]);
     72       };
     73 
     74       var searchBox = $('website-settings-search-box');
     75       searchBox.addEventListener('search',
     76                                  this.handleSearchQueryChange_.bind(this));
     77 
     78       searchBox.onkeydown = function(e) {
     79         if (e.keyIdentifier == 'Enter')
     80           e.preventDefault();
     81       };
     82 
     83       this.createOriginsList_();
     84       this.updatePage_('geolocation');
     85     },
     86 
     87     /**
     88      * Called after the page has been shown. Show the content settings or
     89      * resource auditing for the location's hash.
     90      */
     91     didShowPage: function() {
     92       var hash = this.hash;
     93       if (hash)
     94         hash = hash.slice(1);
     95       else
     96         hash = 'geolocation';
     97       this.updatePage_(hash);
     98     },
     99 
    100     /**
    101      * Creates, decorates and initializes the origin list.
    102      * @private
    103      */
    104     createOriginsList_: function() {
    105       var allowedList = $('allowed-origin-list');
    106       options.OriginList.decorate(allowedList);
    107       this.allowedList_ = assertInstanceof(allowedList, options.OriginList);
    108       this.allowedList_.autoExpands = true;
    109 
    110       var blockedList = $('blocked-origin-list');
    111       options.OriginList.decorate(blockedList);
    112       this.blockedList_ = assertInstanceof(blockedList, options.OriginList);
    113       this.blockedList_.autoExpands = true;
    114     },
    115 
    116     /**
    117      * Populate an origin list with all of the origins with a given permission
    118      * or that are using a given resource.
    119      * @param {options.OriginList} originList A list to populate.
    120      * @param {!Object} originDict A dictionary of origins to their usage, which
    121            will be used to sort the origins.
    122      * @private
    123      */
    124     populateOriginsHelper_: function(originList, originDict) {
    125       var origins = Object.keys(originDict).map(function(origin) {
    126         // |usage| means the time of last usage in seconds since epoch
    127         // (Jan 1, 1970) for permissions and means the amount of local storage
    128         // in bytes used for local storage.
    129         return {
    130           origin: origin,
    131           usage: originDict[origin].usage,
    132           usageString: originDict[origin].usageString,
    133           readableName: originDict[origin].readableName,
    134         };
    135       });
    136       origins.sort(function(first, second) {
    137         return second.usage - first.usage;
    138       });
    139       originList.dataModel = new ArrayDataModel(origins);
    140     },
    141 
    142 
    143     /**
    144      * Populate the origin lists with all of the origins with a given permission
    145      * or that are using a given resource, potentially split by if allowed or
    146      * denied. If no blocked dictionary is provided, only the allowed list is
    147      * shown.
    148      * @param {!Object} allowedDict A dictionary of origins to their usage,
    149            which will be used to sort the origins in the main/allowed list.
    150      * @param {!Object} blockedDict An optional dictionary of origins to their
    151            usage, which will be used to sort the origins in the blocked list.
    152      * @param {bool} isGloballyEnabled If the content setting is turned on.
    153      * @private
    154      */
    155     populateOrigins: function(allowedDict, blockedDict, isGloballyEnabled) {
    156       this.populateOriginsHelper_(this.allowedList_, allowedDict);
    157       if (blockedDict) {
    158         this.populateOriginsHelper_(this.blockedList_, blockedDict);
    159         this.blockedList_.hidden = false;
    160         $('blocked-origin-list-title').hidden = false;
    161         this.allowedList_.classList.remove('nonsplit-origin-list');
    162       } else {
    163         this.blockedList_.hidden = true;
    164         $('blocked-origin-list-title').hidden = true;
    165         $('allowed-origin-list-title').hidden = true;
    166         this.allowedList_.classList.add('nonsplit-origin-list');
    167       }
    168       $('global-setting-toggle').checked = isGloballyEnabled;
    169     },
    170 
    171     /**
    172      * Update the table with the origins filtered by the value in the search
    173      * box.
    174      * @private
    175      */
    176     searchOrigins: function() {
    177       var filter = $('website-settings-search-box').value;
    178       chrome.send('updateOriginsSearchResults', [filter]);
    179     },
    180 
    181     /**
    182      * Handle and delay search query changes.
    183      * @param {!Event} e The event object.
    184      * @private
    185      */
    186     handleSearchQueryChange_: function(e) {
    187       if (this.queryDelayTimerId_)
    188         window.clearTimeout(this.queryDelayTimerId_);
    189 
    190       this.queryDelayTimerId_ = window.setTimeout(this.searchOrigins.bind(this),
    191                                                   160);
    192     },
    193 
    194     /**
    195      * Sets the default content setting dropdown on the page to the current
    196      * default.
    197      * @param {!Object} dict A dictionary with the management and value of the
    198      *     default setting for the last selected content setting..
    199      */
    200     updateDefault: function(dict) {
    201       // TODO(dhnishi): Remove duplicate default handling in the Content
    202       //     Settings page and here.
    203       var managedBy = dict.managedBy;
    204       var controlledBy = managedBy == 'policy' || managedBy == 'extension' ?
    205                 managedBy : null;
    206       $('global-setting').disabled = (managedBy != 'default');
    207 
    208       var options = $('global-setting').options;
    209       for (var i = 0; i < options.length; i++) {
    210         if (options[i].value == dict.value) {
    211           options.selectedIndex = i;
    212         }
    213       }
    214     },
    215 
    216     /**
    217      * Updates the page with the given content setting or resource name's
    218      * information.
    219      * @param {string} typeName The name of the content setting or resource.
    220      */
    221     updatePage_: function(typeName) {
    222       if (typeName == 'storage')
    223         chrome.send('updateLocalStorage');
    224       else if (typeName == 'battery')
    225         chrome.send('updateBatteryUsage');
    226       else
    227         chrome.send('updateOrigins', [typeName]);
    228 
    229       var options = $('global-setting').options;
    230       options.length = 0;
    231       var permissionString = permissionsLookup[typeName];
    232       var permissions = ['Allow', 'Ask', 'Block'];
    233       for (var i = 0; i < permissions.length; i++) {
    234         var valueId = permissionString + permissions[i];
    235         if (loadTimeData.valueExists(valueId)) {
    236           options.add(new Option(loadTimeData.getString(valueId),
    237               permissions[i].toLowerCase()));
    238         }
    239       }
    240       if (options.length == 0) {
    241         $('website-settings-global-controls').hidden = true;
    242       } else {
    243         $('website-settings-global-controls').hidden = false;
    244         chrome.send('updateDefaultSetting');
    245       }
    246 
    247       $('website-settings-title').textContent =
    248           loadTimeData.getString(permissionString + 'TabLabel');
    249     }
    250   };
    251 
    252   WebsiteSettingsManager.populateOrigins = function(allowedDict, blockedDict,
    253       isGloballyEnabled) {
    254     WebsiteSettingsManager.getInstance().populateOrigins(allowedDict,
    255         blockedDict, isGloballyEnabled);
    256   };
    257 
    258   WebsiteSettingsManager.updateDefault = function(dict) {
    259     WebsiteSettingsManager.getInstance().updateDefault(dict);
    260   };
    261 
    262   WebsiteSettingsManager.showWebsiteSettings = function(hash) {
    263     PageManager.showPageByName('websiteSettings', true, {hash: '#' + hash});
    264   };
    265 
    266   // Export
    267   return {
    268     WebsiteSettingsManager: WebsiteSettingsManager
    269   };
    270 });
    271