// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. if (!loadTimeData.getBoolean('newContentSettings')) { cr.define('options', function() { /** @const */ var OptionsPage = options.OptionsPage; ////////////////////////////////////////////////////////////////////////////// // ContentSettings class: /** * Encapsulated handling of content settings page. * @constructor */ function ContentSettings() { this.activeNavTab = null; OptionsPage.call(this, 'content', loadTimeData.getString('contentSettingsPageTabTitle'), 'content-settings-page'); } cr.addSingletonGetter(ContentSettings); ContentSettings.prototype = { __proto__: OptionsPage.prototype, initializePage: function() { OptionsPage.prototype.initializePage.call(this); var exceptionsButtons = this.pageDiv.querySelectorAll('.exceptions-list-button'); for (var i = 0; i < exceptionsButtons.length; i++) { exceptionsButtons[i].onclick = function(event) { var page = ContentSettingsExceptionsArea.getInstance(); // Add on the proper hash for the content type, and store that in the // history so back/forward and tab restore works. var hash = event.currentTarget.getAttribute('contentType'); var url = page.name + '#' + hash; window.history.pushState({pageName: page.name}, page.title, '/' + url); // Navigate after the history has been replaced in order to have the // correct hash loaded. OptionsPage.showPageByName('contentExceptions', false); uber.invokeMethodOnParent('setPath', {path: url}); uber.invokeMethodOnParent('setTitle', {title: loadTimeData.getString(hash + 'TabTitle')}); }; } var manageHandlersButton = $('manage-handlers-button'); if (manageHandlersButton) { manageHandlersButton.onclick = function(event) { OptionsPage.navigateToPage('handlers'); }; } $('manage-galleries-button').onclick = function(event) { OptionsPage.navigateToPage('manageGalleries'); }; if (cr.isChromeOS) UIAccountTweaks.applyGuestModeVisibility(document); // Cookies filter page --------------------------------------------------- $('show-cookies-button').onclick = function(event) { chrome.send('coreOptionsUserMetricsAction', ['Options_ShowCookies']); OptionsPage.navigateToPage('cookies'); }; $('content-settings-overlay-confirm').onclick = OptionsPage.closeOverlay.bind(OptionsPage); $('media-pepper-flash-default').hidden = true; $('media-pepper-flash-exceptions').hidden = true; $('media-select-mic').addEventListener('change', ContentSettings.setDefaultMicrophone_); $('media-select-camera').addEventListener('change', ContentSettings.setDefaultCamera_); }, }; ContentSettings.updateHandlersEnabledRadios = function(enabled) { var selector = '#content-settings-page input[type=radio][value=' + (enabled ? 'allow' : 'block') + '].handler-radio'; document.querySelector(selector).checked = true; }; /** * Sets the values for all the content settings radios. * @param {Object} dict A mapping from radio groups to the checked value for * that group. */ ContentSettings.setContentFilterSettingsValue = function(dict) { for (var group in dict) { var managedBy = dict[group].managedBy; var controlledBy = managedBy == 'policy' || managedBy == 'extension' ? managedBy : null; document.querySelector('input[type=radio][name=' + group + '][value=' + dict[group].value + ']').checked = true; var radios = document.querySelectorAll('input[type=radio][name=' + group + ']'); for (var i = 0, len = radios.length; i < len; i++) { radios[i].disabled = (managedBy != 'default'); radios[i].controlledBy = controlledBy; } var indicators = document.querySelectorAll( 'span.controlled-setting-indicator[content-setting=' + group + ']'); if (indicators.length == 0) continue; // Create a synthetic pref change event decorated as // CoreOptionsHandler::CreateValueForPref() does. var event = new Event(group); event.value = { value: dict[group].value, controlledBy: controlledBy, }; for (var i = 0; i < indicators.length; i++) indicators[i].handlePrefChange(event); } }; /** * Updates the labels and indicators for the Media settings. Those require * special handling because they are backed by multiple prefs and can change * their scope based on the managed state of the backing prefs. * @param {Object} mediaSettings A dictionary containing the following fields: * {String} askText The label for the ask radio button. * {String} blockText The label for the block radio button. * {Boolean} cameraDisabled Whether to disable the camera dropdown. * {Boolean} micDisabled Whether to disable the microphone dropdown. * {Boolean} showBubble Wether to show the managed icon and bubble for the * media label. * {String} bubbleText The text to use inside the bubble if it is shown. */ ContentSettings.updateMediaUI = function(mediaSettings) { $('media-stream-ask-label').innerHTML = loadTimeData.getString(mediaSettings.askText); $('media-stream-block-label').innerHTML = loadTimeData.getString(mediaSettings.blockText); if (mediaSettings.micDisabled) $('media-select-mic').disabled = true; if (mediaSettings.cameraDisabled) $('media-select-camera').disabled = true; OptionsPage.hideBubble(); // Create a synthetic pref change event decorated as // CoreOptionsHandler::CreateValueForPref() does. // TODO(arv): It was not clear what event type this should use? var event = new Event('undefined'); event.value = {}; if (mediaSettings.showBubble) { event.value = { controlledBy: 'policy' }; $('media-indicator').setAttribute( 'textpolicy', loadTimeData.getString(mediaSettings.bubbleText)); $('media-indicator').location = cr.ui.ArrowLocation.TOP_START; } $('media-indicator').handlePrefChange(event); }; /** * Initializes an exceptions list. * @param {string} type The content type that we are setting exceptions for. * @param {Array} list An array of pairs, where the first element of each pair * is the filter string, and the second is the setting (allow/block). */ ContentSettings.setExceptions = function(type, list) { var exceptionsList = document.querySelector('div[contentType=' + type + ']' + ' list[mode=normal]'); exceptionsList.setExceptions(list); }; ContentSettings.setHandlers = function(list) { $('handlers-list').setHandlers(list); }; ContentSettings.setIgnoredHandlers = function(list) { $('ignored-handlers-list').setHandlers(list); }; ContentSettings.setOTRExceptions = function(type, list) { var exceptionsList = document.querySelector('div[contentType=' + type + ']' + ' list[mode=otr]'); exceptionsList.parentNode.hidden = false; exceptionsList.setExceptions(list); }; /** * The browser's response to a request to check the validity of a given URL * pattern. * @param {string} type The content type. * @param {string} mode The browser mode. * @param {string} pattern The pattern. * @param {bool} valid Whether said pattern is valid in the context of * a content exception setting. */ ContentSettings.patternValidityCheckComplete = function(type, mode, pattern, valid) { var exceptionsList = document.querySelector('div[contentType=' + type + '] ' + 'list[mode=' + mode + ']'); exceptionsList.patternValidityCheckComplete(pattern, valid); }; /** * Shows/hides the link to the Pepper Flash camera and microphone default * settings. * Please note that whether the link is actually showed or not is also * affected by the style class pepper-flash-settings. */ ContentSettings.showMediaPepperFlashDefaultLink = function(show) { $('media-pepper-flash-default').hidden = !show; } /** * Shows/hides the link to the Pepper Flash camera and microphone * site-specific settings. * Please note that whether the link is actually showed or not is also * affected by the style class pepper-flash-settings. */ ContentSettings.showMediaPepperFlashExceptionsLink = function(show) { $('media-pepper-flash-exceptions').hidden = !show; } /** * Shows/hides the whole Web MIDI settings. * @param {bool} show Wether to show the whole Web MIDI settings. */ ContentSettings.showExperimentalWebMIDISettings = function(show) { $('experimental-web-midi-settings').hidden = !show; } /** * Updates the microphone/camera devices menu with the given entries. * @param {string} type The device type. * @param {Array} devices List of available devices. * @param {string} defaultdevice The unique id of the current default device. */ ContentSettings.updateDevicesMenu = function(type, devices, defaultdevice) { var deviceSelect = ''; if (type == 'mic') { deviceSelect = $('media-select-mic'); } else if (type == 'camera') { deviceSelect = $('media-select-camera'); } else { console.error('Unknown device type for <device select> UI element: ' + type); return; } deviceSelect.textContent = ''; var deviceCount = devices.length; var defaultIndex = -1; for (var i = 0; i < deviceCount; i++) { var device = devices[i]; var option = new Option(device.name, device.id); if (option.value == defaultdevice) defaultIndex = i; deviceSelect.appendChild(option); } if (defaultIndex >= 0) deviceSelect.selectedIndex = defaultIndex; }; /** * Enables/disables the protected content exceptions button. * @param {bool} enable Whether to enable the button. */ ContentSettings.enableProtectedContentExceptions = function(enable) { var exceptionsButton = $('protected-content-exceptions'); if (exceptionsButton) { exceptionsButton.disabled = !enable; } } /** * Set the default microphone device based on the popup selection. * @private */ ContentSettings.setDefaultMicrophone_ = function() { var deviceSelect = $('media-select-mic'); chrome.send('setDefaultCaptureDevice', ['mic', deviceSelect.value]); }; /** * Set the default camera device based on the popup selection. * @private */ ContentSettings.setDefaultCamera_ = function() { var deviceSelect = $('media-select-camera'); chrome.send('setDefaultCaptureDevice', ['camera', deviceSelect.value]); }; // Export return { ContentSettings: ContentSettings }; }); }