summaryrefslogtreecommitdiff
path: root/Source/WebCore/Modules/modern-media-controls/controls/icon-service.js
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/Modules/modern-media-controls/controls/icon-service.js')
-rw-r--r--Source/WebCore/Modules/modern-media-controls/controls/icon-service.js102
1 files changed, 102 insertions, 0 deletions
diff --git a/Source/WebCore/Modules/modern-media-controls/controls/icon-service.js b/Source/WebCore/Modules/modern-media-controls/controls/icon-service.js
new file mode 100644
index 000000000..417e9f51d
--- /dev/null
+++ b/Source/WebCore/Modules/modern-media-controls/controls/icon-service.js
@@ -0,0 +1,102 @@
+/*
+ * 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 : "airplay",
+ AirplayPlacard : "airplay-placard",
+ EnterFullscreen : "enter-fullscreen",
+ EnterPiP : "pip-in",
+ ExitFullscreen : "exit-fullscreen",
+ Forward : "forward",
+ InvalidPlacard : "invalid-placard",
+ Pause : "pause",
+ PiPPlacard : "pip-placard",
+ Play : "play",
+ Rewind : "rewind",
+ ScaleToFill : "scale-to-fill",
+ ScaleToFit : "scale-to-fit",
+ SkipBack : "interval-skip-back",
+ Start : "start",
+ Tracks : "media-selection",
+ Volume : "volume",
+ VolumeDown : "volume-down",
+ VolumeMuted : "volume-mute",
+ VolumeUp : "volume-up"
+};
+
+const IconsWithFullscreenVariants = [Icons.Airplay, Icons.Tracks, Icons.Pause, Icons.EnterPiP, Icons.Play, Icons.VolumeDown, Icons.VolumeUp];
+const IconsWithCompactVariants = [Icons.Play, Icons.Pause, Icons.SkipBack, Icons.Volume, Icons.VolumeMuted, Icons.EnterFullscreen];
+
+const iconService = new class IconService {
+
+ constructor()
+ {
+ this.images = {};
+ }
+
+ // Public
+
+ imageForIconNameAndLayoutTraits(iconName, layoutTraits)
+ {
+ const [fileName, platform] = this._fileNameAndPlatformForIconNameAndLayoutTraits(iconName, layoutTraits);
+ const path = `${platform}/${fileName}.png`;
+
+ let image = this.images[path];
+ if (image)
+ return image;
+
+ image = this.images[path] = new Image;
+
+ if (this.mediaControlsHost)
+ image.src = "data:image/png;base64," + this.mediaControlsHost.base64StringForIconAndPlatform(fileName, platform);
+ else
+ image.src = `${this.directoryPath}/${path}`;
+
+ return image;
+ }
+
+ // Private
+
+ _fileNameAndPlatformForIconNameAndLayoutTraits(iconName, 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.";
+
+ if (layoutTraits & LayoutTraits.Fullscreen && IconsWithFullscreenVariants.includes(iconName))
+ iconName += "-fullscreen";
+ else if (layoutTraits & LayoutTraits.Compact && IconsWithCompactVariants.includes(iconName))
+ iconName += "-compact";
+
+ const fileName = `${iconName}@${window.devicePixelRatio}x`;
+
+ return [fileName, platform];
+ }
+
+};