chromium/chrome/browser/resources/extensions/item.html

<style include="iron-flex cr-shared-style cr-hidden-style cr-icons action-link
    shared-style">
  .bounded-text,
  .multiline-clippable-text,
  .clippable-flex-text {
    /** Ensure that the text does not overflow its container. */
    overflow: hidden;
    text-overflow: ellipsis;
  }

  .bounded-text,
  .clippable-flex-text {
    white-space: nowrap;
  }

  .clippable-flex-text {
    /**
     * These labels can be arbitrarily long. We want to ensure that these
     * shrink, rather than the neighboring content.
     */
    flex-shrink: 1;
  }

  cr-tooltip-icon {
    margin-inline-end: 8px;
  }

  #icon-wrapper {
    align-self: flex-start;
    display: flex;
    padding: 6px;
    position: relative;
  }

  #icon {
    height: 36px;
    width: 36px;
  }

  #card {
    background-color: var(--cr-card-background-color);
    border-radius: var(--cr-card-border-radius);
    box-shadow: var(--cr-card-shadow);
    display: flex;
    flex-direction: column;
    height: var(--extensions-card-height);
    /* Duration matches --drawer-transition from toolbar.html. */
    transition: height 300ms cubic-bezier(.25, .1, .25, 1);
  }

  #card.dev-mode {
    height: 208px;
  }

  #main {
    display: flex;
    flex: 1;
    min-height: 0;
    padding: 16px 20px;
  }

  #content {
    display: flex;
    flex: 1;
    flex-direction: column;
    margin-inline-start: 24px;
    overflow: hidden;
  }

  #name-and-version {
    color: var(--cr-primary-text-color);
    margin-bottom: 4px;
  }

  #name {
    margin-inline-end: 8px;
  }

  #description {
    flex: 1;
  }

  #warnings {
    color: var(--error-color);
    flex: 1;
    margin-bottom: 8px;
  }

  #allowlist-warning {
    flex: 1;
    margin-bottom: 8px;
  }

  .message-icon {
    height: 18px;
    margin-inline-end: 4px;
    vertical-align: top;
    width: 18px;
  }

  #warnings .message-icon {
    --iron-icon-fill-color: var(--error-color);
  }

  #allowlist-warning .message-icon {
    --iron-icon-fill-color: var(--warning-color);
  }

  #extension-id {
    flex-shrink: 0;
  }

  #inspect-views {
    display: flex;
    white-space: nowrap;
  }

  #inspect-views > span {
    margin-inline-end: 4px;
  }

  #button-strip {
    box-sizing: border-box;
    flex-shrink: 0;
    height: var(--cr-section-min-height);
    padding-bottom: 8px;
    padding-inline-end: 20px;
    padding-top: 8px;
  }

  #button-strip cr-button {
    margin-inline-start: 8px;
  }

  #source-indicator {
    margin-inline-start: 24px;
    margin-top: 24px;
    position: absolute;
  }

  .source-icon-wrapper {
    align-items: center;
    background: rgb(241, 89, 43);  /* Same in light & dark modes. */
    border-radius: 50%;  /* 50% border radius === a circle */
    box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.22),
                0 2px 2px 0 rgba(0, 0, 0, 0.12);
    display: flex;
    height: 22px;
    justify-content: center;
    width: 22px;
  }

  #source-indicator iron-icon {
    color: white;
    height: 16px;
    width: 16px;
  }

  cr-tooltip {
    --paper-tooltip-min-width: 0;
  }

  #errors-button {
    color: var(--error-color);
  }

  #dev-reload-button {
    margin-inline-end: 12px;
  }

  #blocklisted-warning:empty {
    display: none;
  }

  #a11yAssociation {
    height: 0;
    overflow: hidden;
  }
</style>
<!-- Invisible instead of hidden because VoiceOver refuses to read text of
  element that's hidden when referenced by an aria label.  Unfortunately,
  this text can be found by Ctrl + F because it isn't hidden. -->
<div id="a11yAssociation" aria-hidden="true">
  [[a11yAssociation(data.name)]]
