Html程序  |  671行  |  20.03 KB

<!DOCTYPE HTML>
<html i18n-values="dir:textdirection;">
<head>
<meta charset="utf-8">
<title i18n-content="pluginsTitle"></title>
<style>
body {
  margin: 10px;
  min-width: 47em;
}

a {
  color: blue;
  font-size: 103%;
}

div#header {
  margin-bottom: 1.05em;
  /* 67px is the height of the header's background image. */
  min-height: 67px;
  overflow: hidden;
  padding-bottom: 20px;
  -webkit-padding-start: 0;
  padding-top: 20px;
  position: relative;
  box-sizing: border-box;
}

#header h1 {
  background: url('../../app/theme/extensions_section.png') 0px 20px no-repeat;
  display: inline;
  margin: 0;
  padding-bottom: 43px;
  padding-left: 75px;
  padding-top: 40px;
}

html[dir=rtl] #header h1 {
  background: url('../../app/theme/extensions_section.png') right no-repeat;
  padding-right: 95px;
  padding-left: 0;
}

h1 {
  font-size: 156%;
  font-weight: bold;
  padding: 0;
  margin: 0;
}

div.content {
  font-size: 88%;
  margin-top: 5px;
}

.section-header {
  background: #ebeff9;
  border-top: 1px solid #b5c7de;
  font-size: 99%;
  padding-bottom: 2px;
  -webkit-padding-start: 5px;
  padding-top: 3px;
  width: 100%;
}

.section-header > table tr td:first-child {
  width: 100%;
}

.section-header > table {
  width: 100%;
}

.section-header-title {
  font-weight: bold;
}

.vbox-container {
  display: -webkit-box;
  -webkit-box-orient: vertical;
}

.wbox {
  display: -webkit-box;
  -webkit-box-align: stretch;
  -webkit-box-flex: 1;
}

#top {
  -webkit-padding-end: 5px;
}

.showInTmiMode {
  overflow: hidden;
}

body.hideTmiModeInitial .showInTmiMode {
  height: 0 !important;
  opacity: 0;
}

body.hideTmiMode .showInTmiMode {
  height: 0 !important;
  opacity: 0;
  -webkit-transition: all .1s ease-out;
}

body.showTmiModeInitial .showInTmiMode {
  opacity: 1;
}

body.showTmiMode .showInTmiMode {
  opacity: 1;
  -webkit-transition: all .1s ease-in;
}

.wbox-tmi-mode {
  -webkit-box-align: stretch;
  -webkit-box-flex: 1;
}

.tmi-mode-image {
  margin-top: 2px;
  padding-left: 5px;
  padding-right: 5px;
}

.tmi-mode-link {
  margin-right: 3px;
  white-space: nowrap;
}

.tmi-mode-link a {
  font-size: 97%;
}

.tmi-mode {
  background: #f4f6fc;
  border-bottom: 1px solid #edeff5;
  font-size: 89%;
  padding-bottom: 0.8em;
  -webkit-padding-start: 10px;
  padding-top: 0.8em;
  width: 100%;
}

.plugin-disabled > td {
  background-color: #f0f0f0;
  color: #a0a0a0;
  padding-bottom: 4px;
  padding-top: 5px;
}

.plugin-enabled > td {
  padding-bottom: 4px;
  padding-top: 5px;
}

.plugin-file-disabled {
  background-color: #f0f0f0;
  color: #a0a0a0;
  padding-top: 5px;
  padding-bottom: 5px;
}

.plugin-file-enabled {
  padding-top: 5px;
  padding-bottom: 5px;
}

.plugin {
  border-bottom: 1px solid #cdcdcd;
}

.critical {
  color: red;
}

/* Indent the text related to each plug-in. */
.plugin-text {
  -webkit-padding-start: 5px;
}

.plugin-name {
  font-weight: bold;
}

.no-plugins {
  margin: 6em 0 0;
  text-align: center;
  font-size: 1.2em;
}

/* Use tables for layout, so eliminate extra spacing. */
.plugin-details table {
  -webkit-border-horizontal-spacing: 0;
  -webkit-border-vertical-spacing: 0;
}

