OLD | NEW |
| (Empty) |
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 {boolean} 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 }); | |
OLD | NEW |