mh-two-thousand-and-two
2024-04-12 3d2ec2fd0578d3ba0a414b0cc4e4a2ae60878596
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
const UNIAPP_SERVICE_NVUE_ID = '__uniapp__service'
 
export function initPostMessage (nvue) {
  const plus = nvue.requireModule('plus')
  return {
    postMessage (data) {
      plus.postMessage(data, UNIAPP_SERVICE_NVUE_ID)
    }
  }
}
 
export function initSubNVue (nvue, plus, BroadcastChannel) {
  let origin
 
  const onMessageCallbacks = []
 
  const postMessage = nvue.requireModule('plus').postMessage
 
  const onSubNVueMessage = function onSubNVueMessage (data) {
    onMessageCallbacks.forEach(callback => callback({
      origin,
      data
    }))
  }
 
  nvue.requireModule('globalEvent').addEventListener('plusMessage', e => {
    if (e.data.type === 'UniAppSubNVue') {
      onSubNVueMessage(e.data.data, e.data.options)
    }
  })
 
  const webviewId = plus.webview.currentWebview().id
 
  const channel = new BroadcastChannel('UNI-APP-SUBNVUE')
  channel.onmessage = function (event) {
    if (event.data.to === webviewId) {
      onSubNVueMessage(event.data.data)
    }
  }
 
  const wrapper = function wrapper (webview) {
    webview.$processed = true
 
    const currentWebviewId = plus.webview.currentWebview().id
    const isPopupNVue = currentWebviewId === webview.id
 
    const hostNVueId = webview.__uniapp_origin_type === 'uniNView' && webview.__uniapp_origin_id
    const popupNVueId = webview.id
 
    webview.postMessage = function (data) {
      if (hostNVueId) {
        channel.postMessage({
          data,
          to: isPopupNVue ? hostNVueId : popupNVueId
        })
      } else {
        postMessage({
          type: 'UniAppSubNVue',
          data: data
        }, UNIAPP_SERVICE_NVUE_ID)
      }
    }
    webview.onMessage = function (callback) {
      onMessageCallbacks.push(callback)
    }
 
    if (!webview.__uniapp_mask_id) {
      return
    }
    origin = webview.__uniapp_host
 
    const maskColor = webview.__uniapp_mask
 
    const maskWebview = webview.__uniapp_mask_id === '0' ? {
      setStyle ({ mask }) {
        nvue.requireModule('uni-tabview').setMask({
          color: mask
        })
      }
    } : plus.webview.getWebviewById(webview.__uniapp_mask_id)
 
    const oldShow = webview.show
    const oldHide = webview.hide
    const oldClose = webview.close
 
    const showMask = function () {
      maskWebview.setStyle({
        mask: maskColor
      })
    }
    const closeMask = function () {
      maskWebview.setStyle({
        mask: 'none'
      })
    }
    webview.show = function (...args) {
      showMask()
      return oldShow.apply(webview, args)
    }
    webview.hide = function (...args) {
      closeMask()
      return oldHide.apply(webview, args)
    }
    webview.close = function (...args) {
      closeMask()
      return oldClose.apply(webview, args)
    }
  }
 
  const getSubNVueById = function getSubNVueById (id) {
    const webview = plus.webview.getWebviewById(id)
    if (webview && !webview.$processed) {
      wrapper(webview)
    }
    return webview
  }
 
  return {
    getSubNVueById,
    getCurrentSubNVue () {
      return getSubNVueById(plus.webview.currentWebview().id)
    }
  }
}