在页面重新加载时丢失JavaScriptCore绑定

时间:2014-05-12 12:02:29

标签: webkit javascriptcore

我在webview中使用Javascriptcore创建了c ++绑定,因此我的c ++ fns。和对象可以从html访问。 我已按照本教程创建这些绑定。 http://parmanoir.com/Taming_JavascriptCore_within_and_without_WebView

在重新加载页面之前,我没有创建和使用绑定的问题。 我打电话给" location.reload()"在我的html页面中,我丢失了所有绑定。

示例html代码是:

<html>

<head>
    <style type="text/css">
    body {
        background-color: transparent;
    }
    p {
        color: black;
        background-color: rgb(255, 0, 255);
        position: absolute;
        top: 0;
        left: 5;
        margin: 0;
        padding: 0;
    }
    </style>

    <script type="text/javascript" language="JavaScript1.4"><!--

    function testDummyModule()
    {
        if ( window.Dummy ) 
        {   
            console.log("*** Dummy ID: " + window.Dummy.id);

        }
        else 
        {
            console.log("[!] Dummy not supported.");

        }

    }

    function init()
    {
        console.log("Testing Dummy");
        testDummyModule();
        console.log("Finished testing Dummy");
        location.reload();

    }

    </script>
</head>
    <body onload="init();">
        <!--<p> This Page is loading without any problems</p>
        <br>-->
        <div id="test"></div>
        <div id="text">Test Page</div>
    </body>
</html>

在调用location.reload后重新加载页面时,我收到错误:&#34; Dummy,不支持。&#34;

我尝试重新创建绑定(通过删除创建bindigs的c ++类并再次创建它们),一旦我调用setUrl,但我仍然得到同样的错误。

任何线索,我怎样才能再次使绑定可用

1 个答案:

答案 0 :(得分:0)

通过重新加载页面webkit接收新页面的新“全局”上下文,并且必须将绑定添加到此新上下文中。应该不需要删除绑定并重新创建它们,只需将它们添加到这个新的上下文中即可。

我不确定您的C ++代码是什么样的,但是例如我刚刚在我的Javascript绑定类中添加了一个重绑定函数,该类从webkit接收新的上下文并重新绑定“虚拟”对象。

void JsDummy::rebind(JSGlobalContextRef ctx)
{
    // m_jsDummyClassRef is a JSClassRef created and stored in the JsDummy class
    JSObjectRef JsDummyObjectRef = JSObjectMake(ctx, m_jsDummyClassRef, this);

    JSObjectRef globalObjectRef = JSContextGetGlobalObject(ctx);
    JSStringRef DummyName = JSStringCreateWithUTF8CString("Dummy");

    // Attach the JavaSript object "Dummy" to the new global context
    JSObjectSetProperty(ctx, globalObjectRef, DummyName, JsDummyObjectRef, kJSPropertyAttributeDontDelete, 0);
    JSStringRelease(DummyName);
}

希望有所帮助。