# all files / lighthouse-core/lib/ icons.js

95.45% Statements 21/22
91.67% Branches 11/12
100% Functions 2/2
95.24% Lines 20/21

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70

    1×
    17×

    17×
    3×

    14×
    3×

    11×

    1×

    18×
    25×
    18×

    18×

    36×

    30×

    29×

    29×

    29×

    29×
    29×

    1×

     /**
     * @license
     * Copyright 2016 Google Inc. All Rights Reserved.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    'use strict';

    /**
     * @param {!Manifest=} manifest
     * @return {boolean} Does the manifest have any icons?
     */
    function doExist(manifest) {
      Iif (!manifest || !manifest.icons) {
        return false;
      }
      if (!manifest.icons.value) {
        return false;
      }
      if (manifest.icons.value.length === 0) {
        return false;
      }
      return true;
    }

    /**
     * @param {number} sizeRequirement
     * @param {!Manifest} manifest
     * @return {!Array<string>} Value of satisfactory sizes (eg. ['192x192', '256x256'])
     */
    function sizeAtLeast(sizeRequirement, manifest) {
      // An icon can be provided for a single size, or for multiple sizes.
      // To handle both, we flatten all found sizes into a single array.
      const iconValues = /** @type {!Array<!ManifestImageNode>} */ (manifest.icons.value);
      const nestedSizes = iconValues.map(icon => icon.value.sizes.value);
      const flattenedSizes = [].concat.apply([], nestedSizes);

      return flattenedSizes
          // First, filter out any undefined values, in case an icon was defined without a size
          .filter(size => typeof size === 'string')
          // discard sizes that are not AAxBB (eg. "any")
          .filter(size => /\d+x\d+/.test(size))
          .filter(size => {
            // Split the '24x24' strings into ['24','24'] arrays
            const sizeStrs = size.split(/x/i);
            // Cast the ['24','24'] strings into [24,24] numbers
            const sizeNums = [parseFloat(sizeStrs[0]), parseFloat(sizeStrs[1])];
            // Only keep sizes that are as big as our required size
            const areIconsBigEnough = sizeNums[0] >= sizeRequirement && sizeNums[1] >= sizeRequirement;
            // Square is required: https://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/manifest/manifest_icon_selector.cc&q=ManifestIconSelector::IconSizesContainsBiggerThanMinimumSize&sq=package:chromium
            const areIconsSquare = sizeNums[0] === sizeNums[1];
            return areIconsBigEnough && areIconsSquare;
          });
    }

    module.exports = {
      doExist,
      sizeAtLeast
    };