// 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. // Used for observing function of the backend datasource for this page by // tests. var webui_responded_ = false; var localStrings = new LocalStrings(); cr.define('extensions', function() { var ExtensionsList = options.ExtensionsList; /** * ExtensionSettings class * @class */ function ExtensionSettings() {} cr.addSingletonGetter(ExtensionSettings); ExtensionSettings.prototype = { __proto__: HTMLDivElement.prototype, /** * Perform initial setup. */ initialize: function() { cr.enablePlatformSpecificCSSRules(); // Set the title. var title = localStrings.getString('extensionSettings'); uber.invokeMethodOnParent('setTitle', {title: title}); // This will request the data to show on the page and will get a response // back in returnExtensionsData. chrome.send('extensionSettingsRequestExtensionsData'); // Set up the developer mode button. var toggleDevMode = $('toggle-dev-on'); toggleDevMode.addEventListener('click', this.handleToggleDevMode_.bind(this)); // Setup the gallery related links and text. $('suggest-gallery').innerHTML = localStrings.getString('extensionSettingsSuggestGallery'); $('get-more-extensions').innerHTML = localStrings.getString('extensionSettingsGetMoreExtensions'); // Set up the three dev mode buttons (load unpacked, pack and update). $('load-unpacked').addEventListener('click', this.handleLoadUnpackedExtension_.bind(this)); $('pack-extension').addEventListener('click', this.handlePackExtension_.bind(this)); $('update-extensions-now').addEventListener('click', this.handleUpdateExtensionNow_.bind(this)); var packExtensionOverlay = extensions.PackExtensionOverlay.getInstance(); packExtensionOverlay.initializePage(); }, /** * Utility function which asks the C++ to show a platform-specific file * select dialog, and fire |callback| with the |filePath| that resulted. * |selectType| can be either 'file' or 'folder'. |operation| can be 'load', * 'packRoot', or 'pem' which are signals to the C++ to do some * operation-specific configuration. * @private */ showFileDialog_: function(selectType, operation, callback) { handleFilePathSelected = function(filePath) { callback(filePath); handleFilePathSelected = function() {}; }; chrome.send('extensionSettingsSelectFilePath', [selectType, operation]); }, /** * Handles the Load Unpacked Extension button. * @param {Event} e Change event. * @private */ handleLoadUnpackedExtension_: function(e) { this.showFileDialog_('folder', 'pem', function(filePath) { chrome.send('extensionSettingsLoad', [String(filePath)]); }); chrome.send('coreOptionsUserMetricsAction', ['Options_LoadUnpackedExtension']); }, /** * Handles the Pack Extension button. * @param {Event} e Change event. * @private */ handlePackExtension_: function(e) { $('overlay').hidden = false; chrome.send('coreOptionsUserMetricsAction', ['Options_PackExtension']); }, /** * Handles the Update Extension Now button. * @param {Event} e Change event. * @private */ handleUpdateExtensionNow_: function(e) { chrome.send('extensionSettingsAutoupdate', []); }, /** * Handles the Toggle Dev Mode button. * @param {Event} e Change event. * @private */ handleToggleDevMode_: function(e) { var dev = $('dev'); if (!dev.classList.contains('dev-open')) { // Make the Dev section visible. dev.classList.add('dev-open'); dev.classList.remove('dev-closed'); $('load-unpacked').classList.add('dev-button-visible'); $('load-unpacked').classList.remove('dev-button-hidden'); $('pack-extension').classList.add('dev-button-visible'); $('pack-extension').classList.remove('dev-button-hidden'); $('update-extensions-now').classList.add('dev-button-visible'); $('update-extensions-now').classList.remove('dev-button-hidden'); } else { // Hide the Dev section. dev.classList.add('dev-closed'); dev.classList.remove('dev-open'); $('load-unpacked').classList.add('dev-button-hidden'); $('load-unpacked').classList.remove('dev-button-visible'); $('pack-extension').classList.add('dev-button-hidden'); $('pack-extension').classList.remove('dev-button-visible'); $('update-extensions-now').classList.add('dev-button-hidden'); $('update-extensions-now').classList.remove('dev-button-visible'); } chrome.send('extensionSettingsToggleDeveloperMode', []); }, }; /** * Called by the dom_ui_ to re-populate the page with data representing * the current state of installed extensions. */ ExtensionSettings.returnExtensionsData = function(extensionsData) { webui_responded_ = true; $('no-extensions').hidden = true; $('suggest-gallery').hidden = true; $('get-more-extensions-container').hidden = true; if (extensionsData.extensions.length > 0) { // Enforce order specified in the data or (if equal) then sort by // extension name (case-insensitive). extensionsData.extensions.sort(function(a, b) { if (a.order == b.order) { a = a.name.toLowerCase(); b = b.name.toLowerCase(); return a < b ? -1 : (a > b ? 1 : 0); } else { return a.order < b.order ? -1 : 1; } }); $('get-more-extensions-container').hidden = false; } else { $('no-extensions').hidden = false; $('suggest-gallery').hidden = false; } ExtensionsList.prototype.data_ = extensionsData; var extensionList = $('extension-settings-list'); ExtensionsList.decorate(extensionList); } // Indicate that warning |message| has occured for pack of |crx_path| and // |pem_path| files. Ask if user wants override the warning. Send // |overrideFlags| to repeated 'pack' call to accomplish the override. ExtensionSettings.askToOverrideWarning = function(message, crx_path, pem_path, overrideFlags) { OptionsPage.closeOverlay(); AlertOverlay.show( localStrings.getString('packExtensionWarningTitle'), message, localStrings.getString('packExtensionProceedAnyway'), localStrings.getString('cancel'), function() { chrome.send('pack', [crx_path, pem_path, overrideFlags]); }, function() { OptionsPage.closeOverlay(); }); } // Export return { ExtensionSettings: ExtensionSettings }; }); var ExtensionSettings = extensions.ExtensionSettings; // 'load' seems to have a bad interaction with open_sans.woff. window.addEventListener('DOMContentLoaded', function(e) { ExtensionSettings.getInstance().initialize(); });