<script lang="ts" setup>
    import URI from 'urijs'

    const page = reactive({
        security: false,
        title: '',
        link: '',
        styles: {
            progress: {
                color: '#42c02e',
                height: '1%',
            },
        },
    })

    onLoad(({ title, link, sub }) => {
        page.title = title ? decodeURIComponent(title) : ''
        page.link = decodeURIComponent(link)

        // 嵌入页面进行二级子页面跳转时，参数会被多次 encode
        if (sub) {
            page.title = decodeURIComponent(page.title)
            page.link = decodeURIComponent(page.link)
        }

        if (!link) {
            Message.toast('页面打开失败，参数错误')
            uni.navigateBack()
            return
        }

        // 设置标题栏为文件名
        if (page.title && page.title !== 'undefined') {
            uni.setNavigationBarTitle({
                title: page.title,
            })
        }

        // #ifdef APP-PLUS
        // 白名单同源检测
        if (isSameOrigin(new URI(page.link))) {
            page.security = true
        } else {
            // 对于不安全或不信任的网站地址或可能触发 plus API 的来源，采用手动创建 webview 的方式打开
            const webview = plus.webview.create(page.link, 'no-security-webview', {
                'uni-app': 'none',
                plusrequire: 'none',
                progress: page.styles.progress,
            })
            webview.addEventListener('loaded', () => {
                // webview.appendJsFile('static/uni.webview.1.5.6.js')
                webview.setJsFile('_www/static/uni.webview.1.5.6.js')
                webview.evalJS(`
                    var style = document.createElement('style')
                    style.id = 'no-security-webview-style'
                    style.innerHTML = 'footer, .semi-upload-add { display: none !important; }'
                    document.body.appendChild(style)
                    var meta = document.createElement('meta')
                    meta.name = 'viewport'
                    meta.content = 'width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no'
                    document.head.appendChild(meta)

                    alert(1)
                    document.addEventListener('UniAppJSBridgeReady', function() {
                        uni.getEnv(function(res) {
                            alert('当前环境：' + JSON.stringify(res));
                        })
                    })
                `)
            })

            const pages = getCurrentPages()
            const currentPage = pages[pages.length - 1]
            const currentWebview = currentPage.$getAppWebview()
            currentWebview.setStyle({ progress: page.styles.progress })
            currentWebview.append(webview)
        }
        // #endif
        // #ifndef APP-PLUS
        page.security = true
        // #endif
    })

    // 安全域白名单，防止 APP 环境的意外注入和非法安全调用 plus API 的问题
    const allows = ['yiring.com']
    // 在安全域白名单中，但仍然需要排除的链接（通常是代理的网站链接）
    const denyLinks = []
    function isSameOrigin(url: URI) {
        if (denyLinks.includes(url.href())) {
            return false
        }

        return allows.some((item) => {
            const regex = new RegExp(`^(.*\\.)?${item}$`, 'i')
            return regex.test(url.hostname())
        })
    }
</script>

<template>
    <view class="wrap" v-if="page.link">
        <template v-if="page.security">
            <web-view :src="page.link" :update-title="!page.title" :webview-styles="page.styles" />
        </template>
    </view>
</template>
