text: /*
   * Copyright (C) 2016 Apple Inc. All Rights Reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in the
   *    documentation and/or other materials provided with the distribution.
   *
   * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
   * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
   * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */
  
  const Icons = {
      Airplay         : { name: "Airplay", type: "svg", label: UIString("AirPlay") },
      AirplayPlacard  : { name: "airplay-placard", type: "png", label: UIString("AirPlay") },
      EnterFullscreen : { name: "EnterFullscreen", type: "svg", label: UIString("Enter Full Screen") },
      EnterPiP        : { name: "PipIn", type: "svg", label: UIString("Enter Picture in Picture") },
      ExitFullscreen  : { name: "ExitFullscreen", type: "svg", label: UIString("Exit Full Screen") },
      Forward         : { name: "Forward", type: "svg", label: UIString("Forward") },
      InvalidPlacard  : { name: "invalid-placard", type: "png", label: UIString("Invalid") },
      Pause           : { name: "Pause", type: "svg", label: UIString("Pause") },
      PiPPlacard      : { name: "pip-placard", type: "png", label: UIString("Picture in Picture") },
      Play            : { name: "Play", type: "svg", label: UIString("Play") },
      Rewind          : { name: "Rewind", type: "svg", label: UIString("Rewind") },
      SkipBack        : { name: "SkipBack15", type: "svg", label: UIString("Skip Back 15 seconds") },
      SkipForward     : { name: "SkipForward15", type: "svg", label: UIString("Skip Forward 15 seconds") },
      Tracks          : { name: "MediaSelector", type: "svg", label: UIString("Media Selection") },
      Volume          : { name: "VolumeHi", type: "svg", label: UIString("Mute") },
      VolumeRTL       : { name: "VolumeHi-RTL", type: "svg", label: UIString("Mute") },
      VolumeDown      : { name: "VolumeLo", type: "svg", label: UIString("Volume Down") },
      VolumeMuted     : { name: "Mute", type: "svg", label: UIString("Unmute") },
      VolumeMutedRTL  : { name: "Mute-RTL", type: "svg", label: UIString("Unmute") },
      VolumeUp        : { name: "VolumeHi", type: "svg", label: UIString("Volume Up") }
  };
  
  const MimeTypes = {
      "png": "image/png",
      "svg": "image/svg+xml"
  };
  
  const IconsWithFullscreenVariants = [Icons.Airplay, Icons.Tracks, Icons.EnterPiP];
  
  const iconService = new class IconService {
  
      constructor()
      {
          this.images = {};
      }
  
      // Public
  
      imageForIconAndLayoutTraits(icon, layoutTraits)
      {
          const [fileName, platform] = this._fileNameAndPlatformForIconAndLayoutTraits(icon, layoutTraits);
          const path = `${platform}/${fileName}.${icon.type}`;
  
          let image = this.images[path];
          if (image)
              return image;
  
          image = this.images[path] = new Image;
  
          if (this.mediaControlsHost)
              image.src = `data:${MimeTypes[icon.type]};base64,${this.mediaControlsHost.base64StringForIconNameAndType(fileName, icon.type)}`;
          else
              image.src = `${this.directoryPath}/${path}`;
  
          return image;
      }
  
      // Private
  
      _fileNameAndPlatformForIconAndLayoutTraits(icon, layoutTraits)
      {
          let platform;
          if (layoutTraits & LayoutTraits.macOS)
              platform = "macOS";
          else if (layoutTraits & LayoutTraits.iOS)
              platform = "iOS";
          else
              throw "Could not identify icon's platform from layout traits.";
  
          let iconName = icon.name;
          if (layoutTraits & LayoutTraits.macOS && layoutTraits & LayoutTraits.Fullscreen && IconsWithFullscreenVariants.includes(icon))
              iconName += "-fullscreen";
  
          let fileName = iconName;
          if (icon.type === "png")
              fileName = `${iconName}@${window.devicePixelRatio}x`;
  
          return [fileName, platform];
      }
  
  };
  