Home | History | Annotate | Download | only in enableReferrer
      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 var pref = chrome.privacy.websites.referrersEnabled;
      7 
      8 function $(id) {
      9   return document.getElementById(id);
     10 }
     11 
     12 /**
     13  * Returns whether the |levelOfControl| means that the extension can change the
     14  * preference value.
     15  *
     16  * @param levelOfControl{string}
     17  */
     18 function settingIsControllable(levelOfControl) {
     19   return (levelOfControl == 'controllable_by_this_extension' ||
     20           levelOfControl == 'controlled_by_this_extension');
     21 }
     22 
     23 /**
     24  * Updates the UI to reflect the state of the preference.
     25  *
     26  * @param settings{object} A settings object, as returned from |get()| or the
     27  * |onchange| event.
     28  */
     29 function updateUI(settings) {
     30   var disableUI = !settingIsControllable(settings.levelOfControl);
     31   document.getElementById('regularValue').disabled = disableUI;
     32   document.getElementById('useSeparateIncognitoSettings').disabled = disableUI;
     33   if (settings.hasOwnProperty('incognitoSpecific')) {
     34     var hasIncognitoValue = settings.incognitoSpecific;
     35     document.getElementById('useSeparateIncognitoSettings').checked =
     36         hasIncognitoValue;
     37     document.getElementById('incognitoValue').disabled =
     38         disableUI || !hasIncognitoValue;
     39     document.getElementById('incognitoValue').checked = settings.value;
     40   } else {
     41     document.getElementById('regularValue').checked = settings.value;
     42   }
     43 }
     44 
     45 /**
     46  * Wrapper for |updateUI| which is used as callback for the |get()| method and
     47  * which logs the result.
     48  * If there was an error getting the preference, does nothing.
     49  *
     50  * @param settings{object} A settings object, as returned from |get()|.
     51  */
     52 function updateUIFromGet(settings) {
     53   if (settings) {
     54     console.log('pref.get result:' + JSON.stringify(settings));
     55     updateUI(settings);
     56   }
     57 }
     58 
     59 /**
     60  * Wrapper for |updateUI| which is used as handler for the |onchange| event
     61  * and which logs the result.
     62  *
     63  * @param settings{object} A settings object, as returned from the |onchange|
     64  * event.
     65  */
     66 function updateUIFromOnChange(settings) {
     67   console.log('pref.onChange event:' + JSON.stringify(settings));
     68   updateUI(settings);
     69 }
     70 
     71 /*
     72  * Initializes the UI.
     73  */
     74 function init() {
     75   chrome.extension.isAllowedIncognitoAccess(function(allowed) {
     76     if (allowed) {
     77       pref.get({'incognito': true}, updateUIFromGet);
     78       $('incognito').style.display = 'block';
     79       $('incognito-forbidden').style.display = 'none';
     80     }
     81   });
     82   pref.get({}, updateUIFromGet);
     83   pref.onChange.addListener(updateUIFromOnChange);
     84 
     85   $('regularValue').addEventListener('click', function () {
     86     setPrefValue(this.checked, false);
     87   });
     88   $('useSeparateIncognitoSettings').addEventListener('click', function () {
     89      setUseSeparateIncognitoSettings(this.checked);
     90   });
     91   $('incognitoValue').addEventListener('click', function () {
     92     setPrefValue(this.checked, true);
     93   });
     94 }
     95 
     96 /**
     97  * Called from the UI to change the preference value.
     98  *
     99  * @param enabled{boolean} The new preference value.
    100  * @param incognito{boolean} Whether the value is specific to incognito mode.
    101  */
    102 function setPrefValue(enabled, incognito) {
    103   var scope = incognito ? 'incognito_session_only' : 'regular';
    104   pref.set({'value': enabled, 'scope': scope});
    105 }
    106 
    107 /**
    108  * Called from the UI to change whether to use separate settings for
    109  * incognito mode.
    110  *
    111  * @param value{boolean} whether to use separate settings for
    112  * incognito mode.
    113  */
    114 function setUseSeparateIncognitoSettings(value) {
    115   if (!value) {
    116     pref.clear({'incognito': true});
    117   } else {
    118     // Explicitly set the value for incognito mode.
    119     pref.get({'incognito': true}, function(settings) {
    120       pref.set({'incognito': true, 'value': settings.value});
    121     });
    122   }
    123   document.getElementById('incognitoValue').disabled = !value;
    124 }
    125 
    126 // Call `init` to kick things off.
    127 document.addEventListener('DOMContentLoaded', init);
    128