| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 | /** * @licstart The following is the entire license notice for the * Javascript code in this page * * Copyright 2021 Mozilla Foundation * * 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. * * @licend The above is the entire license notice for the * Javascript code in this page */"use strict";Object.defineProperty(exports, "__esModule", {  value: true});exports.OptionalContentConfig = void 0;var _util = require("../shared/util.js");class OptionalContentGroup {  constructor(name, intent) {    this.visible = true;    this.name = name;    this.intent = intent;  }}class OptionalContentConfig {  constructor(data) {    this.name = null;    this.creator = null;    this._order = null;    this._groups = new Map();    if (data === null) {      return;    }    this.name = data.name;    this.creator = data.creator;    this._order = data.order;    for (const group of data.groups) {      this._groups.set(group.id, new OptionalContentGroup(group.name, group.intent));    }    if (data.baseState === "OFF") {      for (const group of this._groups) {        group.visible = false;      }    }    for (const on of data.on) {      this._groups.get(on).visible = true;    }    for (const off of data.off) {      this._groups.get(off).visible = false;    }  }  _evaluateVisibilityExpression(array) {    const length = array.length;    if (length < 2) {      return true;    }    const operator = array[0];    for (let i = 1; i < length; i++) {      const element = array[i];      let state;      if (Array.isArray(element)) {        state = this._evaluateVisibilityExpression(element);      } else if (this._groups.has(element)) {        state = this._groups.get(element).visible;      } else {        (0, _util.warn)(`Optional content group not found: ${element}`);        return true;      }      switch (operator) {        case "And":          if (!state) {            return false;          }          break;        case "Or":          if (state) {            return true;          }          break;        case "Not":          return !state;        default:          return true;      }    }    return operator === "And";  }  isVisible(group) {    if (group.type === "OCG") {      if (!this._groups.has(group.id)) {        (0, _util.warn)(`Optional content group not found: ${group.id}`);        return true;      }      return this._groups.get(group.id).visible;    } else if (group.type === "OCMD") {      if (group.expression) {        return this._evaluateVisibilityExpression(group.expression);      }      if (!group.policy || group.policy === "AnyOn") {        for (const id of group.ids) {          if (!this._groups.has(id)) {            (0, _util.warn)(`Optional content group not found: ${id}`);            return true;          }          if (this._groups.get(id).visible) {            return true;          }        }        return false;      } else if (group.policy === "AllOn") {        for (const id of group.ids) {          if (!this._groups.has(id)) {            (0, _util.warn)(`Optional content group not found: ${id}`);            return true;          }          if (!this._groups.get(id).visible) {            return false;          }        }        return true;      } else if (group.policy === "AnyOff") {        for (const id of group.ids) {          if (!this._groups.has(id)) {            (0, _util.warn)(`Optional content group not found: ${id}`);            return true;          }          if (!this._groups.get(id).visible) {            return true;          }        }        return false;      } else if (group.policy === "AllOff") {        for (const id of group.ids) {          if (!this._groups.has(id)) {            (0, _util.warn)(`Optional content group not found: ${id}`);            return true;          }          if (this._groups.get(id).visible) {            return false;          }        }        return true;      }      (0, _util.warn)(`Unknown optional content policy ${group.policy}.`);      return true;    }    (0, _util.warn)(`Unknown group type ${group.type}.`);    return true;  }  setVisibility(id, visible = true) {    if (!this._groups.has(id)) {      (0, _util.warn)(`Optional content group not found: ${id}`);      return;    }    this._groups.get(id).visible = !!visible;  }  getOrder() {    if (!this._groups.size) {      return null;    }    if (this._order) {      return this._order.slice();    }    return Array.from(this._groups.keys());  }  getGroups() {    return this._groups.size > 0 ? (0, _util.objectFromMap)(this._groups) : null;  }  getGroup(id) {    return this._groups.get(id) || null;  }}exports.OptionalContentConfig = OptionalContentConfig;
 |