提交 65d6b880 编写于 作者: Q qiang

Merge branch 'dev' into alpha

const WINDOW_NAMES = ['VUniLeftWindow', 'VUniTopWindow', 'VUniRightWindow']
export function checkInWindows (vm) {
if (__PLATFORM__ !== 'h5') {
return false
}
while (vm) {
if (WINDOW_NAMES.indexOf(vm.$options.name) !== -1) {
return true
}
vm = vm.$parent
}
}
import createCallbacks from 'uni-helpers/callbacks'
import {
checkInWindows
} from 'uni-helpers/windows'
import {
getCurrentPageVm
} from '../../platform'
......@@ -14,27 +16,27 @@ const defaultOptions = {
class ServiceIntersectionObserver {
constructor (component, options) {
this.pageId = component.$page.id
this.pageId = component.$page && component.$page.id
this.component = component._$id || component // app-plus 平台传输_$id
this.options = Object.assign({}, defaultOptions, options)
}
}
_makeRootMargin (margins = {}) {
this.options.rootMargin = ['top', 'right', 'bottom', 'left'].map(name => `${Number(margins[name]) || 0}px`).join(
' ')
}
}
relativeTo (selector, margins) {
this.options.relativeToSelector = selector
this._makeRootMargin(margins)
return this
}
}
relativeToViewport (margins) {
this.options.relativeToSelector = null
this._makeRootMargin(margins)
return this
}
}
observe (selector, callback) {
if (typeof callback !== 'function') {
......@@ -48,13 +50,13 @@ class ServiceIntersectionObserver {
reqId: this.reqId,
component: this.component,
options: this.options
}, this.pageId)
}
}, checkInWindows(this.component) ? this.component : this.pageId)
}
disconnect () {
UniServiceJSBridge.publishHandler('destroyComponentObserver', {
reqId: this.reqId
}, this.pageId)
}, checkInWindows(this.component) ? this.component : this.pageId)
}
}
......@@ -67,4 +69,4 @@ export function createIntersectionObserver (context, options) {
return new ServiceIntersectionObserver(context, options)
}
return new ServiceIntersectionObserver(getCurrentPageVm('createIntersectionObserver'), options)
}
}
import createCallbacks from 'uni-helpers/callbacks'
import {
getCurrentPageVm
} from '../../platform'
const createMediaQueryObserverCallbacks = createCallbacks('requestMediaQueryObserver')
class ServiceMediaQueryObserver {
constructor (component, options) {
this.pageId = component.$page.id
this.component = component._$id || component // app-plus 平台传输_$id
this.options = options
}
observe (options, callback) {
if (typeof callback !== 'function') {
return
}
this.options = options
this.reqId = createMediaQueryObserverCallbacks.push(callback)
UniServiceJSBridge.publishHandler('requestMediaQueryObserver', {
reqId: this.reqId,
component: this.component,
options: this.options
}, this.pageId)
}
disconnect () {
UniServiceJSBridge.publishHandler('destroyMediaQueryObserver', {
reqId: this.reqId
}, this.pageId)
}
}
export function createMediaQueryObserver (context, options) {
if (!context._isVue) {
options = context
context = null
}
if (context) {
return new ServiceMediaQueryObserver(context, options)
}
return new ServiceMediaQueryObserver(getCurrentPageVm('createMediaQueryObserver'), options)
}
import createCallbacks from 'uni-helpers/callbacks'
import {
getCurrentPageVm
} from '../../platform'
const createMediaQueryObserverCallbacks = createCallbacks('requestMediaQueryObserver')
class ServiceMediaQueryObserver {
constructor (component, options) {
this.pageId = component.$page && component.$page.id
this.component = component._$id || component // app-plus 平台传输_$id
this.options = options
}
observe (options, callback) {
if (typeof callback !== 'function') {
return
}
this.options = options
this.reqId = createMediaQueryObserverCallbacks.push(callback)
UniServiceJSBridge.publishHandler('requestMediaQueryObserver', {
reqId: this.reqId,
component: this.component,
options: this.options
})
}
disconnect () {
UniServiceJSBridge.publishHandler('destroyMediaQueryObserver', {
reqId: this.reqId
})
}
}
export function createMediaQueryObserver (context, options) {
if (!context._isVue) {
options = context
context = null
}
if (context) {
return new ServiceMediaQueryObserver(context, options)
}
return new ServiceMediaQueryObserver(getCurrentPageVm('createMediaQueryObserver'), options)
}
......@@ -124,16 +124,17 @@ export function requestComponentInfo ({
reqId,
reqs
}, pageId) {
const pages = getCurrentPages() // 跨平台时,View 层也应该实现该方法,举例 App 上,View 层的 getCurrentPages 返回长度为1的当前页面数组
const page = pages.find(page => page.$page.id === pageId)
if (!page) {
throw new Error(`Not Found:Page[${pageId}]`)
let pageVm
if (pageId._isVue) {
pageVm = pageId
} else {
const pages = getCurrentPages() // 跨平台时,View 层也应该实现该方法,举例 App 上,View 层的 getCurrentPages 返回长度为1的当前页面数组
const page = pages.find(page => page.$page.id === pageId)
if (!page) {
throw new Error(`Not Found:Page[${pageId}]`)
}
pageVm = page.$vm
}
const pageVm = page.$vm
const result = []
reqs.forEach(function ({
component,
......@@ -151,5 +152,5 @@ export function requestComponentInfo ({
UniViewJSBridge.publishHandler('onRequestComponentInfo', {
reqId,
res: result
}, pageId)
})
}
......@@ -26,20 +26,19 @@ export function requestComponentObserver ({
component,
options
}, pageId) {
const pages = getCurrentPages()
const page = pages.find(page => page.$page.id === pageId)
if (!page) {
throw new Error(`Not Found:Page[${pageId}]`)
}
const pageVm = page.$vm
let pageVm
if (pageId._isVue) {
pageVm = pageId
} else {
const pages = getCurrentPages() // 跨平台时,View 层也应该实现该方法,举例 App 上,View 层的 getCurrentPages 返回长度为1的当前页面数组
const page = pages.find(page => page.$page.id === pageId)
if (!page) {
throw new Error(`Not Found:Page[${pageId}]`)
}
pageVm = page.$vm
}
const $el = findElm(component, pageVm)
const root = options.relativeToSelector ? $el.querySelector(options.relativeToSelector) : null
const intersectionObserver = intersectionObservers[reqId] = new IntersectionObserver((entries, observer) => {
entries.forEach(entrie => {
UniViewJSBridge.publishHandler('onRequestComponentObserver', {
......@@ -53,7 +52,7 @@ export function requestComponentObserver ({
dataset: normalizeDataset(entrie.target.dataset || {}),
id: entrie.target.id
}
}, pageVm.$page.id)
})
})
}, {
root,
......@@ -63,11 +62,20 @@ export function requestComponentObserver ({
if (options.observeAll) {
intersectionObserver.USE_MUTATION_OBSERVER = true
Array.prototype.map.call($el.querySelectorAll(options.selector), el => {
if (!el) {
console.warn(`Node ${options.selector} is not found. Intersection observer will not trigger.`)
return
}
intersectionObserver.observe(el)
})
} else {
intersectionObserver.USE_MUTATION_OBSERVER = false
intersectionObserver.observe($el.querySelector(options.selector))
const el = $el.querySelector(options.selector)
if (!el) {
console.warn(`Node ${options.selector} is not found. Intersection observer will not trigger.`)
return
}
intersectionObserver.observe(el)
}
}
......@@ -76,11 +84,11 @@ export function destroyComponentObserver ({
}) {
const intersectionObserver = intersectionObservers[reqId]
if (intersectionObserver) {
intersectionObserver.disconnect()
intersectionObserver.disconnect()
delete intersectionObservers[reqId]
UniViewJSBridge.publishHandler('onRequestComponentObserver', {
reqId,
reqEnd: true
})
}
}
}
......@@ -34,15 +34,6 @@ export function requestMediaQueryObserver ({
reqId,
options
}, pageId) {
const pages = getCurrentPages()
const page = pages.find(page => page.$page.id === pageId)
if (!page) {
throw new Error(`Not Found:Page[${pageId}]`)
}
// const pageVm = page.$vm
// 创建一个媒体查询对象
const mediaQueryObserver = mediaQueryObservers[reqId] = window.matchMedia(handleMediaQueryStr(options))
......@@ -51,7 +42,7 @@ export function requestMediaQueryObserver ({
UniViewJSBridge.publishHandler('onRequestMediaQueryObserver', {
reqId,
res: e.matches
}, pages[pages.length - 1].$page.id)
})
}
listener(mediaQueryObserver) // 监听前执行一次媒体查询
......
......@@ -9,7 +9,16 @@
width="300"
height="150"
/>
<div style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden;">
<div
style="
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
overflow: hidden;
"
>
<slot />
</div>
<v-uni-resize-sensor
......@@ -29,6 +38,7 @@ import {
} from 'uni-helpers/hidpi'
import saveImage from 'uni-platform/helpers/save-image'
import { getSameOriginUrl } from 'uni-platform/helpers/file'
function resolveColor (color) {
color = color.slice(0)
......@@ -300,66 +310,16 @@ export default {
image.onload = function () {
image.ready = true
}
/**
* 从本地文件加载
* @param {string} path 文件路径
*/
function loadFile (path) {
function onError () {
const bitmap = new plus.nativeObj.Bitmap(`bitmap_${Date.now()}_${Math.random()}}`)
bitmap.load(path, function () {
image.src = bitmap.toBase64Data()
bitmap.clear()
}, function () {
bitmap.clear()
image.src = src
})
}
plus.io.resolveLocalFileSystemURL(path, function (entry) {
entry.file(function (file) {
var fileReader = new plus.io.FileReader()
fileReader.onload = function (data) {
image.src = data.target.result
}
fileReader.onerror = onError
fileReader.readAsDataURL(file)
}, onError)
}, onError)
}
/**
* 从网络加载
* @param {string} url 文件地址
*/
function loadUrl (url) {
plus.downloader.createDownload(url, {
filename: '_doc/uniapp_temp/download/'
}, function (d, status) {
if (status === 200) {
loadFile(d.filename)
} else {
image.src = src
}
}).start()
}
if (__PLATFORM__ === 'app-plus') {
// WKWebView
if (window.webkit && window.webkit.messageHandlers) {
if (src.indexOf('file://') === 0) {
loadFile(src)
return
} else if (src.indexOf('http://') === 0 || src.indexOf('https://') === 0) {
loadUrl(src)
return
}
}
// 安卓 WebView 本地路径
if (src.indexOf('file://') === 0 && navigator.vendor === 'Google Inc.') {
image.crossOrigin = 'anonymous'
}
// 安卓 WebView 本地路径
if (__PLATFORM__ === 'app-plus' && navigator.vendor === 'Google Inc.' && src.indexOf('file://') === 0) {
image.crossOrigin = 'anonymous'
}
image.src = src
getSameOriginUrl(src).then(src => {
image.src = src
}).catch(() => {
image.src = src
})
}
})
},
......
function getBase64 (path) {
return new Promise(function (resolve, reject) {
// H5+ 沙箱外路径在iOS无法使用 plus.io 读取
function onError () {
const bitmap = new plus.nativeObj.Bitmap(`bitmap_${Date.now()}_${Math.random()}}`)
bitmap.load(path, function () {
resolve(bitmap.toBase64Data())
bitmap.clear()
}, function (err) {
bitmap.clear()
reject(err)
})
}
plus.io.resolveLocalFileSystemURL(path, function (entry) {
entry.file(function (file) {
var fileReader = new plus.io.FileReader()
fileReader.onload = function (data) {
resolve(data.target.result)
}
fileReader.onerror = onError
fileReader.readAsDataURL(file)
}, onError)
}, onError)
})
}
function download (url) {
return new Promise(function (resolve, reject) {
if (url.indexOf('http://') !== 0 && url.indexOf('https://') !== 0) {
resolve(url)
}
plus.downloader.createDownload(url, {
filename: '_doc/uniapp_temp/download/'
}, function (d, status) {
if (status === 200) {
resolve(d.filename)
} else {
reject(new Error('network fail'))
}
}).start()
})
}
export function getSameOriginUrl (url) {
return download(url).then(function (url) {
// WKWebView
if (window.webkit && window.webkit.messageHandlers) {
return getBase64(url)
}
return url
})
}
......@@ -20,8 +20,9 @@ const publishStateChange = (res) => {
const createDownloadTaskById = function (downloadTaskId, {
url,
header,
timeout = __uniConfig.networkTimeout.downloadFile ? __uniConfig.networkTimeout.downloadFile / 1000 : 120
timeout
} = {}) {
timeout = (timeout || (__uniConfig.networkTimeout && __uniConfig.networkTimeout.request) || 60 * 1000) / 1000
const downloader = plus.downloader.createDownload(url, {
timeout,
filename: TEMP_PATH + '/download/',
......
......@@ -46,7 +46,7 @@ export function createRequestTaskById (requestTaskId, {
responseType,
sslVerify = true,
firstIpv4 = false,
timeout = __uniConfig.networkTimeout.request
timeout = (__uniConfig.networkTimeout && __uniConfig.networkTimeout.request) || 60 * 1000
} = {}) {
const stream = requireNativePlugin('stream')
const headers = {}
......
......@@ -37,8 +37,8 @@ export function login (params, callbackId) {
}, provider === 'apple' ? { scope: 'email' } : params.univerifyStyle || {})
}
// 先注销再登录
// apple登录logout之后无法重新触发获取email,fullname
if (provider === 'apple') {
// apple登录logout之后无法重新触发获取email,fullname;一键登录无logout
if (provider === 'apple' || provider === 'univerify') {
login()
} else {
service.logout(login, login)
......@@ -137,4 +137,4 @@ export function onAuthViewOtherLoginButtonClick (callbackId) {
export function closeAuthView () {
getService('univerify').then(service => service.closeAuthView())
}
}
......@@ -73,8 +73,9 @@ export default {
left: 0;
top: 0;
width: 100%;
height: 100%;
background: black;
height: 100%;
z-index: 999;
background: rgba(0,0,0,0.8);
}
.uni-system-preview-image-swiper {
position: absolute;
......
......@@ -93,6 +93,15 @@ export function fileToUrl (file) {
return url
}
export function getSameOriginUrl (url) {
const a = document.createElement('a')
a.href = url
if (a.origin === location.origin) {
return Promise.resolve(url)
}
return urlToFile(url).then(fileToUrl)
}
export function revokeObjectURL (url) {
(window.URL || window.webkitURL).revokeObjectURL(url)
delete files[url]
......
......@@ -46,7 +46,7 @@ class DownloadTask {
export function downloadFile ({
url,
header,
timeout = (__uniConfig.networkTimeout && __uniConfig.networkTimeout.downloadFile) || 60 * 1000
timeout = (__uniConfig.networkTimeout && __uniConfig.networkTimeout.request) || 60 * 1000
}, callbackId) {
const {
invokeCallbackHandler: invoke
......
import createCallbacks from 'uni-helpers/callbacks'
import {
checkInWindows
} from 'uni-helpers/windows'
const requestComponentInfoCallbacks = createCallbacks('requestComponentInfo')
......@@ -6,5 +9,5 @@ export function requestComponentInfo (pageVm, queue, callback) {
UniServiceJSBridge.publishHandler('requestComponentInfo', {
reqId: requestComponentInfoCallbacks.push(callback),
reqs: queue
}, pageVm.$page.id)
}, checkInWindows(pageVm) ? pageVm : pageVm.$page.id)
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册