index.js 3.8 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1 2 3 4
import {
  stringifyQuery
} from 'uni-shared'

fxy060608's avatar
fxy060608 已提交
5 6
import {
  parseWebviewStyle
fxy060608's avatar
fxy060608 已提交
7
} from './parser/webview-style-parser'
fxy060608's avatar
fxy060608 已提交
8

Q
qiang 已提交
9
import {
fxy060608's avatar
fxy060608 已提交
10 11
  initSubNVues
} from './parser/sub-nvue-parser'
Q
qiang 已提交
12

fxy060608's avatar
init v3  
fxy060608 已提交
13 14 15 16
import {
  VIEW_WEBVIEW_PATH
} from '../../constants'

17
import {
fxy060608's avatar
fxy060608 已提交
18 19 20 21 22 23 24 25 26 27
  onWebviewClose
} from './on-webview-close'

import {
  onWebviewResize
} from './on-webview-resize'

import {
  onWebviewRecovery
} from './on-webview-recovery'
28

fxy060608's avatar
fxy060608 已提交
29 30 31 32
import {
  onWebviewPopGesture
} from './on-webview-pop-gesture'

fxy060608's avatar
init v3  
fxy060608 已提交
33 34
export let preloadWebview

fxy060608's avatar
fxy060608 已提交
35 36 37 38 39 40 41 42 43
let id = 2

const WEBVIEW_LISTENERS = {
  'pullToRefresh': 'onPullDownRefresh',
  'titleNViewSearchInputChanged': 'onNavigationBarSearchInputChanged',
  'titleNViewSearchInputConfirmed': 'onNavigationBarSearchInputConfirmed',
  'titleNViewSearchInputClicked': 'onNavigationBarSearchInputClicked'
}

fxy060608's avatar
init v3  
fxy060608 已提交
44 45 46 47
export function setPreloadWebview (webview) {
  preloadWebview = webview
}

fxy060608's avatar
fxy060608 已提交
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
function noop (str) {
  return str
}

function getDebugRefresh (path, query, routeOptions) {
  const queryString = query ? stringifyQuery(query, noop) : ''
  return {
    isTab: routeOptions.meta.isTabBar,
    arguments: JSON.stringify({
      path: path.substr(1),
      query: queryString ? queryString.substr(1) : queryString
    })
  }
}

fxy060608's avatar
fxy060608 已提交
63
export function createWebview (path, routeOptions) {
fxy060608's avatar
init v3  
fxy060608 已提交
64 65 66 67 68 69 70 71 72 73 74 75 76
  if (routeOptions.meta.isNVue) {
    const webviewId = id++
    const webviewStyle = parseWebviewStyle(
      webviewId,
      path,
      routeOptions
    )
    if (process.env.NODE_ENV !== 'production') {
      console.log(`[uni-app] createWebview`, webviewId, path, webviewStyle)
    }
    return plus.webview.create('', String(webviewId), webviewStyle, {
      nvue: true
    })
fxy060608's avatar
fxy060608 已提交
77
  }
fxy060608's avatar
init v3  
fxy060608 已提交
78 79 80 81
  if (id === 2) { // 如果首页非 nvue,则直接返回 Launch Webview
    return plus.webview.getLaunchWebview()
  }
  const webview = preloadWebview
fxy060608's avatar
fxy060608 已提交
82 83 84
  return webview
}

fxy060608's avatar
fxy060608 已提交
85
export function initWebview (webview, routeOptions, path, query) {
fxy060608's avatar
init v3  
fxy060608 已提交
86 87
  // 首页或非 nvue 页面
  if (webview.id === '1' || !routeOptions.meta.isNVue) {
fxy060608's avatar
fxy060608 已提交
88 89 90
    const webviewStyle = parseWebviewStyle(
      parseInt(webview.id),
      '',
fxy060608's avatar
fxy060608 已提交
91
      routeOptions
fxy060608's avatar
fxy060608 已提交
92 93 94 95
    )
    if (!routeOptions.meta.isNVue) {
      webviewStyle.debugRefresh = getDebugRefresh(path, query, routeOptions)
    }
fxy060608's avatar
fxy060608 已提交
96 97
    if (process.env.NODE_ENV !== 'production') {
      console.log(`[uni-app] updateWebview`, webviewStyle)
Q
qiang 已提交
98 99
    }

fxy060608's avatar
fxy060608 已提交
100 101
    webview.setStyle(webviewStyle)
  }
fxy060608's avatar
fxy060608 已提交
102 103 104 105

  const {
    on,
    emit
fxy060608's avatar
fxy060608 已提交
106
  } = UniServiceJSBridge
fxy060608's avatar
fxy060608 已提交
107 108 109

  initSubNVues(routeOptions, webview)

fxy060608's avatar
fxy060608 已提交
110 111
  Object.keys(WEBVIEW_LISTENERS).forEach(name => {
    webview.addEventListener(name, (e) => {
fxy060608's avatar
fxy060608 已提交
112
      emit(WEBVIEW_LISTENERS[name], e, parseInt(webview.id))
fxy060608's avatar
fxy060608 已提交
113 114 115
    })
  })

fxy060608's avatar
fxy060608 已提交
116
  onWebviewClose(webview)
117 118
  onWebviewResize(webview)

fxy060608's avatar
fxy060608 已提交
119 120 121
  if (plus.os.name === 'iOS') {
    !webview.nvue && onWebviewRecovery(webview, routeOptions)
    onWebviewPopGesture(webview)
122
  }
Q
qiang 已提交
123

fxy060608's avatar
fxy060608 已提交
124 125 126 127 128
  on(webview.id + '.startPullDownRefresh', () => {
    webview.beginPullToRefresh()
  })

  on(webview.id + '.stopPullDownRefresh', () => {
fxy060608's avatar
fxy060608 已提交
129 130 131 132
    webview.endPullToRefresh()
  })

  return webview
fxy060608's avatar
init v3  
fxy060608 已提交
133 134 135 136
}

export function createPreloadWebview () {
  if (!preloadWebview || preloadWebview.__uniapp_route) { // 不存在,或已被使用
137 138 139
    preloadWebview = plus.webview.create(VIEW_WEBVIEW_PATH, String(id++))
    if (process.env.NODE_ENV !== 'production') {
      console.log(`[uni-app] preloadWebview[${preloadWebview.id}]`)
fxy060608's avatar
fxy060608 已提交
140
    }
fxy060608's avatar
init v3  
fxy060608 已提交
141 142 143 144 145 146 147 148 149 150 151 152 153 154
  }
  return preloadWebview
}

const webviewReadyCallbacks = {}

export function registerWebviewReady (pageId, callback) {
  (webviewReadyCallbacks[pageId] || (webviewReadyCallbacks[pageId] = [])).push(callback)
}

export function consumeWebviewReady (pageId) {
  const callbacks = webviewReadyCallbacks[pageId]
  Array.isArray(callbacks) && callbacks.forEach(callback => callback())
  delete webviewReadyCallbacks[pageId]
fxy060608's avatar
fxy060608 已提交
155
}