WebPoolManager.ets 3.1 KB
import { BridgeWebViewControl } from "wdJsBridge"
import { AppUtils } from "wdKit"
import { createReuseableWeb, destoryReuseableWeb, getPoolWebNodeController, WebNodeController } from "./WebLocalPool"
import { createNWeb} from "./WebCommonPool"
import { util } from "@kit.ArkTS"
import { WebArticleEventHandler } from "./WebArticleEventHandler"

interface ArticleWebInterface {
  uiContext: UIContext,
  webSrc: string | Resource,
  webController: BridgeWebViewControl
  webArticleEventHandler: WebArticleEventHandler
}

const MAX_POOL_COUNT = 2

export class WebPoolManager {

  private webTargets: string[] = []

  private constructor() {
  }
  private static manager: WebPoolManager
  static sharedInstance() : WebPoolManager {
    if (!WebPoolManager.manager) {
      WebPoolManager.manager = new WebPoolManager()
    }
    return WebPoolManager.manager
  }

  createArticleWeb(param: ArticleWebInterface, taking?: boolean) : string {
    let target = util.generateRandomUUID()
    createReuseableWeb(param.uiContext,
      {src: param.webSrc, controller: param.webController, renderMode: RenderMode.SYNC_RENDER},
      target,
      800,
      param.webArticleEventHandler
    )
    if (taking != true && this.webTargets.length < MAX_POOL_COUNT) {
      this.webTargets.push(target)
    }
    return target
  }

  createHuaWeiWeb(uiContext: UIContext){
    createNWeb('https://privacy.consumer.huawei.com/legal/id/authentication-terms.htm?code=CN&language=zh-CN', uiContext)
  }



  // 取一个可用的target,不存在则根据参数创建
  // 当使用完成,需要调用recycleTarget()
  takeAvaiableArticleWebTarget(param: ArticleWebInterface): string {
    if (this.webTargets.length) {
      let target = this.webTargets.splice(0, 1).pop()!

      // 当pool里没有缓存,主动提前加载一个
      if (this.webTargets.length == 0) {
        setTimeout(() => {
          this.createArticleWeb(param)
        }, 500)
      }
      return target
    }
    return this.createArticleWeb(param, true)
  }

  // 回收target
  recycleTarget(target: string) {
    let nodeController = getPoolWebNodeController(target)
    if (!nodeController) {
      let index = this.webTargets.indexOf(target)
      if (index >= 0) {
        this.webTargets.splice(index, 1)
      }
      return
    }

    if (this.webTargets.length < MAX_POOL_COUNT) {
      if (nodeController.prepareForReuse() == true) {
        this.webTargets.push(target)
        return
      }
    }

    this.destoryTarget(target)
  }

  // 撤底销毁
  destoryTarget(target: string) {
    destoryReuseableWeb(target)
    let index = this.webTargets.indexOf(target)
    if (index >= 0) {
      this.webTargets.splice(index, 1)
    }
  }

  getWebNodeController(target: string) : WebNodeController | undefined {
    return getPoolWebNodeController(target)
  }
  getWebController(target: string) : BridgeWebViewControl | undefined {
    return getPoolWebNodeController(target)?.webOption.controller as BridgeWebViewControl
  }
  getWebEventHandler(target: string) : WebArticleEventHandler | undefined {
    return getPoolWebNodeController(target)?.webEvents as WebArticleEventHandler
  }


}