| Index: chrome/browser/resources/extensions_ui.js
|
| ===================================================================
|
| --- chrome/browser/resources/extensions_ui.js (revision 102092)
|
| +++ chrome/browser/resources/extensions_ui.js (working copy)
|
| @@ -1,412 +0,0 @@
|
| -// Copyright (c) 2011 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.
|
| -
|
| -/**
|
| - * This variable structure is here to document the structure that the template
|
| - * expects to correctly populate the page.
|
| - */
|
| -var extensionDataFormat = {
|
| - 'developerMode': false,
|
| - 'extensions': [
|
| - {
|
| - 'id': '0000000000000000000000000000000000000000',
|
| - 'name': 'Google Chrome',
|
| - 'description': 'Extension long format description',
|
| - 'version': '1.0.231',
|
| - 'mayDisable': 'true',
|
| - 'enabled': 'true',
|
| - 'terminated': 'false',
|
| - 'enabledIncognito': 'false',
|
| - 'wantsFileAccess': 'false',
|
| - 'allowFileAccess': 'false',
|
| - 'allow_reload': true,
|
| - 'is_hosted_app': false,
|
| - 'order': 1,
|
| - 'options_url': 'options.html',
|
| - 'enable_show_button': false,
|
| - 'icon': 'relative-path-to-icon.png',
|
| - // TODO(aa): It would be nice to also render what type of view each one
|
| - // is, like 'toolstrip', 'background', etc. Eventually, if we can also
|
| - // debug and inspect content scripts, maybe we don't need to list the
|
| - // components, just the views.
|
| - 'views': [
|
| - {
|
| - 'path': 'toolstrip.html',
|
| - 'renderViewId': 1,
|
| - 'renderProcessId': 1,
|
| - 'incognito': false
|
| - },
|
| - {
|
| - 'path': 'background.html',
|
| - 'renderViewId': 2,
|
| - 'renderProcessId': 1,
|
| - 'incognito': false
|
| - }
|
| - ]
|
| - },
|
| - {
|
| - 'id': '0000000000000000000000000000000000000001',
|
| - 'name': 'RSS Subscriber',
|
| - 'description': 'Extension long format description',
|
| - 'version': '1.0.231',
|
| - 'mayDisable': 'true',
|
| - 'enabled': 'true',
|
| - 'terminated': 'false',
|
| - 'enabledIncognito': 'false',
|
| - 'wantsFileAccess': 'false',
|
| - 'allowFileAccess': 'false',
|
| - 'allow_reload': false,
|
| - 'is_hosted_app': false,
|
| - 'order': 2,
|
| - 'icon': '',
|
| - "hasPopupAction": false
|
| - }
|
| - ]
|
| -};
|
| -
|
| -// Keeps track of whether the developer mode subsection has been made visible
|
| -// (expanded) or not.
|
| -var devModeExpanded = false;
|
| -
|
| -/**
|
| - * Toggles the devModeExpanded, and notifies the c++ WebUI to toggle the
|
| - * extensions.ui.developer_mode which saved in the preferences.
|
| - */
|
| -function toggleDevModeExpanded() {
|
| - devModeExpanded = !devModeExpanded;
|
| - chrome.send('toggleDeveloperMode', []);
|
| -}
|
| -
|
| -/**
|
| - * Takes the |extensionsData| input argument which represents data about the
|
| - * currently installed/running extensions and populates the html jstemplate with
|
| - * that data. It expects an object structure like the above.
|
| - * @param {Object} extensionsData Detailed info about installed extensions
|
| - */
|
| -function renderTemplate(extensionsData) {
|
| - // Sort by order specified in the data or (if equal) then sort by
|
| - // extension name.
|
| - var locale = new v8Locale(window.navigator.language);
|
| - var coll = locale.createCollator();
|
| - extensionsData.extensions.sort(function(a, b) {
|
| - if (a.order == b.order) {
|
| - return coll.compare(a.name, b.name);
|
| - }
|
| - return a.order < b.order ? -1 : 1;
|
| - });
|
| -
|
| - // This is the javascript code that processes the template:
|
| - var input = new JsEvalContext(extensionsData);
|
| - var output = $('extensionTemplate');
|
| - jstProcess(input, output);
|
| -
|
| - // Hook up the handlers now that the template is processed.
|
| - $('load-extension').addEventListener('click', loadExtension);
|
| - $('show-pack-dialog').addEventListener('click', showPackDialog);
|
| - $('auto-update').addEventListener('click', autoUpdate);
|
| -
|
| - addHandlerByClass('developer-mode-image', 'click', toggleDeveloperMode);
|
| - addHandlerByClass('developer-mode-link', 'click', toggleDeveloperMode);
|
| - addHandlerByClass('extension-path', 'click', selectExtensionPath);
|
| - addHandlerByClass('private-key-path', 'click', selectPrivateKeyPath);
|
| - addHandlerByClass('pack-extension', 'click', packExtension);
|
| - addHandlerByClass('hide-pack-dialog', 'click', hidePackDialog);
|
| - addHandlerByClass('options-url', 'click', handleOptions);
|
| - addHandlerByClass('reload-extension', 'click', handleReloadExtension);
|
| - addHandlerByClass('disable-extension', 'click', handleDisableExtension);
|
| - addHandlerByClass('enable-extension', 'click', handleEnableExtension);
|
| - addHandlerByClass('uninstall-extension', 'click', handleUninstallExtension);
|
| - addHandlerByClass('show-button', 'click', handleShowButton);
|
| - addHandlerByClass('inspect-message', 'click', handleInspectMessage);
|
| - addHandlerByClass('toggle-incognito', 'change',
|
| - handleToggleExtensionIncognito);
|
| - addHandlerByClass('file-access', 'change',
|
| - handleToggleAllowFileAccess);
|
| -}
|
| -
|
| -/**
|
| - * Asks the C++ ExtensionDOMHandler to get details about the installed
|
| - * extensions and return detailed data about the configuration. The
|
| - * ExtensionDOMHandler should reply to returnExtensionsData() (below).
|
| - */
|
| -function requestExtensionsData() {
|
| - chrome.send('requestExtensionsData', []);
|
| -}
|
| -
|
| -// Used for observing function of the backend datasource for this page by
|
| -// tests.
|
| -var webui_responded_ = false;
|
| -
|
| -// Used to only do some work the first time we render.
|
| -var rendered_once_ = false;
|
| -
|
| -/**
|
| - * Called by the web_ui_ to re-populate the page with data representing
|
| - * the current state of installed extensions.
|
| - */
|
| -function returnExtensionsData(extensionsData){
|
| - webui_responded_ = true;
|
| - devModeExpanded = extensionsData.developerMode;
|
| -
|
| - var bodyContainer = $('body-container');
|
| - var body = document.body;
|
| -
|
| - // Set all page content to be visible so we can measure heights.
|
| - bodyContainer.style.visibility = 'hidden';
|
| - body.className = '';
|
| - var slidables = document.getElementsByClassName('showInDevMode');
|
| - for (var i = 0; i < slidables.length; i++)
|
| - slidables[i].style.height = 'auto';
|
| -
|
| - renderTemplate(extensionsData);
|
| -
|
| - // Explicitly set the height for each element that wants to be 'slid' in and
|
| - // out when the devModeExpanded is toggled.
|
| - var slidables = document.getElementsByClassName('showInDevMode');
|
| - for (var i = 0; i < slidables.length; i++)
|
| - slidables[i].style.height = slidables[i].offsetHeight + 'px';
|
| -
|
| - // Hide all the incognito warnings that are attached to the wrong extension
|
| - // ID, which can happen when an extension is added or removed.
|
| - var warnings = document.getElementsByClassName('incognitoWarning');
|
| - for (var i = 0; i < warnings.length; i++) {
|
| - var extension = warnings[i];
|
| - while (extension.className != "extension")
|
| - extension = extension.parentNode;
|
| -
|
| - if (extension.extensionId != warnings[i].attachedExtensionId) {
|
| - warnings[i].style.display = "none";
|
| - warnings[i].style.opacity = "0";
|
| - }
|
| - }
|
| -
|
| - // Reset visibility of page based on the current dev mode.
|
| - $('collapse').style.display = devModeExpanded ? 'inline' : 'none';
|
| - $('expand').style.display = devModeExpanded ? 'none' : 'inline';
|
| - bodyContainer.style.visibility = 'visible';
|
| - body.className = devModeExpanded ?
|
| - 'showDevModeInitial' : 'hideDevModeInitial';
|
| -
|
| - if (rendered_once_)
|
| - return;
|
| -
|
| - // Blech, JSTemplate always inserts the strings as text, which is usually a
|
| - // feature, but in this case it contains HTML that we want to be rendered.
|
| - var elm = $('try-gallery');
|
| - if (elm)
|
| - elm.innerHTML = elm.textContent;
|
| -
|
| - elm = $('get-moar-extensions');
|
| - if (elm)
|
| - elm.innerHTML = elm.textContent;
|
| -
|
| - rendered_once_ = true;
|
| -}
|
| -
|
| -/**
|
| - * Tell the C++ ExtensionDOMHandler to inspect the page detailed in |viewData|.
|
| - */
|
| -function handleInspectMessage(event) {
|
| - // TODO(aa): This is ghetto, but WebUIBindings doesn't support sending
|
| - // anything other than arrays of strings, and this is all going to get
|
| - // replaced with V8 extensions soon anyway.
|
| - chrome.send('inspect', [
|
| - String(this.extensionView.renderProcessId),
|
| - String(this.extensionView.renderViewId)
|
| - ]);
|
| - event.preventDefault();
|
| -}
|
| -
|
| -/**
|
| - * Handles a 'reload' link getting clicked.
|
| - */
|
| -function handleReloadExtension(event) {
|
| - // Tell the C++ ExtensionDOMHandler to reload the extension.
|
| - chrome.send('reload', [this.extensionId]);
|
| - event.preventDefault();
|
| -}
|
| -
|
| -/**
|
| - * Handles a 'disable' link getting clicked.
|
| - */
|
| -function handleDisableExtension(event) {
|
| - sendEnableExtension(this, false);
|
| - event.preventDefault();
|
| -}
|
| -
|
| -/**
|
| - * Handles an 'enable' link getting clicked.
|
| - */
|
| -function handleEnableExtension(event) {
|
| - sendEnableExtension(this, true);
|
| - event.preventDefault();
|
| -}
|
| -
|
| -/**
|
| - * Peforms the actual work to enable or disable an extension.
|
| - */
|
| -function sendEnableExtension(node, enable) {
|
| - // Tell the C++ ExtensionDOMHandler to reload the extension.
|
| - chrome.send('enable', [node.extensionId, String(enable)]);
|
| - requestExtensionsData();
|
| -}
|
| -
|
| -/**
|
| - * Handles the 'enableIncognito' checkbox getting changed.
|
| - */
|
| -function handleToggleExtensionIncognito(event) {
|
| - var warning = this;
|
| -
|
| - while (warning.className != "extension")
|
| - warning = warning.parentNode;
|
| -
|
| - warning = warning.getElementsByClassName("incognitoWarning")[0];
|
| - if (!this.checked) {
|
| - warning.style.display = "none";
|
| - warning.style.opacity = "0";
|
| - } else {
|
| - warning.attachedExtensionId = this.extensionId;
|
| - warning.style.display = "block";
|
| -
|
| - // Must set the opacity later. Otherwise, the fact that the display is
|
| - // changing causes the animation to not happen.
|
| - window.setTimeout(function() {
|
| - warning.style.opacity = "1";
|
| - }, 0);
|
| - }
|
| -
|
| - chrome.send('enableIncognito', [this.extensionId, String(this.checked)]);
|
| - event.preventDefault();
|
| -}
|
| -
|
| -/**
|
| - * Handles the 'allowFileAccess' checkbox getting changed.
|
| - */
|
| -function handleToggleAllowFileAccess(event) {
|
| - chrome.send('allowFileAccess', [this.extensionId, String(this.checked)]);
|
| - event.preventDefault();
|
| -}
|
| -
|
| -/**
|
| - * Handles an 'uninstall' link getting clicked.
|
| - */
|
| -function handleUninstallExtension(event) {
|
| - chrome.send('uninstall', [this.extensionId]);
|
| - event.preventDefault();
|
| -}
|
| -
|
| -/**
|
| - * Handles an 'options' link getting clicked.
|
| - */
|
| -function handleOptions(event) {
|
| - chrome.send('options', [this.extensionId]);
|
| - event.preventDefault();
|
| -}
|
| -
|
| -/**
|
| -* Handles a 'show button' link getting clicked.
|
| -*/
|
| -function handleShowButton(event) {
|
| - chrome.send('showButton', [this.extensionId]);
|
| - event.preventDefault();
|
| -}
|
| -
|
| -/**
|
| -* 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.
|
| -*/
|
| -function showFileDialog(selectType, operation, callback) {
|
| - handleFilePathSelected = function(filePath) {
|
| - callback(filePath);
|
| - handleFilePathSelected = function() {};
|
| - };
|
| -
|
| - chrome.send('selectFilePath', [selectType, operation]);
|
| -}
|
| -
|
| -/**
|
| - * Handles the "Load extension..." button being pressed.
|
| - */
|
| -function loadExtension() {
|
| - showFileDialog('folder', 'load', function(filePath) {
|
| - chrome.send('load', [String(filePath)]);
|
| - });
|
| -}
|
| -
|
| -/**
|
| - * Handles the "Pack extension..." button being pressed.
|
| - */
|
| -function packExtension() {
|
| - var extensionPath = $('extensionPathText').value;
|
| - var privateKeyPath = $('privateKeyPath').value;
|
| - chrome.send('pack', [extensionPath, privateKeyPath]);
|
| -}
|
| -
|
| -/**
|
| - * Shows to modal HTML pack dialog.
|
| - */
|
| -function showPackDialog() {
|
| - $('dialogBackground').style.display = '-webkit-box';
|
| -}
|
| -
|
| -/**
|
| - * Hides the pack dialog.
|
| - */
|
| -function hidePackDialog() {
|
| - $('dialogBackground').style.display = 'none'
|
| -}
|
| -
|
| -/*
|
| - * Toggles visibility of the developer mode.
|
| - */
|
| -function toggleDeveloperMode() {
|
| - toggleDevModeExpanded();
|
| -
|
| - $('collapse').style.display = devModeExpanded ? 'inline' : 'none';
|
| - $('expand').style.display = devModeExpanded ? 'none' : 'inline';
|
| -
|
| - document.body.className =
|
| - devModeExpanded ? 'showDevMode' : 'hideDevMode';
|
| -}
|
| -
|
| -/**
|
| - * Pop up a select dialog to capture the extension path.
|
| - */
|
| -function selectExtensionPath() {
|
| - showFileDialog('folder', 'packRoot', function(filePath) {
|
| - $('extensionPathText').value = filePath;
|
| - });
|
| -}
|
| -
|
| -/**
|
| - * Pop up a select dialog to capture the private key path.
|
| - */
|
| -function selectPrivateKeyPath() {
|
| - showFileDialog('file', 'pem', function(filePath) {
|
| - $('privateKeyPath').value = filePath;
|
| - });
|
| -}
|
| -
|
| -/**
|
| - * Handles the "Update extensions now" button being pressed.
|
| - */
|
| -function autoUpdate() {
|
| - chrome.send('autoupdate', []);
|
| -}
|
| -
|
| -/**
|
| - * Convenience routine to hook up nodes duplicated by jstemplate to
|
| - * event handlers using the class attribute to identify the set of nodes.
|
| - */
|
| -function addHandlerByClass(name, event, handler) {
|
| - var elements = document.getElementsByClassName(name);
|
| - for (var i = 0; i < elements.length; ++i) {
|
| - elements[i].addEventListener(event, handler);
|
| - }
|
| -}
|
| -
|
| -document.addEventListener('DOMContentLoaded', requestExtensionsData);
|
|
|