</div>
<div id="card" class$="[[computeClasses_(data.state, inDevMode)]]">
  <div id="main">
    <div id="icon-wrapper">
      <img id="icon" src="[[data.iconUrl]]"
          aria-describedby="a11yAssociation" alt="">
      <template is="dom-if"
          if="[[computeSourceIndicatorIcon_(data.*)]]">
        <div id="source-indicator">
          <div class="source-icon-wrapper" role="img"
              aria-describedby="a11yAssociation"
              aria-label$="[[computeSourceIndicatorText_(data.*)]]">
            <iron-icon icon="[[computeSourceIndicatorIcon_(data.*)]]">
            </iron-icon>
          </div>
        </div>
      </template>
    </div>
    <!-- This needs to be separate from the source-indicator since it can't
         be contained inside of a position:relative parent element. -->
    <template is="dom-if"
        if="[[computeSourceIndicatorIcon_(data.*)]]">
      <cr-tooltip id="source-indicator-text" for="source-indicator"
          position="top" fit-to-visible-bounds aria-hidden="true">
        [[computeSourceIndicatorText_(data.*)]]
      </cr-tooltip>
    </template>
    <div id="content">
      <!--Note: We wrap inspect-views in a div so that the outer div
          doesn't shrink (because it's not display: flex).-->
      <div>
        <div id="name-and-version" class="layout horizontal center">
          <div id="name" role="heading" aria-level="3"
              class="clippable-flex-text">[[data.name]]</div>
          <span id="version" class="cr-secondary-text" hidden$="[[!inDevMode]]">
            [[data.version]]
          </span>
        </div>
      </div>
      <div id="description" class="cr-secondary-text multiline-clippable-text"
          hidden$="[[!showDescription_(data.disableReasons.*, data.*)]]">
        [[data.description]]
      </div>
      <template is="dom-if"
          if="[[showSevereWarnings(data.disableReasons.*, data.*)]]">
        <div id="warnings">
          <iron-icon class="message-icon" icon="cr:error"></iron-icon>
          <span id="runtime-warnings" aria-describedby="a11yAssociation"
              hidden$="[[!data.runtimeWarnings.length]]">
            <template is="dom-repeat" items="[[data.runtimeWarnings]]">
              [[item]]
            </template>
          </span>
          <span id="suspicious-warning" aria-describedby="a11yAssociation"
              hidden$="[[!data.disableReasons.suspiciousInstall]]">
            $i18n{itemSuspiciousInstall}
            <a target="_blank" href="$i18n{suspiciousInstallHelpUrl}"
                aria-label="$i18n{itemSuspiciousInstallLearnMore}">
              $i18n{learnMore}
            </a>
          </span>
          <span id="corrupted-warning" aria-describedby="a11yAssociation"
              hidden$="[[!data.disableReasons.corruptInstall]]">
            $i18n{itemCorruptInstall}
          </span>
          <span id="blocklisted-warning"><!-- No whitespace
            -->[[data.blocklistText]]<!-- so we can use :empty in css.
         --></span>
        </div>
      </template>
      <template is="dom-if"
          if="[[showMv2DeprecationWarning_(data.disableReasons.*, data.*)]]">
          <div id="warnings">
            <iron-icon class="message-icon" icon="cr:error"></iron-icon>
            <span id="mv2-deprecation-warning"
                aria-describedby="a11yAssociation">
              $i18n{mv2DeprecationUnsupportedExtensionOffText}
            </span>
          </div>
      </template>
      <template is="dom-if"
          if="[[showAllowlistWarning_(data.disableReasons.*, data.*)]]">
        <div id="allowlist-warning">
          <iron-icon class="message-icon"
              icon="extensions-icons:safebrowsing_warning">
          </iron-icon>
          <span class="cr-secondary-text" aria-describedby="a11yAssociation">
            $i18n{itemAllowlistWarning}
            <a href="$i18n{enhancedSafeBrowsingWarningHelpUrl}" target="_blank"
                aria-label="$i18n{itemAllowlistWarningLearnMoreLabel}">
              $i18n{learnMore}
            </a>
          </span>
        </div>
      </template>
      <template is="dom-if" if="[[inDevMode]]">
        <div id="extension-id" class="bounded-text cr-secondary-text">
          [[data.id]]
        </div>
        <template is="dom-if"
            if="[[!computeInspectViewsHidden_(data.views)]]">
          <!--Note: We wrap inspect-views in a div so that the outer div
              doesn't shrink (because it's not display: flex).-->
          <div>
            <div id="inspect-views" class="cr-secondary-text">
              <span aria-describedby="a11yAssociation">
                $i18n{itemInspectViews}
              </span>
              <a class="clippable-flex-text" is="action-link"
                  title="[[computeFirstInspectTitle_(firstInspectView_)]]"
                  on-click="onInspectClick_">
                [[computeFirstInspectLabel_(firstInspectView_)]]
              </a>
              <a is="action-link"
                  hidden$="[[computeExtraViewsHidden_(data.views)]]"
                  on-click="onExtraInspectClick_">
                &nbsp;[[computeExtraInspectLabel_(data.views)]]
              </a>
            </div>
          </div>
        </template>
      </template>
    </div>
  </div>
  <div id="button-strip" class="layout horizontal center cr-secondary-text">
    <div class="layout flex horizontal center">
      <cr-button id="detailsButton" on-click="onDetailsClick_"
          aria-describedby="a11yAssociation">
        $i18n{itemDetails}
      </cr-button>
      <cr-button id="removeButton" on-click="onRemoveClick_"
          aria-describedby="a11yAssociation"
          hidden="[[data.mustRemainInstalled]]">
        $i18n{remove}
      </cr-button>
      <template is="dom-if" if="[[shouldShowErrorsButton_(data.*)]]">
        <cr-button id="errors-button" on-click="onErrorsClick_"
            aria-describedby="a11yAssociation">
          $i18n{itemErrors}
        </cr-button>
      </template>
    </div>
    <template is="dom-if" if="[[!computeDevReloadButtonHidden_(data.*)]]">
      <cr-icon-button id="dev-reload-button" class="icon-refresh no-overlap"
          title="$i18n{itemReload}" aria-label="$i18n{itemReload}"
          aria-describedby="a11yAssociation" on-click="onReloadClick_">
      </cr-icon-button>
    </template>
    <template is="dom-if"
        if="[[showRepairButton_(data.disableReasons.corruptInstall)]]">
      <cr-button id="repair-button" class="action-button"
          aria-describedby="a11yAssociation" on-click="onRepairClick_">
        $i18n{itemRepair}
      </cr-button>
    </template>
    <template is="dom-if" if="[[showReloadButton_(data.state)]]">
      <cr-button id="terminated-reload-button" on-click="onReloadClick_"
          aria-describedby="a11yAssociation" class="action-button">
        $i18n{itemReload}
      </cr-button>
    </template>
    <cr-tooltip-icon id="parentDisabledPermissionsToolTip"
        hidden$="[[!data.disableReasons.parentDisabledPermissions]]"
        tooltip-text="$i18n{parentDisabledPermissions}"
        icon-class="cr20:kite"
        icon-aria-label="$i18n{parentDisabledPermissions}">
    </cr-tooltip-icon>
    <cr-tooltip id="enable-toggle-tooltip" for="enableToggle" position="left"
        aria-hidden="true" animation-delay="0" fit-to-visible-bounds>
      [[getEnableToggleTooltipText_(data.*)]]
    </cr-tooltip>
    <cr-toggle id="enableToggle"
        aria-label$="[[getEnableToggleAriaLabel_(data.*)]]"
        aria-describedby="a11yAssociation enable-toggle-tooltip"
        checked="[[isEnabled_(data.state)]]"
        on-change="onEnableToggleChange_"
        disabled$="[[!isEnableToggleEnabled_(data.*)]]"
        hidden$="[[!showEnableToggle_(data.*)]]">
    </cr-toggle>
  </div>
</div>