.plugin-details {
  -webkit-padding-start: 1em;
}

/* Separate the inital line, Description, Location, and MIME Types lines. */
.plugin-details > div {
  padding-top: 0.1em
}

/* Align rows of tables along the top. */
.plugin-details tr {
  vertical-align: top;
}

/* Separate columns by 1em for the most part. */
.plugin-details td+td {
  -webkit-padding-start: 1em;
}

/* Make the MIME Types tables smaller. */
.plugin-details .mime-types {
  font-size: 95%;
}

/* Separate the header from the contents in each MIME Types table. */
.plugin-details .mime-types .header td {
  padding-bottom: 0.1em;
  border-bottom: 1px solid;
}

/* Separate the columns for tables used for horizontal listings only a bit. */
.hlisting td+td {
  -webkit-padding-start: 0.4em;
}

/* Match the indentation of .plugin-text. */
.plugin-actions {
  -webkit-padding-start: 5px;
  margin-top: 0.2em;
  margin-bottom: 0.2em;
}

button {
  font-size: 104%;
}

</style>
<script>

/**
 * This variable structure is here to document the structure that the template
 * expects to correctly populate the page.
 */
var pluginDataFormat = {
  'plugins': [
    {
      'name': 'Group Name',
      'description': 'description',
      'version': 'version',
      'update_url': 'http://update/',
      'critical': true,
      'enabled': true,
      'plugin_files': [
        {
          'path': '/blahblah/blahblah/MyCrappyPlugin.plugin',
          'name': 'MyCrappyPlugin',
          'version': '1.2.3',
          'description': 'My crappy plugin',
          'mimeTypes': [
            { 'description': 'Foo Media',
              'fileExtensions': [ 'foo' ],
              'mimeType': 'application/x-my-foo' },
            { 'description': 'Bar Stuff',
              'fileExtensions': [ 'bar','baz' ],
              'mimeType': 'application/my-bar' }
          ],
          'enabledMode': 'enabledByUser'
        },
        {
          'path': '/tmp/MyFirst.plugin',
          'name': 'MyFirstPlugin',
          'version': '3.14r15926',
          'description': 'My first plugin',
          'mimeTypes': [
            { 'description': 'New Guy Media',
              'fileExtensions': [ 'mfp' ],
              'mimeType': 'application/x-my-first' }
          ],
          'enabledMode': 'enabledByPolicy'
        },
        {
          'path': '/foobar/baz/YourGreatPlugin.plugin',
          'name': 'YourGreatPlugin',
          'version': '4.5',
          'description': 'Your great plugin',
          'mimeTypes': [
            { 'description': 'Baz Stuff',
              'fileExtensions': [ 'baz' ],
              'mimeType': 'application/x-your-baz' }
          ],
          'enabledMode': 'disabledByUser'
        },
        {
          'path': '/foobiz/bar/HisGreatPlugin.plugin',
          'name': 'HisGreatPlugin',
          'version': '1.2',
          'description': 'His great plugin',
          'mimeTypes': [
            { 'description': 'More baz Stuff',
              'fileExtensions': [ 'bor' ],
              'mimeType': 'application/x-his-bor' }
          ],
          'enabledMode': 'disabledByPolicy'
        }
      ]
    }
  ]
};

/**
 * Takes the |pluginsData| input argument which represents data about the
 * currently installed/running plugins and populates the html jstemplate with
 * that data. It expects an object structure like the above.
 * @param {Object} pluginsData Detailed info about installed plugins
 */
function renderTemplate(pluginsData) {
  // This is the javascript code that processes the template:
  var input = new JsEvalContext(pluginsData);
  var output = document.getElementById('pluginTemplate');
  jstProcess(input, output);
}

/**
 * Asks the C++ PluginsDOMHandler to get details about the installed plugins and
 * return detailed data about the configuration. The PluginsDOMHandler should
 * reply to returnPluginsData() (below).
 */
function requestPluginsData() {
  chrome.send('requestPluginsData', []);
  chrome.send('getShowDetails', []);
}

