ccc组件webview,在切换场景时报错

  • Creator 版本:2.0.8

  • 目标平台:浏览器

  • 详细报错信息,包含调用堆栈:

  • 重现方式:
    前提 : 没有给场景做自动释放,也没有给手动或自动加载的资源做自动释放的设置
    1,创建一个包含cc.webview的预制
    2,该预制的parent设置为引擎的常驻节点
    3,切换场景,就会报错,并且报错是关于“同源”问题,见图片
    注:1,ccc官网提到,webview的同源问题需要自己解决,我们已经通过postMessage搞定,但是我很好奇,切换场景怎么也会报“同源策略”的错误,麻烦引擎组或者同学解答一下。

  • 出现概率:必现

  • 额外线索:


    WebviewTest.rar (553.7 KB)

我看下。

我这边按照复现步骤没能复现问题,你看下是否可以给我一个demo,并说明测试平台?

我正在整理demo,没有复现,后来我又复盘我的代码,我发现了原因:在webview加载完成的回调中加了一句话:

浏览器测试,chrome浏览器,ccc版本是2.0.8,
demo已经上传,麻烦啦!

另外还有个问题,在切换场景时,为什么webview中的网页会被从新刷新?这个出乎意料的,这个是引擎的bug还是说就该这样?
webview是加到了常驻节点上,难道是因为这个原因吗?

this.iframeContentWindow = webview._impl._iframe.contentWindow;

这句代码执行后,破坏了H5上的同源策略,所以报错。不能把contentWindow放到另外的内存空间上。
建议你换个思路,避开这个问题。

webview没有刷新,只不过是node节点应该被常驻了,所以他本身的监听事件:“loaded”、“loading” 触发了监听事件,所以你可以在某一个合理的时机,及时的关闭监听即可。

感谢回复,
第一个问题,this.iframeContentWindow = webview._impl._iframe.contentWindow;我换了思路书写
第二个问题:webview有没有被刷新呢?我的理解如下:因为我的webview节点是在常驻节点上,我看了下源码,在切换场景时常驻节点的parent会被重新赋值(新的父节点是scene):
这就会导致CCWebView的onEnable再次被触发执行,onEnable中执行了impl.loadURL(this._url); 因此网页从新刷新:

简单的通过注销“loaded”、“loading”,应该是不起作用的吧?

如果有错误,请指出。

刚才的回复忘记@您,希望看下,
我现在怎么做才能不需要每次切换场景都重新请求

嗯,确实重新加载了。
这里给你的方案是:直接修改引擎代码,位置如下:


对这句代码前加一个加载条件,和一个对每次加载的url的缓存。然后通过对比新旧url来判断是否重新加载。

我一会提个PR,修复下这个问题。