WebArticleEventHandler.ets 2.58 KB
import { BridgeUtil, BridgeWebViewControl, Callback } from "wdJsBridge";
import { Message } from "wdJsBridge/src/main/ets/bean/Message";
import { Logger } from "wdKit";
import { H5CallNativeType } from "../pages/H5CallNativeType";
import { NativeCallH5Type } from "../pages/NativeCallH5Type";
import { WebEvents } from "./WebLocalPool";

const TAG = 'WebArticleEventHandler'

export class WebArticleEventHandler implements WebEvents {
  webviewControl?: BridgeWebViewControl

  pageLoadEnd: boolean = false
  pageEndBlock?:(event: OnPageEndEvent) => void

  currentPageOperateBlock?: (data: Message, f: Callback) => void

  constructor(webviewControl: BridgeWebViewControl) {
    this.webviewControl = webviewControl
  }


  //MARK: ----
  onPrepareForReuse(): boolean {
    if (!this.webviewControl || this.pageLoadEnd == false) {
      return false
    }
    this.webviewControl?.callHandle(NativeCallH5Type.jsCall_clearAppData, '', (data) => {
    })
    return true
  }

  onPageBegin(event: OnPageBeginEvent): void {
    Logger.debug(TAG, 'onPageBegin');
    this.registerHandlers();
    //有时序问题 必须延时执行
    setTimeout(() => {
      BridgeUtil.webViewLoadLocalJs(getContext(this), this.webviewControl!)
    }, 200)
  }

  onPageEnd(event: OnPageEndEvent): void {
    Logger.debug(TAG, 'onPageEnd');
    this.pageLoadEnd = true
    if (this.pageEndBlock) {
      this.pageEndBlock(event)
    }
  }

  onLoadIntercept(event: OnLoadInterceptEvent): boolean {
    let url: string = event.data.getRequestUrl().toString()
    url = url.replace("%(?![0-9a-fA-F]{2})", "%25")
      .replace("\\+", "%2B");
    url = decodeURIComponent(url)
    Logger.debugOptimize(TAG, () => {
      return 'Web onLoadIntercept url: ' + url
    });
    if (url.startsWith(BridgeUtil.YY_RETURN_DATA)) {
      this.webviewControl?.handlerReturnData(url)
      return true
    }
    if (url.startsWith(BridgeUtil.YY_OVERRIDE_SCHEMA)) {
      // this.webviewControl.flushMessageQueue()
      this.webviewControl?.receiveDataFromH5(url)
      return true
    }
    return false;
  }

  private registerHandlers(): void {
    // 注册h5调用js相关
    for (let i = 0; i < H5CallNativeType.JsCallTypeList.length; i++) {
      let handleName = H5CallNativeType.JsCallTypeList[i];
      let handle = (data: Message, f: Callback) => {
        Logger.debugOptimize(TAG, () => {
          return 'receivedData: ' + JSON.stringify(data.data)
        })
        if (this.currentPageOperateBlock) {
          this.currentPageOperateBlock(data, f)
        }
      };
      this.webviewControl?.registerHandler(handleName, { handle: handle });
    }
  }

}