function loadShowDetailsFromPrefs(show_details) {
  tmiModeExpanded = show_details;
  document.getElementById('collapse').style.display =
      show_details ? 'inline' : 'none';
  document.getElementById('expand').style.display =
      show_details ? 'none' : 'inline';

  document.body.className =
      show_details ? 'showTmiMode' : 'hideTmiMode';
}

/**
 * Asks the C++ PluginsDOMHandler to show the terms of service (about:terms).
 */
function showTermsOfService() {
  chrome.send('showTermsOfService', []);
}

/**
 * Called by the web_ui_ to re-populate the page with data representing the
 * current state of installed plugins.
 */
function returnPluginsData(pluginsData){
  var bodyContainer = document.getElementById('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('showInTmiMode');
  for (var i = 0; i < slidables.length; i++)
    slidables[i].style.height = 'auto';

  renderTemplate(pluginsData);

  // Make sure the left column (with "Description:", "Location:", etc.) is the
  // same size for all plugins.
  var labels = document.getElementsByClassName('plugin-details-label');
  var maxLabelWidth = 0;
  for (var i = 0; i < labels.length; i++)
    labels[i].style.width = 'auto';
  for (var i = 0; i < labels.length; i++)
    maxLabelWidth = Math.max(maxLabelWidth, labels[i].offsetWidth);
  for (var i = 0; i < labels.length; i++)
    labels[i].style.width = maxLabelWidth + 'px';

  // Explicitly set the height for each element that wants to be "slid" in and
  // out when the tmiModeExpanded is toggled.
  var slidables = document.getElementsByClassName('showInTmiMode');
  for (var i = 0; i < slidables.length; i++)
    slidables[i].style.height = slidables[i].offsetHeight + 'px';

  // Reset visibility of page based on the current tmi mode.
  document.getElementById('collapse').style.display =
     tmiModeExpanded ? 'inline' : 'none';
  document.getElementById('expand').style.display =
     tmiModeExpanded ? 'none' : 'inline';
  bodyContainer.style.visibility = 'visible';
  body.className = tmiModeExpanded ?
     'showTmiModeInitial' : 'hideTmiModeInitial';
}

/**
 * Handles a 'enable' or 'disable' button getting clicked.
 */
function handleEnablePlugin(node, enable, isGroup) {
  // Tell the C++ PluginsDOMHandler to enable/disable the plugin.
  chrome.send('enablePlugin', [String(node.path), String(enable),
              String(isGroup)]);
}

// Keeps track of whether details have been made visible (expanded) or not.
var tmiModeExpanded = false;

/*
 * Toggles visibility of details.
 */
function toggleTmiMode() {
  tmiModeExpanded = !tmiModeExpanded;

  document.getElementById('collapse').style.display =
      tmiModeExpanded ? 'inline' : 'none';
  document.getElementById('expand').style.display =
      tmiModeExpanded ? 'none' : 'inline';

  document.body.className =
      tmiModeExpanded ? 'showTmiMode' : 'hideTmiMode';

  chrome.send('saveShowDetailsToPrefs', [String(tmiModeExpanded)]);
}

/**
 * Determines whether a plugin's version should be displayed.
 */
function shouldDisplayPluginVersion(plugin) {
  return !!plugin.version && plugin.version != '0';
}

/**
 * Determines whether a plugin's description should be displayed.
 */
function shouldDisplayPluginDescription(plugin) {
  // Only display the description if it's not blank and if it's not just the
  // name, version, or combination thereof.
  return plugin.description &&
         plugin.description != plugin.name &&
         plugin.description != plugin.version &&
         plugin.description != 'Version ' + plugin.version &&
         plugin.description != plugin.name + ' ' + plugin.version;
}

/**
 * Determines whether a plugin is enabled or not.
 */
function isPluginEnabled(plugin) {
  return plugin.enabledMode == 'enabledByUser' ||
         plugin.enabledMode == 'enabledByPolicy';
}

// Unfortunately, we don't have notifications for plugin (list) status changes
// (yet), so in the meanwhile just update regularly.
setInterval(requestPluginsData, 30000);

// Get data and have it displayed upon loading.
document.addEventListener('DOMContentLoaded', requestPluginsData);

</script>
</head>
<body i18n-values=".style.fontFamily:fontfamily;.style.fontSize:fontsize">
<div id="body-container" style="visibility:hidden">

  <div id="header"><h1 i18n-content="pluginsTitle">TITLE</h1></div>

  <div id="pluginTemplate">

    <div id="container" class="vbox-container">
    <div id="top" class="wbox">

      <div class="section-header">
        <table cellpadding="0" cellspacing="0"><tr valign="center">
          <td>
            <span class="section-header-title" i18n-content="pluginsTitle"
              >TITLE</span>
            <span class="section-header-title"
                  jsdisplay="plugins.length > 0">(<span
                  jscontent="plugins.length"></span>)</span>
          </td>
          <td width="18">
            <img id="collapse" class="tmi-mode-image"
                 style="display:none" onclick="toggleTmiMode();"
                 src="shared/images/minus.png">
            <img id="expand" class="tmi-mode-image"
                 onclick="toggleTmiMode();" src="shared/images/plus.png">
          </td>
          <td>
            <div class="tmi-mode-link">
              <a onclick="toggleTmiMode();" style="cursor: default"
                 i18n-content="pluginsDetailsModeLink">DETAILS</a>
            </div>
          </td>
        </tr></table>
      </div>

    </div>
    </div>

    <div class="content">
      <div class="plugin-name no-plugins" jsdisplay="plugins.length === 0">
        <div i18n-content="noPlugins">NO_PLUGINS_ARE_INSTALLED</div>
      </div>

      <div jsdisplay="plugins.length > 0">
      <div class="plugin" jsselect="plugins">
        <table width="100%" cellpadding="2" cellspacing="0">
        <tr jsvalues=
            ".className:isPluginEnabled($this) ? 'plugin-enabled' : 'plugin-disabled'">
        <td valign="top">
          <div class="plugin-text">
            <div>
              <span class="plugin-name" dir="ltr"
                    jscontent="name">NAME</span>
              <span jsdisplay="plugin_files.length > 1"
                  jscontent="'(' + plugin_files.length +' files)'">(x)</span>
              <span jsdisplay="shouldDisplayPluginVersion($this)">
                - <span i18n-content="pluginVersion">VERSION</span>
                <span jsvalues=".className:critical? 'critical': ''"
                    dir="ltr" jscontent="version">x.x.x.x</span>
              </span>
              <a jsdisplay="critical" jsvalues=".href:update_url"
                    i18n-content="pluginDownload">DOWNLOAD UPDATE</a>
              <span jsdisplay="enabledMode == 'disabledByUser'"
                    i18n-content="pluginDisabled">(DISABLED)</span>
              <span jsdisplay="enabledMode == 'disabledByPolicy'"
                    i18n-content="pluginDisabledByPolicy">(DISABLED_BY_POLICY)</span>
              <span jsdisplay="enabledMode == 'enabledByPolicy'"
                    i18n-content="pluginEnabledByPolicy">(ENABLED_BY_POLICY)</span>
              <div jsdisplay="shouldDisplayPluginDescription($this)">
                <span dir="ltr" jsvalues=".innerHTML:description">
              </div>
            </div>
            <div jsselect="plugin_files" class="plugin-details">
              <div class="showInTmiMode">
                <div jsvalues=
                  ".className:isPluginEnabled($this) ? 'plugin-file-enabled' : 'plugin-file-disabled'">
                  <div><table><tr>
                    <td class="plugin-details-label"
                        i18n-content="pluginName">NAME:</td>
                    <td><span dir="ltr" jscontent="name">NAME</span></td>
                  </tr></table></div>
                  <div><table>
                    <tr jsdisplay="shouldDisplayPluginDescription($this)">
                      <td class="plugin-details-label"
                          i18n-content="pluginDescription">DESCRIPTION:</td>
                      <td>
                        <span dir="ltr" jsvalues=".innerHTML:description">
                      </td>
                    </tr>
                  </table></div>
                  <div><table><tr>
                    <td class="plugin-details-label"
                        i18n-content="pluginVersion">VERSION:</td>
                    <td><span dir="ltr" jscontent="version">x.x.x.x</span></td>
                  </tr></table></div>
                  <div><table><tr>
                    <td class="plugin-details-label"
                        i18n-content="pluginPath">PATH:</td>
                    <td><span dir="ltr" jscontent="path"></span></td>
                  </tr></table></div>
                  <div><table><tr>
                    <td class="plugin-details-label">&nbsp;</td>
                    <td>
                      <span jsdisplay="enabledMode == 'disabledByUser'"
                          i18n-content="pluginDisabled">(DISABLED)</span>
                      <span jsdisplay="enabledMode == 'disabledByPolicy'"
                          i18n-content="pluginDisabledByPolicy">(DISABLED_BY_POLICY)</span>
                      <span jsdisplay="enabledMode == 'enabledByPolicy'"
                          i18n-content="pluginEnabledByPolicy">(ENABLED_BY_POLICY)</span>
                      <span>
                        <a
                          jsvalues=".path:path"
                          jsdisplay="enabledMode == 'enabledByUser'"
                          onclick="handleEnablePlugin(this, false, false)"
                          href="javascript:void(0);"
                          i18n-content="disable"
                          >DISABLE</a>
                        <a
                          jsvalues=".path:path"
                          jsdisplay="enabledMode == 'disabledByUser'"
                          onclick="handleEnablePlugin(this, true, false)"
                          href="javascript:void(0);"
                          i18n-content="enable"
                          >ENABLE</a>
                        <span
                          jsdisplay="enabledMode == 'enabledByPolicy'"
                          i18n-content="pluginCannotBeDisabledDueToPolicy"
                          >CANNOT_DISABLE</span>
                        <span
                          jsdisplay="enabledMode == 'disabledByPolicy'"
                          i18n-content="pluginCannotBeEnabledDueToPolicy"
                          >CANNOT_ENABLE</span>
                      </span>
                    </td>
                  </tr></table></div>
                  <table><tr jsdisplay="mimeTypes.length > 0">
                    <td class="plugin-details-label"
                        i18n-content="pluginMimeTypes">MIME_TYPES:</td>
                    <td><table width="100%" class="mime-types">
                      <tr class="header">
                        <td i18n-content="pluginMimeTypesMimeType"
                            >MIME type</td>
                        <td i18n-content="pluginMimeTypesDescription"
                            >DESCRIPTION</td>
                        <td i18n-content="pluginMimeTypesFileExtensions"
                            >FILE_EXTENSIONS</td>
                      </tr>
                      <tr jsselect="mimeTypes">
                        <td><span dir="ltr"
                                  jscontent="mimeType"></span></td>
                        <td><span dir="ltr"
                                  jsvalues=".innerHTML:description"></span></td>
                        <td><table jsdisplay="fileExtensions.length > 0"
                                   class="hlisting">
                          <tr><td jsselect="fileExtensions">
                            <span dir="ltr" jscontent="'.' + $this">
                          </td></tr>
                        </table></td>
                      </tr>
                    </table></td>
                  </tr></table>
                </div>
              </div>
            </div>
          </div>
          <div class="plugin-actions">
            <span>
              <a
                jsvalues=".path:name"
                jsdisplay="enabledMode == 'enabledByUser'"
                onclick="handleEnablePlugin(this, false, true)"
                href="javascript:void(0);"
                i18n-content="disable"
                >DISABLE</a>
              <a
                jsvalues=".path:name"
                jsdisplay="enabledMode == 'disabledByUser'"
                onclick="handleEnablePlugin(this, true, true)"
                href="javascript:void(0);"
                i18n-content="enable"
                >ENABLE</a>
              <span
                jsdisplay="enabledMode == 'enabledByPolicy'"
                i18n-content="pluginCannotBeDisabledDueToPolicy"
                >CANNOT_DISABLE</span>
              <span
                jsdisplay="enabledMode == 'disabledByPolicy'"
                i18n-content="pluginCannotBeEnabledDueToPolicy"
                >CANNOT_ENABLE</span>
            </span>
          </div>
        </td>
        </tr>
        </table>
      </div>
      </div>
    </div>
  </div>
</div>
</body>
</html>