1e484b35bSopenharmony_ci/*
2e484b35bSopenharmony_ci * Licensed to the Apache Software Foundation (ASF) under one
3e484b35bSopenharmony_ci * or more contributor license agreements.  See the NOTICE file
4e484b35bSopenharmony_ci * distributed with this work for additional information
5e484b35bSopenharmony_ci * regarding copyright ownership.  The ASF licenses this file
6e484b35bSopenharmony_ci * to you under the Apache License, Version 2.0 (the
7e484b35bSopenharmony_ci * "License"); you may not use this file except in compliance
8e484b35bSopenharmony_ci * with the License.  You may obtain a copy of the License at
9e484b35bSopenharmony_ci *
10e484b35bSopenharmony_ci *   http://www.apache.org/licenses/LICENSE-2.0
11e484b35bSopenharmony_ci *
12e484b35bSopenharmony_ci * Unless required by applicable law or agreed to in writing,
13e484b35bSopenharmony_ci * software distributed under the License is distributed on an
14e484b35bSopenharmony_ci * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15e484b35bSopenharmony_ci * KIND, either express or implied.  See the License for the
16e484b35bSopenharmony_ci * specific language governing permissions and limitations
17e484b35bSopenharmony_ci * under the License.
18e484b35bSopenharmony_ci */
19e484b35bSopenharmony_ci/*
20e484b35bSopenharmony_ci * 2021.01.08 - Reconstruct the class 'Vm' and make it more adaptable to framework.
21e484b35bSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
22e484b35bSopenharmony_ci */
23e484b35bSopenharmony_ci
24e484b35bSopenharmony_ci/**
25e484b35bSopenharmony_ci * @fileOverview
26e484b35bSopenharmony_ci * ViewModel Constructor & definition
27e484b35bSopenharmony_ci */
28e484b35bSopenharmony_ci
29e484b35bSopenharmony_ciimport {
30e484b35bSopenharmony_ci  extend,
31e484b35bSopenharmony_ci  Log,
32e484b35bSopenharmony_ci  removeItem
33e484b35bSopenharmony_ci} from '../../utils/index';
34e484b35bSopenharmony_ciimport {
35e484b35bSopenharmony_ci  initState,
36e484b35bSopenharmony_ci  initBases
37e484b35bSopenharmony_ci} from '../reactivity/state';
38e484b35bSopenharmony_ciimport {
39e484b35bSopenharmony_ci  build, FragBlockInterface
40e484b35bSopenharmony_ci} from './compiler';
41e484b35bSopenharmony_ciimport {
42e484b35bSopenharmony_ci  set,
43e484b35bSopenharmony_ci  del
44e484b35bSopenharmony_ci} from '../reactivity/observer';
45e484b35bSopenharmony_ciimport {
46e484b35bSopenharmony_ci  watch,
47e484b35bSopenharmony_ci  initPropsToData
48e484b35bSopenharmony_ci} from './pageLife';
49e484b35bSopenharmony_ciimport {
50e484b35bSopenharmony_ci  initEvents,
51e484b35bSopenharmony_ci  ExternalEvent,
52e484b35bSopenharmony_ci  Evt
53e484b35bSopenharmony_ci} from './events';
54e484b35bSopenharmony_ciimport {
55e484b35bSopenharmony_ci  selector
56e484b35bSopenharmony_ci} from './selector';
57e484b35bSopenharmony_ciimport Page from '../page/index';
58e484b35bSopenharmony_ciimport Element from '../../vdom/Element';
59e484b35bSopenharmony_ciimport {
60e484b35bSopenharmony_ci  ComputedInterface,
61e484b35bSopenharmony_ci  cssType,
62e484b35bSopenharmony_ci  Props,
63e484b35bSopenharmony_ci  VmOptions,
64e484b35bSopenharmony_ci  MediaStatusInterface,
65e484b35bSopenharmony_ci  ExternalBindingInterface
66e484b35bSopenharmony_ci} from './vmOptions';
67e484b35bSopenharmony_ciimport {
68e484b35bSopenharmony_ci  hasOwn
69e484b35bSopenharmony_ci} from '../util/shared';
70e484b35bSopenharmony_ci
71e484b35bSopenharmony_ci/**
72e484b35bSopenharmony_ci * VM constructor.
73e484b35bSopenharmony_ci * @param {string} type - Type.
74e484b35bSopenharmony_ci * @param {null | VmOptions} options - Component options.
75e484b35bSopenharmony_ci * @param {Vm} parentVm   which contains __app.
76e484b35bSopenharmony_ci * @param {Element | FragBlockInterface} parentEl - root element or frag block.
77e484b35bSopenharmony_ci * @param {Object} mergedData - External data.
78e484b35bSopenharmony_ci * @param {ExternalEvent} externalEvents - External events.
79e484b35bSopenharmony_ci */
80e484b35bSopenharmony_ciexport default class Vm {
81e484b35bSopenharmony_ci  private $app: any;
82e484b35bSopenharmony_ci  private __methods: Record<string, (...args: unknown[]) => any>;
83e484b35bSopenharmony_ci  private __type: string;
84e484b35bSopenharmony_ci  private __css: cssType;
85e484b35bSopenharmony_ci  private __vmOptions: VmOptions;
86e484b35bSopenharmony_ci  private __parent: Vm;
87e484b35bSopenharmony_ci  private __realParent: Vm;
88e484b35bSopenharmony_ci  private __computed: ComputedInterface;
89e484b35bSopenharmony_ci  private __selector: object;
90e484b35bSopenharmony_ci  private __parentEl: Element | FragBlockInterface;
91e484b35bSopenharmony_ci  private __app: Page;
92e484b35bSopenharmony_ci  private __shareData: any;
93e484b35bSopenharmony_ci  private __data: any;
94e484b35bSopenharmony_ci  private __props: Props;
95e484b35bSopenharmony_ci  private __init: boolean;
96e484b35bSopenharmony_ci  private __valid: boolean;
97e484b35bSopenharmony_ci  private __visible: boolean;
98e484b35bSopenharmony_ci  private __ready: boolean;
99e484b35bSopenharmony_ci  private __rootEl: Element;
100e484b35bSopenharmony_ci  private __ids: Record<string, {vm: Vm, el: Element}>;
101e484b35bSopenharmony_ci  private __vmEvents: object;
102e484b35bSopenharmony_ci  private __childrenVms: Vm[];
103e484b35bSopenharmony_ci  private __externalBinding: ExternalBindingInterface;
104e484b35bSopenharmony_ci  private readonly __descriptor: string;
105e484b35bSopenharmony_ci  private __isHide: boolean;
106e484b35bSopenharmony_ci  private __mediaStatus: Partial<MediaStatusInterface<string, boolean>>;
107e484b35bSopenharmony_ci  public $refs: Record<string, Element>;
108e484b35bSopenharmony_ci  private __slotContext: { content: Record<string, any>, parentVm: Vm };
109e484b35bSopenharmony_ci  private __counterMapping = new Map();
110e484b35bSopenharmony_ci
111e484b35bSopenharmony_ci  constructor(
112e484b35bSopenharmony_ci    type: string,
113e484b35bSopenharmony_ci    options: null | VmOptions,
114e484b35bSopenharmony_ci    parentVm: Vm | any,
115e484b35bSopenharmony_ci    parentEl: Element | FragBlockInterface,
116e484b35bSopenharmony_ci    mergedData: object,
117e484b35bSopenharmony_ci    externalEvents: ExternalEvent
118e484b35bSopenharmony_ci  ) {
119e484b35bSopenharmony_ci    this.$app = global.aceapp;
120e484b35bSopenharmony_ci    this.__parent = parentVm.__realParent ? parentVm.__realParent : parentVm;
121e484b35bSopenharmony_ci    this.__app = parentVm.__app;
122e484b35bSopenharmony_ci    parentVm.__childrenVms && parentVm.__childrenVms.push(this);
123e484b35bSopenharmony_ci
124e484b35bSopenharmony_ci    if (!options && this.__app.customComponentMap) {
125e484b35bSopenharmony_ci      options = this.__app.customComponentMap[type];
126e484b35bSopenharmony_ci    }
127e484b35bSopenharmony_ci    const data = options.data || {};
128e484b35bSopenharmony_ci    const shareData = options.shareData || {};
129e484b35bSopenharmony_ci    this.__vmOptions = options;
130e484b35bSopenharmony_ci    this.__computed = options.computed;
131e484b35bSopenharmony_ci    this.__css = options.style || {};
132e484b35bSopenharmony_ci    this.__selector = selector(this.__css);
133e484b35bSopenharmony_ci    this.__ids = {};
134e484b35bSopenharmony_ci    this.$refs = {};
135e484b35bSopenharmony_ci    this.__vmEvents = {};
136e484b35bSopenharmony_ci    this.__childrenVms = [];
137e484b35bSopenharmony_ci    this.__type = type;
138e484b35bSopenharmony_ci    this.__valid = true;
139e484b35bSopenharmony_ci    this.__props = [];
140e484b35bSopenharmony_ci    this.__methods = {};
141e484b35bSopenharmony_ci
142e484b35bSopenharmony_ci    // Bind events and lifecycles.
143e484b35bSopenharmony_ci    initEvents(this, externalEvents);
144e484b35bSopenharmony_ci
145e484b35bSopenharmony_ci    Log.debug(
146e484b35bSopenharmony_ci      `'_innerInit' lifecycle in Vm(${this.__type}) and mergedData = ${JSON.stringify(mergedData)}.`
147e484b35bSopenharmony_ci    );
148e484b35bSopenharmony_ci    this.$emit('hook:_innerInit');
149e484b35bSopenharmony_ci    this.__data = (typeof data === 'function' ? data.apply(this) : data) || {};
150e484b35bSopenharmony_ci    this.__shareData = (typeof shareData === 'function' ? shareData.apply(this) : shareData) || {};
151e484b35bSopenharmony_ci    this.__descriptor = options._descriptor;
152e484b35bSopenharmony_ci    if (global.aceapp && global.aceapp.i18n && global.aceapp.i18n.extend) {
153e484b35bSopenharmony_ci      global.aceapp.i18n.extend(this);
154e484b35bSopenharmony_ci    }
155e484b35bSopenharmony_ci    if (global.aceapp && global.aceapp.dpi && global.aceapp.dpi.extend) {
156e484b35bSopenharmony_ci      global.aceapp.dpi.extend(this);
157e484b35bSopenharmony_ci    }
158e484b35bSopenharmony_ci
159e484b35bSopenharmony_ci    // MergedData means extras params.
160e484b35bSopenharmony_ci    if (mergedData) {
161e484b35bSopenharmony_ci      if (hasOwn(mergedData, 'paramsData') && hasOwn(mergedData, 'dontOverwrite') && mergedData['dontOverwrite'] === false) {
162e484b35bSopenharmony_ci        dataAccessControl(this, mergedData['paramsData'], this.__app.options && this.__app.options.appCreate);
163e484b35bSopenharmony_ci        extend(this._data, mergedData['paramsData']);
164e484b35bSopenharmony_ci      } else {
165e484b35bSopenharmony_ci        dataAccessControl(this, mergedData, this.__app.options && this.__app.options.appCreate);
166e484b35bSopenharmony_ci        extend(this._data, mergedData);
167e484b35bSopenharmony_ci      }
168e484b35bSopenharmony_ci    }
169e484b35bSopenharmony_ci
170e484b35bSopenharmony_ci    initPropsToData(this);
171e484b35bSopenharmony_ci    initState(this);
172e484b35bSopenharmony_ci    initBases(this);
173e484b35bSopenharmony_ci    Log.debug(`"onInit" lifecycle in Vm(${this.__type})`);
174e484b35bSopenharmony_ci
175e484b35bSopenharmony_ci    if (mergedData && hasOwn(mergedData, 'paramsData') && hasOwn(mergedData, 'dontOverwrite')) {
176e484b35bSopenharmony_ci      if (mergedData['dontOverwrite'] === false) {
177e484b35bSopenharmony_ci        this.$emit('hook:onInit');
178e484b35bSopenharmony_ci      } else {
179e484b35bSopenharmony_ci        this.$emitDirect('hook:onInit', mergedData['paramsData']);
180e484b35bSopenharmony_ci      }
181e484b35bSopenharmony_ci    } else {
182e484b35bSopenharmony_ci      this.$emit('hook:onInit');
183e484b35bSopenharmony_ci    }
184e484b35bSopenharmony_ci
185e484b35bSopenharmony_ci    if (!this.__app.doc) {
186e484b35bSopenharmony_ci      return;
187e484b35bSopenharmony_ci    }
188e484b35bSopenharmony_ci    this.__mediaStatus = {};
189e484b35bSopenharmony_ci    this.__mediaStatus.orientation = this.__app.options.orientation;
190e484b35bSopenharmony_ci    this.__mediaStatus.width = this.__app.options.width;
191e484b35bSopenharmony_ci    this.__mediaStatus.height = this.__app.options.height;
192e484b35bSopenharmony_ci    this.__mediaStatus.resolution = this.__app.options.resolution;
193e484b35bSopenharmony_ci    this.__mediaStatus['device-type'] = this.__app.options['device-type'];
194e484b35bSopenharmony_ci    this.__mediaStatus['aspect-ratio'] = this.__app.options['aspect-ratio'];
195e484b35bSopenharmony_ci    this.__mediaStatus['device-width'] = this.__app.options['device-width'];
196e484b35bSopenharmony_ci    this.__mediaStatus['device-height'] = this.__app.options['device-height'];
197e484b35bSopenharmony_ci    this.__mediaStatus['round-screen'] = this.__app.options['round-screen'];
198e484b35bSopenharmony_ci    this.__mediaStatus['dark-mode'] = this.__app.options['dark-mode'];
199e484b35bSopenharmony_ci
200e484b35bSopenharmony_ci    // If there is no parentElement, specify the documentElement.
201e484b35bSopenharmony_ci    this.__parentEl = parentEl || this.__app.doc.documentElement;
202e484b35bSopenharmony_ci    build(this);
203e484b35bSopenharmony_ci  }
204e484b35bSopenharmony_ci
205e484b35bSopenharmony_ci  /**
206e484b35bSopenharmony_ci   * Get the element by id.
207e484b35bSopenharmony_ci   * @param {string | number} [id] - Element id.
208e484b35bSopenharmony_ci   * @return {Element} Element object. if get null, return root element.
209e484b35bSopenharmony_ci   */
210e484b35bSopenharmony_ci  public $element(id?: string | number): Element {
211e484b35bSopenharmony_ci    if (id) {
212e484b35bSopenharmony_ci      if (typeof id !== 'string' && typeof id !== 'number') {
213e484b35bSopenharmony_ci        Log.warn(`Invalid parameter type: The type of 'id' should be string or number, not ${typeof id}.`);
214e484b35bSopenharmony_ci        return;
215e484b35bSopenharmony_ci      }
216e484b35bSopenharmony_ci      const info: any = this._ids[id];
217e484b35bSopenharmony_ci      if (info) {
218e484b35bSopenharmony_ci        return info.el;
219e484b35bSopenharmony_ci      }
220e484b35bSopenharmony_ci    } else {
221e484b35bSopenharmony_ci      return this.__rootEl;
222e484b35bSopenharmony_ci    }
223e484b35bSopenharmony_ci  }
224e484b35bSopenharmony_ci
225e484b35bSopenharmony_ci  /**
226e484b35bSopenharmony_ci   * Get the vm by id.
227e484b35bSopenharmony_ci   * @param {string} id - Vm id.
228e484b35bSopenharmony_ci   * @return {Vm} Vm object.
229e484b35bSopenharmony_ci   */
230e484b35bSopenharmony_ci  public $vm(id: string): Vm {
231e484b35bSopenharmony_ci    const info = this._ids[id];
232e484b35bSopenharmony_ci    if (info) {
233e484b35bSopenharmony_ci      return info.vm;
234e484b35bSopenharmony_ci    }
235e484b35bSopenharmony_ci  }
236e484b35bSopenharmony_ci
237e484b35bSopenharmony_ci  /**
238e484b35bSopenharmony_ci   * Get parent Vm of current.
239e484b35bSopenharmony_ci   */
240e484b35bSopenharmony_ci  public $parent(): Vm {
241e484b35bSopenharmony_ci    return this._parent;
242e484b35bSopenharmony_ci  }
243e484b35bSopenharmony_ci
244e484b35bSopenharmony_ci  /**
245e484b35bSopenharmony_ci   * Get child Vm of current.
246e484b35bSopenharmony_ci   */
247e484b35bSopenharmony_ci  public $child(id: string): Vm {
248e484b35bSopenharmony_ci    if (typeof id !== 'string') {
249e484b35bSopenharmony_ci      Log.warn(`Invalid parameter type: The type of 'id' should be string, not ${typeof id}.`);
250e484b35bSopenharmony_ci      return;
251e484b35bSopenharmony_ci    }
252e484b35bSopenharmony_ci    return this.$vm(id);
253e484b35bSopenharmony_ci  }
254e484b35bSopenharmony_ci
255e484b35bSopenharmony_ci  /**
256e484b35bSopenharmony_ci   * Get root element of current.
257e484b35bSopenharmony_ci   */
258e484b35bSopenharmony_ci  public $rootElement(): Element {
259e484b35bSopenharmony_ci    return this.__rootEl;
260e484b35bSopenharmony_ci  }
261e484b35bSopenharmony_ci
262e484b35bSopenharmony_ci  /**
263e484b35bSopenharmony_ci   * Get root Vm of current.
264e484b35bSopenharmony_ci   */
265e484b35bSopenharmony_ci  public $root(): Vm {
266e484b35bSopenharmony_ci    return getRoot(this);
267e484b35bSopenharmony_ci  }
268e484b35bSopenharmony_ci
269e484b35bSopenharmony_ci  /**
270e484b35bSopenharmony_ci   * Execution Method.
271e484b35bSopenharmony_ci   * @param {string} type - Type.
272e484b35bSopenharmony_ci   * @param {Object} [detail] - May needed for Evt.
273e484b35bSopenharmony_ci   * @param {*} args - Arg list.
274e484b35bSopenharmony_ci   * @return {*}
275e484b35bSopenharmony_ci   */
276e484b35bSopenharmony_ci  public $emit(type: string, detail?: object, ...args: any[]): any[] {
277e484b35bSopenharmony_ci    if (typeof type !== 'string') {
278e484b35bSopenharmony_ci      Log.warn(`Invalid parameter type: The type of 'type' should be string, not ${typeof type}.`);
279e484b35bSopenharmony_ci      return;
280e484b35bSopenharmony_ci    }
281e484b35bSopenharmony_ci    const events = this.__vmEvents;
282e484b35bSopenharmony_ci    const handlerList = events[type];
283e484b35bSopenharmony_ci    if (handlerList) {
284e484b35bSopenharmony_ci      const results = [];
285e484b35bSopenharmony_ci      const evt = new Evt(type, detail);
286e484b35bSopenharmony_ci      handlerList.forEach((handler) => {
287e484b35bSopenharmony_ci        results.push(handler.call(this, evt, ...args));
288e484b35bSopenharmony_ci      });
289e484b35bSopenharmony_ci      return results;
290e484b35bSopenharmony_ci    }
291e484b35bSopenharmony_ci  }
292e484b35bSopenharmony_ci
293e484b35bSopenharmony_ci  /**
294e484b35bSopenharmony_ci   * Execution Method directly.
295e484b35bSopenharmony_ci   * @param {string} type - Type.
296e484b35bSopenharmony_ci   * @param {*} args - Arg list.
297e484b35bSopenharmony_ci   * @return {*}
298e484b35bSopenharmony_ci   */
299e484b35bSopenharmony_ci  public $emitDirect(type: string, ...args: any[]): any[] {
300e484b35bSopenharmony_ci    if (typeof type !== 'string') {
301e484b35bSopenharmony_ci      Log.warn(`Invalid parameter type: The type of 'type' should be string, not ${typeof type}.`);
302e484b35bSopenharmony_ci      return;
303e484b35bSopenharmony_ci    }
304e484b35bSopenharmony_ci    const events = this.__vmEvents;
305e484b35bSopenharmony_ci    const handlerList = events[type];
306e484b35bSopenharmony_ci    if (handlerList) {
307e484b35bSopenharmony_ci      const results = [];
308e484b35bSopenharmony_ci      handlerList.forEach((handler) => {
309e484b35bSopenharmony_ci        results.push(handler.call(this, ...args));
310e484b35bSopenharmony_ci      });
311e484b35bSopenharmony_ci      return results;
312e484b35bSopenharmony_ci    }
313e484b35bSopenharmony_ci  }
314e484b35bSopenharmony_ci
315e484b35bSopenharmony_ci  /**
316e484b35bSopenharmony_ci   * Dispatch events, passing upwards along the parent.
317e484b35bSopenharmony_ci   * @param {string} type - Type.
318e484b35bSopenharmony_ci   * @param {Object} [detail] - May needed for Evt.
319e484b35bSopenharmony_ci   */
320e484b35bSopenharmony_ci  public $dispatch(type: string, detail?: object): void {
321e484b35bSopenharmony_ci    if (typeof type !== 'string') {
322e484b35bSopenharmony_ci      Log.warn(`Invalid parameter type: The type of 'type' should be string, not ${typeof type}.`);
323e484b35bSopenharmony_ci      return;
324e484b35bSopenharmony_ci    }
325e484b35bSopenharmony_ci    const evt = new Evt(type, detail);
326e484b35bSopenharmony_ci    this.$emit(type, evt);
327e484b35bSopenharmony_ci    if (!evt.hasStopped() && this.__parent && this.__parent.$dispatch) {
328e484b35bSopenharmony_ci      this.__parent.$dispatch(type, evt);
329e484b35bSopenharmony_ci    }
330e484b35bSopenharmony_ci  }
331e484b35bSopenharmony_ci
332e484b35bSopenharmony_ci  /**
333e484b35bSopenharmony_ci   * Broadcast event, which is passed down the subclass.
334e484b35bSopenharmony_ci   * @param {string} type - Type.
335e484b35bSopenharmony_ci   * @param {Object} [detail] - May be needed for Evt.
336e484b35bSopenharmony_ci   */
337e484b35bSopenharmony_ci  public $broadcast(type: string, detail?: object): void {
338e484b35bSopenharmony_ci    if (typeof type !== 'string') {
339e484b35bSopenharmony_ci      Log.warn(`Invalid parameter type: The type of 'type' should be string, not ${typeof type}.`);
340e484b35bSopenharmony_ci      return;
341e484b35bSopenharmony_ci    }
342e484b35bSopenharmony_ci    const evt = new Evt(type, detail);
343e484b35bSopenharmony_ci    this.$emit(type, evt);
344e484b35bSopenharmony_ci    if (!evt.hasStopped() && this.__childrenVms) {
345e484b35bSopenharmony_ci      this.__childrenVms.forEach((subVm) => {
346e484b35bSopenharmony_ci        subVm.$broadcast(type, evt);
347e484b35bSopenharmony_ci      });
348e484b35bSopenharmony_ci    }
349e484b35bSopenharmony_ci  }
350e484b35bSopenharmony_ci
351e484b35bSopenharmony_ci  /**
352e484b35bSopenharmony_ci   * Add the event listener.
353e484b35bSopenharmony_ci   * @param {string} type - Type.
354e484b35bSopenharmony_ci   * @param {Function} handler - To add.
355e484b35bSopenharmony_ci   */
356e484b35bSopenharmony_ci  public $on(type: string, handler: Function): void {
357e484b35bSopenharmony_ci    if (typeof type !== 'string') {
358e484b35bSopenharmony_ci      Log.debug(`Invalid parameter type: The type of 'type' should be string, not ${typeof type}.`);
359e484b35bSopenharmony_ci      return;
360e484b35bSopenharmony_ci    }
361e484b35bSopenharmony_ci    if (typeof handler !== 'function') {
362e484b35bSopenharmony_ci      Log.debug(`Invalid parameter type: The type of 'handler' should be function, not ${typeof handler}.`);
363e484b35bSopenharmony_ci      return;
364e484b35bSopenharmony_ci    }
365e484b35bSopenharmony_ci    const events = this.__vmEvents;
366e484b35bSopenharmony_ci    const handlerList = events[type] || [];
367e484b35bSopenharmony_ci    handlerList.push(handler);
368e484b35bSopenharmony_ci    events[type] = handlerList;
369e484b35bSopenharmony_ci    if (type === 'hook:onReady' && this.__ready) {
370e484b35bSopenharmony_ci      this.$emit('hook:onReady');
371e484b35bSopenharmony_ci    }
372e484b35bSopenharmony_ci  }
373e484b35bSopenharmony_ci
374e484b35bSopenharmony_ci  /**
375e484b35bSopenharmony_ci   * Remove the event listener.
376e484b35bSopenharmony_ci   * @param {string} type - Type.
377e484b35bSopenharmony_ci   * @param {Function} handler - To remove.
378e484b35bSopenharmony_ci   */
379e484b35bSopenharmony_ci  public $off(type: string, handler: Function): void {
380e484b35bSopenharmony_ci    if (typeof type !== 'string') {
381e484b35bSopenharmony_ci      Log.warn(`Invalid parameter type: The type of 'type' should be string, not ${typeof type}.`);
382e484b35bSopenharmony_ci      return;
383e484b35bSopenharmony_ci    }
384e484b35bSopenharmony_ci    if (typeof handler !== 'function') {
385e484b35bSopenharmony_ci      Log.warn(`Invalid parameter type: The type of 'handler' should be function, not ${typeof handler}.`);
386e484b35bSopenharmony_ci      return;
387e484b35bSopenharmony_ci    }
388e484b35bSopenharmony_ci    const events = this.__vmEvents;
389e484b35bSopenharmony_ci    if (!handler) {
390e484b35bSopenharmony_ci      delete events[type];
391e484b35bSopenharmony_ci      return;
392e484b35bSopenharmony_ci    }
393e484b35bSopenharmony_ci    const handlerList = events[type];
394e484b35bSopenharmony_ci    if (!handlerList) {
395e484b35bSopenharmony_ci      return;
396e484b35bSopenharmony_ci    }
397e484b35bSopenharmony_ci    removeItem(handlerList, handler);
398e484b35bSopenharmony_ci  }
399e484b35bSopenharmony_ci
400e484b35bSopenharmony_ci  /**
401e484b35bSopenharmony_ci   * Execution element.fireEvent Method.
402e484b35bSopenharmony_ci   * @param {string} type - Type.
403e484b35bSopenharmony_ci   * @param {Object} data - needed for Evt.
404e484b35bSopenharmony_ci   * @param {string} id - Element id.
405e484b35bSopenharmony_ci   */
406e484b35bSopenharmony_ci  public $emitElement(type: string, data: object, id: string): void {
407e484b35bSopenharmony_ci    if (typeof type !== 'string') {
408e484b35bSopenharmony_ci      Log.warn(`Invalid parameter type: The type of 'type' should be string, not ${typeof type}.`);
409e484b35bSopenharmony_ci      return;
410e484b35bSopenharmony_ci    }
411e484b35bSopenharmony_ci    if (typeof id !== 'string') {
412e484b35bSopenharmony_ci      Log.warn(`Invalid parameter type: The type of 'id' should be string, not ${typeof id}.`);
413e484b35bSopenharmony_ci      return;
414e484b35bSopenharmony_ci    }
415e484b35bSopenharmony_ci    const info = this._ids[id];
416e484b35bSopenharmony_ci    if (info) {
417e484b35bSopenharmony_ci      const element = info.el;
418e484b35bSopenharmony_ci      const evt = new Evt(type, data);
419e484b35bSopenharmony_ci      element.fireEvent(type, evt, false);
420e484b35bSopenharmony_ci    } else {
421e484b35bSopenharmony_ci      Log.warn('The id is invalid, id = ' + id);
422e484b35bSopenharmony_ci    }
423e484b35bSopenharmony_ci  }
424e484b35bSopenharmony_ci
425e484b35bSopenharmony_ci  /**
426e484b35bSopenharmony_ci   * Watch a calc function and callback if the calc value changes.
427e484b35bSopenharmony_ci   * @param {string} data - Data that needed.
428e484b35bSopenharmony_ci   * @param {Function | string} callback - Callback function.
429e484b35bSopenharmony_ci   */
430e484b35bSopenharmony_ci  public $watch(data: string, callback: ((...args: any) => any) | string): void {
431e484b35bSopenharmony_ci    if (typeof data !== 'string') {
432e484b35bSopenharmony_ci      Log.warn(`Invalid parameter type: The type of 'data' should be string, not ${typeof data}.`);
433e484b35bSopenharmony_ci      return;
434e484b35bSopenharmony_ci    }
435e484b35bSopenharmony_ci    if (typeof callback !== 'function' && typeof callback !== 'string') {
436e484b35bSopenharmony_ci      Log.warn(`Invalid parameter type: The type of 'callback' should be function or string, not ${typeof callback}.`);
437e484b35bSopenharmony_ci      return;
438e484b35bSopenharmony_ci    }
439e484b35bSopenharmony_ci    watch(this, data, callback);
440e484b35bSopenharmony_ci  }
441e484b35bSopenharmony_ci
442e484b35bSopenharmony_ci  /**
443e484b35bSopenharmony_ci   * Set a property on an object.
444e484b35bSopenharmony_ci   * @param {string} key - Get value by key.
445e484b35bSopenharmony_ci   * @param {*} value - Property
446e484b35bSopenharmony_ci   */
447e484b35bSopenharmony_ci  public $set(key: string, value: any): void {
448e484b35bSopenharmony_ci    if (typeof key !== 'string') {
449e484b35bSopenharmony_ci      Log.warn(`Invalid parameter type: The type of 'key' should be string, not ${typeof key}.`);
450e484b35bSopenharmony_ci      return;
451e484b35bSopenharmony_ci    }
452e484b35bSopenharmony_ci    if (key.indexOf('.') !== -1) {
453e484b35bSopenharmony_ci      _proxySet(this._data, key, value);
454e484b35bSopenharmony_ci    }
455e484b35bSopenharmony_ci    set(this._data, key, value);
456e484b35bSopenharmony_ci  }
457e484b35bSopenharmony_ci
458e484b35bSopenharmony_ci  /**
459e484b35bSopenharmony_ci   * Delete a property and trigger change.
460e484b35bSopenharmony_ci   * @param {string} key - Get by key.
461e484b35bSopenharmony_ci   */
462e484b35bSopenharmony_ci  public $delete(key: string): void {
463e484b35bSopenharmony_ci    if (typeof key !== 'string') {
464e484b35bSopenharmony_ci      Log.warn(`Invalid parameter type: The type of 'key' should be string, not ${typeof key}.`);
465e484b35bSopenharmony_ci      return;
466e484b35bSopenharmony_ci    }
467e484b35bSopenharmony_ci    del(this._data, key);
468e484b35bSopenharmony_ci  }
469e484b35bSopenharmony_ci
470e484b35bSopenharmony_ci  /**
471e484b35bSopenharmony_ci   * Delete Vm object.
472e484b35bSopenharmony_ci   */
473e484b35bSopenharmony_ci  public destroy(): void {
474e484b35bSopenharmony_ci    Log.debug(`[JS Framework] "onDestroy" lifecycle in Vm(${this.__type})`);
475e484b35bSopenharmony_ci    this.$emit('hook:onDestroy');
476e484b35bSopenharmony_ci    this.$emit('hook:onDetached');
477e484b35bSopenharmony_ci    fireNodeDetached(this.__rootEl);
478e484b35bSopenharmony_ci    this.__valid = false;
479e484b35bSopenharmony_ci
480e484b35bSopenharmony_ci    delete this.__app;
481e484b35bSopenharmony_ci    delete this.__computed;
482e484b35bSopenharmony_ci    delete this.__css;
483e484b35bSopenharmony_ci    delete this.__data;
484e484b35bSopenharmony_ci    delete this.__ids;
485e484b35bSopenharmony_ci    delete this.__vmOptions;
486e484b35bSopenharmony_ci    delete this.__parent;
487e484b35bSopenharmony_ci    delete this.__parentEl;
488e484b35bSopenharmony_ci    delete this.__rootEl;
489e484b35bSopenharmony_ci    delete this.$refs;
490e484b35bSopenharmony_ci
491e484b35bSopenharmony_ci    // Destroy child vms recursively.
492e484b35bSopenharmony_ci    if (this.__childrenVms) {
493e484b35bSopenharmony_ci      let vmCount: number = this.__childrenVms.length;
494e484b35bSopenharmony_ci      while (vmCount--) {
495e484b35bSopenharmony_ci        this.destroy.call(this.__childrenVms[vmCount], this.__childrenVms[vmCount]);
496e484b35bSopenharmony_ci      }
497e484b35bSopenharmony_ci      delete this.__childrenVms;
498e484b35bSopenharmony_ci    }
499e484b35bSopenharmony_ci    delete this.__type;
500e484b35bSopenharmony_ci    delete this.__vmEvents;
501e484b35bSopenharmony_ci  }
502e484b35bSopenharmony_ci
503e484b35bSopenharmony_ci  /**
504e484b35bSopenharmony_ci   * $t function.
505e484b35bSopenharmony_ci   * @param {string} key - Key.
506e484b35bSopenharmony_ci   * @return {string} - Key.
507e484b35bSopenharmony_ci   */
508e484b35bSopenharmony_ci  public $t(key: string): string {
509e484b35bSopenharmony_ci    return key;
510e484b35bSopenharmony_ci  }
511e484b35bSopenharmony_ci
512e484b35bSopenharmony_ci  /**
513e484b35bSopenharmony_ci   * $tc function.
514e484b35bSopenharmony_ci   * @param {string} key - Key.
515e484b35bSopenharmony_ci   * @return {string} - Key.
516e484b35bSopenharmony_ci   */
517e484b35bSopenharmony_ci  public $tc(key: string): string {
518e484b35bSopenharmony_ci    return key;
519e484b35bSopenharmony_ci  }
520e484b35bSopenharmony_ci
521e484b35bSopenharmony_ci  /**
522e484b35bSopenharmony_ci   * $r function.
523e484b35bSopenharmony_ci   * @param {string} key - Key.
524e484b35bSopenharmony_ci   * @return {string} - Key.
525e484b35bSopenharmony_ci   */
526e484b35bSopenharmony_ci  public $r(key: string): string {
527e484b35bSopenharmony_ci    return key;
528e484b35bSopenharmony_ci  }
529e484b35bSopenharmony_ci
530e484b35bSopenharmony_ci  /**
531e484b35bSopenharmony_ci   * Methods of this Vm.
532e484b35bSopenharmony_ci   * @type {Object}
533e484b35bSopenharmony_ci   * @readonly
534e484b35bSopenharmony_ci   */
535e484b35bSopenharmony_ci  public get _methods() {
536e484b35bSopenharmony_ci    return this.__methods;
537e484b35bSopenharmony_ci  }
538e484b35bSopenharmony_ci
539e484b35bSopenharmony_ci  public $getCounterMapping(key: string): number {
540e484b35bSopenharmony_ci    return this.__counterMapping.get(key);
541e484b35bSopenharmony_ci  }
542e484b35bSopenharmony_ci
543e484b35bSopenharmony_ci  public $setCounterMapping(key: string, value: number) {
544e484b35bSopenharmony_ci    this.__counterMapping.set(key, value);
545e484b35bSopenharmony_ci  }
546e484b35bSopenharmony_ci
547e484b35bSopenharmony_ci  public get _counterMapping() {
548e484b35bSopenharmony_ci    return this.__counterMapping;
549e484b35bSopenharmony_ci  }
550e484b35bSopenharmony_ci
551e484b35bSopenharmony_ci  /**
552e484b35bSopenharmony_ci   * Type of this Vm.
553e484b35bSopenharmony_ci   * @type {string}
554e484b35bSopenharmony_ci   * @readonly
555e484b35bSopenharmony_ci   */
556e484b35bSopenharmony_ci  public get _type() {
557e484b35bSopenharmony_ci    return this.__type;
558e484b35bSopenharmony_ci  }
559e484b35bSopenharmony_ci
560e484b35bSopenharmony_ci  public set _type(newType: string) {
561e484b35bSopenharmony_ci    this.__type = newType;
562e484b35bSopenharmony_ci  }
563e484b35bSopenharmony_ci
564e484b35bSopenharmony_ci  /**
565e484b35bSopenharmony_ci   * Css of this Vm.
566e484b35bSopenharmony_ci   * @type {[key: string]: any}
567e484b35bSopenharmony_ci   * @readonly
568e484b35bSopenharmony_ci   */
569e484b35bSopenharmony_ci  public get _css() {
570e484b35bSopenharmony_ci    return this.__css;
571e484b35bSopenharmony_ci  }
572e484b35bSopenharmony_ci
573e484b35bSopenharmony_ci  /**
574e484b35bSopenharmony_ci   * Options of this Vm.
575e484b35bSopenharmony_ci   * @type {VmOptions}
576e484b35bSopenharmony_ci   */
577e484b35bSopenharmony_ci  public get _vmOptions() {
578e484b35bSopenharmony_ci    return this.__vmOptions;
579e484b35bSopenharmony_ci  }
580e484b35bSopenharmony_ci
581e484b35bSopenharmony_ci  public set _vmOptions(newOptions: VmOptions) {
582e484b35bSopenharmony_ci    this.__vmOptions = newOptions;
583e484b35bSopenharmony_ci  }
584e484b35bSopenharmony_ci
585e484b35bSopenharmony_ci  /**
586e484b35bSopenharmony_ci   * Parent of this Vm.
587e484b35bSopenharmony_ci   * @type {Vm}
588e484b35bSopenharmony_ci   * @readonly
589e484b35bSopenharmony_ci   */
590e484b35bSopenharmony_ci  public get _parent() {
591e484b35bSopenharmony_ci    return this.__parent;
592e484b35bSopenharmony_ci  }
593e484b35bSopenharmony_ci
594e484b35bSopenharmony_ci  /**
595e484b35bSopenharmony_ci   * RealParent of this Vm.
596e484b35bSopenharmony_ci   * @type {Vm}
597e484b35bSopenharmony_ci   */
598e484b35bSopenharmony_ci  public get _realParent() {
599e484b35bSopenharmony_ci    return this.__realParent;
600e484b35bSopenharmony_ci  }
601e484b35bSopenharmony_ci
602e484b35bSopenharmony_ci  public set _realParent(realParent: Vm) {
603e484b35bSopenharmony_ci    this.__realParent = realParent;
604e484b35bSopenharmony_ci  }
605e484b35bSopenharmony_ci
606e484b35bSopenharmony_ci  /**
607e484b35bSopenharmony_ci   * Computed of this Vm.
608e484b35bSopenharmony_ci   * @type {ComputedInterface}
609e484b35bSopenharmony_ci   */
610e484b35bSopenharmony_ci  public get computed() {
611e484b35bSopenharmony_ci    return this.__computed;
612e484b35bSopenharmony_ci  }
613e484b35bSopenharmony_ci
614e484b35bSopenharmony_ci  public set computed(newComputed: ComputedInterface) {
615e484b35bSopenharmony_ci    this.__computed = newComputed;
616e484b35bSopenharmony_ci  }
617e484b35bSopenharmony_ci
618e484b35bSopenharmony_ci  /**
619e484b35bSopenharmony_ci   * Selector of this Vm.
620e484b35bSopenharmony_ci   * @type {Object}
621e484b35bSopenharmony_ci   * @readonly
622e484b35bSopenharmony_ci   */
623e484b35bSopenharmony_ci  public get _selector() {
624e484b35bSopenharmony_ci    return this.__selector;
625e484b35bSopenharmony_ci  }
626e484b35bSopenharmony_ci
627e484b35bSopenharmony_ci  /**
628e484b35bSopenharmony_ci   * ParentEl of this Vm.
629e484b35bSopenharmony_ci   * @type {FragBlockInterface | Element}
630e484b35bSopenharmony_ci   */
631e484b35bSopenharmony_ci  public get _parentEl() {
632e484b35bSopenharmony_ci    return this.__parentEl;
633e484b35bSopenharmony_ci  }
634e484b35bSopenharmony_ci
635e484b35bSopenharmony_ci  public set _parentEl(newParentEl: FragBlockInterface | Element) {
636e484b35bSopenharmony_ci    this.__parentEl = newParentEl;
637e484b35bSopenharmony_ci  }
638e484b35bSopenharmony_ci
639e484b35bSopenharmony_ci  /**
640e484b35bSopenharmony_ci   * App of this Vm.
641e484b35bSopenharmony_ci   * @type {Page}
642e484b35bSopenharmony_ci   */
643e484b35bSopenharmony_ci  public get _app() {
644e484b35bSopenharmony_ci    return this.__app;
645e484b35bSopenharmony_ci  }
646e484b35bSopenharmony_ci
647e484b35bSopenharmony_ci  public set _app(newApp: Page) {
648e484b35bSopenharmony_ci    this.__app = newApp;
649e484b35bSopenharmony_ci  }
650e484b35bSopenharmony_ci
651e484b35bSopenharmony_ci  /**
652e484b35bSopenharmony_ci   * ShareData of this Vm.
653e484b35bSopenharmony_ci   * @type {*}
654e484b35bSopenharmony_ci   */
655e484b35bSopenharmony_ci  public get _shareData() {
656e484b35bSopenharmony_ci    return this.__shareData;
657e484b35bSopenharmony_ci  }
658e484b35bSopenharmony_ci
659e484b35bSopenharmony_ci  public set _shareData(newShareData: object) {
660e484b35bSopenharmony_ci    this.__shareData = newShareData;
661e484b35bSopenharmony_ci  }
662e484b35bSopenharmony_ci
663e484b35bSopenharmony_ci  /**
664e484b35bSopenharmony_ci   * Data of this Vm.
665e484b35bSopenharmony_ci   * @type {*}
666e484b35bSopenharmony_ci   */
667e484b35bSopenharmony_ci  public get _data() {
668e484b35bSopenharmony_ci    return this.__data;
669e484b35bSopenharmony_ci  }
670e484b35bSopenharmony_ci
671e484b35bSopenharmony_ci  public set _data(newData: any) {
672e484b35bSopenharmony_ci    this.__data = newData;
673e484b35bSopenharmony_ci  }
674e484b35bSopenharmony_ci
675e484b35bSopenharmony_ci  /**
676e484b35bSopenharmony_ci   * Props of this Vm.
677e484b35bSopenharmony_ci   * @type {Props}
678e484b35bSopenharmony_ci   * @readonly
679e484b35bSopenharmony_ci   */
680e484b35bSopenharmony_ci  public get _props() {
681e484b35bSopenharmony_ci    return this.__props;
682e484b35bSopenharmony_ci  }
683e484b35bSopenharmony_ci
684e484b35bSopenharmony_ci  /**
685e484b35bSopenharmony_ci   * Init of this Vm.
686e484b35bSopenharmony_ci   * @type {boolean}
687e484b35bSopenharmony_ci   */
688e484b35bSopenharmony_ci  public get _init() {
689e484b35bSopenharmony_ci    return this.__init;
690e484b35bSopenharmony_ci  }
691e484b35bSopenharmony_ci
692e484b35bSopenharmony_ci  public set _init(newInit: boolean) {
693e484b35bSopenharmony_ci    this.__init = newInit;
694e484b35bSopenharmony_ci  }
695e484b35bSopenharmony_ci
696e484b35bSopenharmony_ci  /**
697e484b35bSopenharmony_ci   * Valid of this Vm.
698e484b35bSopenharmony_ci   * @type {boolean}
699e484b35bSopenharmony_ci   * @readonly
700e484b35bSopenharmony_ci   */
701e484b35bSopenharmony_ci  public get _valid() {
702e484b35bSopenharmony_ci    return this.__valid;
703e484b35bSopenharmony_ci  }
704e484b35bSopenharmony_ci
705e484b35bSopenharmony_ci  /**
706e484b35bSopenharmony_ci   * Visible of this Vm.
707e484b35bSopenharmony_ci   * @type {boolean}
708e484b35bSopenharmony_ci   */
709e484b35bSopenharmony_ci  public get _visible() {
710e484b35bSopenharmony_ci    return this.__visible;
711e484b35bSopenharmony_ci  }
712e484b35bSopenharmony_ci
713e484b35bSopenharmony_ci  public set _visible(newVisible) {
714e484b35bSopenharmony_ci    this.__visible = newVisible;
715e484b35bSopenharmony_ci  }
716e484b35bSopenharmony_ci
717e484b35bSopenharmony_ci  /**
718e484b35bSopenharmony_ci   * Ready of this Vm.
719e484b35bSopenharmony_ci   * @type {boolean}
720e484b35bSopenharmony_ci   */
721e484b35bSopenharmony_ci  public get _ready() {
722e484b35bSopenharmony_ci    return this.__ready;
723e484b35bSopenharmony_ci  }
724e484b35bSopenharmony_ci
725e484b35bSopenharmony_ci  public set _ready(newReady: boolean) {
726e484b35bSopenharmony_ci    this.__ready = newReady;
727e484b35bSopenharmony_ci  }
728e484b35bSopenharmony_ci
729e484b35bSopenharmony_ci  /**
730e484b35bSopenharmony_ci   * RootEl of this Vm.
731e484b35bSopenharmony_ci   * @type {Element}
732e484b35bSopenharmony_ci   */
733e484b35bSopenharmony_ci  public get _rootEl() {
734e484b35bSopenharmony_ci    return this.__rootEl;
735e484b35bSopenharmony_ci  }
736e484b35bSopenharmony_ci
737e484b35bSopenharmony_ci  public set _rootEl(newRootEl: Element) {
738e484b35bSopenharmony_ci    this.__rootEl = newRootEl;
739e484b35bSopenharmony_ci  }
740e484b35bSopenharmony_ci
741e484b35bSopenharmony_ci  /**
742e484b35bSopenharmony_ci   * Ids of this Vm.
743e484b35bSopenharmony_ci   * @type {{[key: string]: { vm: Vm, el: Element}}}
744e484b35bSopenharmony_ci   * @readonly
745e484b35bSopenharmony_ci   */
746e484b35bSopenharmony_ci  public get _ids() {
747e484b35bSopenharmony_ci    return this.__ids;
748e484b35bSopenharmony_ci  }
749e484b35bSopenharmony_ci
750e484b35bSopenharmony_ci  /**
751e484b35bSopenharmony_ci   * VmEvents of this Vm.
752e484b35bSopenharmony_ci   * @type {Object}
753e484b35bSopenharmony_ci   * @readonly
754e484b35bSopenharmony_ci   */
755e484b35bSopenharmony_ci  public get _vmEvents() {
756e484b35bSopenharmony_ci    return this.__vmEvents;
757e484b35bSopenharmony_ci  }
758e484b35bSopenharmony_ci
759e484b35bSopenharmony_ci  /**
760e484b35bSopenharmony_ci   * children of vm.
761e484b35bSopenharmony_ci   * @return {Array} - children of Vm.
762e484b35bSopenharmony_ci   */
763e484b35bSopenharmony_ci  public get _childrenVms() {
764e484b35bSopenharmony_ci    return this.__childrenVms;
765e484b35bSopenharmony_ci  }
766e484b35bSopenharmony_ci
767e484b35bSopenharmony_ci  /**
768e484b35bSopenharmony_ci   * ExternalBinding of this Vm.
769e484b35bSopenharmony_ci   * @type {ExternalBinding}
770e484b35bSopenharmony_ci   */
771e484b35bSopenharmony_ci  public get _externalBinding() {
772e484b35bSopenharmony_ci    return this.__externalBinding;
773e484b35bSopenharmony_ci  }
774e484b35bSopenharmony_ci
775e484b35bSopenharmony_ci  public set _externalBinding(newExternalBinding: ExternalBindingInterface) {
776e484b35bSopenharmony_ci    this.__externalBinding = newExternalBinding;
777e484b35bSopenharmony_ci  }
778e484b35bSopenharmony_ci
779e484b35bSopenharmony_ci  /**
780e484b35bSopenharmony_ci   * Descriptor of this Vm.
781e484b35bSopenharmony_ci   * @type {string}
782e484b35bSopenharmony_ci   * @readonly
783e484b35bSopenharmony_ci   */
784e484b35bSopenharmony_ci  public get _descriptor() {
785e484b35bSopenharmony_ci    return this.__descriptor;
786e484b35bSopenharmony_ci  }
787e484b35bSopenharmony_ci
788e484b35bSopenharmony_ci  /**
789e484b35bSopenharmony_ci   * IsHide of this Vm.
790e484b35bSopenharmony_ci   * @type {boolean}
791e484b35bSopenharmony_ci   */
792e484b35bSopenharmony_ci  public get _isHide() {
793e484b35bSopenharmony_ci    return this.__isHide;
794e484b35bSopenharmony_ci  }
795e484b35bSopenharmony_ci
796e484b35bSopenharmony_ci  public set _isHide(newIsHide: boolean) {
797e484b35bSopenharmony_ci    this.__isHide = newIsHide;
798e484b35bSopenharmony_ci  }
799e484b35bSopenharmony_ci
800e484b35bSopenharmony_ci  /**
801e484b35bSopenharmony_ci   * MediaStatus of this Vm.
802e484b35bSopenharmony_ci   * @type {MediaStatusInterface<string, boolean>}
803e484b35bSopenharmony_ci   */
804e484b35bSopenharmony_ci  public get _mediaStatus() {
805e484b35bSopenharmony_ci    return this.__mediaStatus;
806e484b35bSopenharmony_ci  }
807e484b35bSopenharmony_ci
808e484b35bSopenharmony_ci  public set _mediaStatus(newMediaStatus: Partial<MediaStatusInterface<string, boolean>>) {
809e484b35bSopenharmony_ci    this.__mediaStatus = newMediaStatus;
810e484b35bSopenharmony_ci  }
811e484b35bSopenharmony_ci
812e484b35bSopenharmony_ci  /**
813e484b35bSopenharmony_ci   * slotContext of this Vm.
814e484b35bSopenharmony_ci   * @type { content: Record<string, any>, parentVm: Vm }
815e484b35bSopenharmony_ci   */
816e484b35bSopenharmony_ci  public get _slotContext() {
817e484b35bSopenharmony_ci    return this.__slotContext;
818e484b35bSopenharmony_ci  }
819e484b35bSopenharmony_ci
820e484b35bSopenharmony_ci  public set _slotContext(newMSoltContext: { content: Record<string, any>, parentVm: Vm }) {
821e484b35bSopenharmony_ci    this.__slotContext = newMSoltContext;
822e484b35bSopenharmony_ci  }
823e484b35bSopenharmony_ci}
824e484b35bSopenharmony_ci
825e484b35bSopenharmony_ci/**
826e484b35bSopenharmony_ci * Set proxy.
827e484b35bSopenharmony_ci * @param {Object} data - Data that needed.
828e484b35bSopenharmony_ci * @param {string} key - Get prop by key.
829e484b35bSopenharmony_ci * @param {*} value - Property.
830e484b35bSopenharmony_ci */
831e484b35bSopenharmony_cifunction _proxySet(data: object, key: string, value: any): void {
832e484b35bSopenharmony_ci  let tempObj = data;
833e484b35bSopenharmony_ci  const keys = key.split('.');
834e484b35bSopenharmony_ci  const len = keys.length;
835e484b35bSopenharmony_ci  for (let i = 0; i < len; i++) {
836e484b35bSopenharmony_ci    const prop = keys[i];
837e484b35bSopenharmony_ci    if (i === len - 1) {
838e484b35bSopenharmony_ci      set(tempObj, prop, value);
839e484b35bSopenharmony_ci      tempObj = null;
840e484b35bSopenharmony_ci      break;
841e484b35bSopenharmony_ci    }
842e484b35bSopenharmony_ci    if (tempObj[prop] === null || typeof tempObj[prop] !== 'object' && typeof tempObj[prop] !== 'function') {
843e484b35bSopenharmony_ci      Log.warn(`Force define property '${prop}' of '${JSON.stringify(tempObj)}' with value '{}', `
844e484b35bSopenharmony_ci        + `old value is '${tempObj[prop]}'.`);
845e484b35bSopenharmony_ci      set(tempObj, prop, {});
846e484b35bSopenharmony_ci    }
847e484b35bSopenharmony_ci    tempObj = tempObj[prop];
848e484b35bSopenharmony_ci  }
849e484b35bSopenharmony_ci}
850e484b35bSopenharmony_ci
851e484b35bSopenharmony_ci/**
852e484b35bSopenharmony_ci * Control data access.
853e484b35bSopenharmony_ci * @param {Vm} vm - Vm object.
854e484b35bSopenharmony_ci * @param {Object} mergedData - Merged data.
855e484b35bSopenharmony_ci * @param {boolean} external - If has external data.
856e484b35bSopenharmony_ci */
857e484b35bSopenharmony_cifunction dataAccessControl(vm: any, mergedData: object, external: boolean): void {
858e484b35bSopenharmony_ci  if (vm._descriptor && Object.keys(vm._descriptor).length !== 0) {
859e484b35bSopenharmony_ci    const keys = Object.keys(mergedData);
860e484b35bSopenharmony_ci    keys.forEach(key => {
861e484b35bSopenharmony_ci      const desc = vm._descriptor[key];
862e484b35bSopenharmony_ci      if (!desc || desc.access === 'private' || external && desc.access === 'protected') {
863e484b35bSopenharmony_ci        Log.error(`(${key}) can not modify`);
864e484b35bSopenharmony_ci        delete mergedData[key];
865e484b35bSopenharmony_ci      }
866e484b35bSopenharmony_ci    });
867e484b35bSopenharmony_ci  }
868e484b35bSopenharmony_ci}
869e484b35bSopenharmony_ci
870e484b35bSopenharmony_ci/**
871e484b35bSopenharmony_ci * Get root Vm.
872e484b35bSopenharmony_ci * @param {Vm} vm - Vm object.
873e484b35bSopenharmony_ci * @return {Vm} Root vm.
874e484b35bSopenharmony_ci */
875e484b35bSopenharmony_cifunction getRoot(vm: any): Vm {
876e484b35bSopenharmony_ci  const parent = vm._parent;
877e484b35bSopenharmony_ci  if (!parent) {
878e484b35bSopenharmony_ci    return vm;
879e484b35bSopenharmony_ci  }
880e484b35bSopenharmony_ci  if (parent.__rootVm) {
881e484b35bSopenharmony_ci    return vm;
882e484b35bSopenharmony_ci  }
883e484b35bSopenharmony_ci  return getRoot(parent);
884e484b35bSopenharmony_ci}
885e484b35bSopenharmony_ci
886e484b35bSopenharmony_ci/**
887e484b35bSopenharmony_ci * order node and fire detached event.
888e484b35bSopenharmony_ci * @param {Element} el - Element object.
889e484b35bSopenharmony_ci */
890e484b35bSopenharmony_cifunction fireNodeDetached(el: Element) {
891e484b35bSopenharmony_ci  if (!el) {
892e484b35bSopenharmony_ci    return;
893e484b35bSopenharmony_ci  }
894e484b35bSopenharmony_ci  if (el.event && el.event['detached']) {
895e484b35bSopenharmony_ci    el.fireEvent('detached', {});
896e484b35bSopenharmony_ci  }
897e484b35bSopenharmony_ci  if (el.children && el.children.length !== 0) {
898e484b35bSopenharmony_ci    for (const child of el.children) {
899e484b35bSopenharmony_ci      fireNodeDetached(child as Element);
900e484b35bSopenharmony_ci    }
901e484b35bSopenharmony_ci  }
902e484b35bSopenharmony_ci}
903