Merge pull request #12301 from jianglong0156/webviewCrash

fix webview crash in android
This commit is contained in:
pandamicro 2015-06-12 08:12:14 +08:00
commit 9acc51a5eb
1 changed files with 64 additions and 49 deletions

View File

@ -20,20 +20,23 @@ static bool jsb_cocos2dx_experimental_webView_setOnShouldStartLoading(JSContext
JS::CallArgs args = JS::CallArgsFromVp(argc, vp); JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
std::shared_ptr<JSFunctionWrapper> func(new JSFunctionWrapper(cx, obj, args.get(0))); std::shared_ptr<JSFunctionWrapper> func(new JSFunctionWrapper(cx, obj, args.get(0)));
cobj->setOnShouldStartLoading([=](experimental::ui::WebView *sender, const std::string &url)->bool{ cobj->setOnShouldStartLoading([=](experimental::ui::WebView *sender, const std::string &url)->bool{
jsval arg[2]; Director::getInstance()->getScheduler()->performFunctionInCocosThread([=]
js_proxy_t *proxy = js_get_or_create_proxy(cx, sender); {
if(proxy) JSB_AUTOCOMPARTMENT_WITH_GLOBAL_OBJCET
arg[0] = OBJECT_TO_JSVAL(proxy->obj); jsval arg[2];
else js_proxy_t *proxy = js_get_or_create_proxy(cx, sender);
arg[0] = JSVAL_NULL; if(proxy)
arg[1] = std_string_to_jsval(cx, url); arg[0] = OBJECT_TO_JSVAL(proxy->obj);
JS::RootedValue rval(cx); else
arg[0] = JSVAL_NULL;
arg[1] = std_string_to_jsval(cx, url);
JS::RootedValue rval(cx);
bool ok = func->invoke(2, arg, &rval); bool ok = func->invoke(2, arg, &rval);
if (!ok && JS_IsExceptionPending(cx)) { if (!ok && JS_IsExceptionPending(cx)) {
JS_ReportPendingException(cx); JS_ReportPendingException(cx);
} }
return true; });
}); });
return true; return true;
} }
@ -50,19 +53,23 @@ static bool jsb_cocos2dx_experimental_webView_setOnDidFinishLoading(JSContext *c
JS::CallArgs args = JS::CallArgsFromVp(argc, vp); JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
std::shared_ptr<JSFunctionWrapper> func(new JSFunctionWrapper(cx, obj, args.get(0))); std::shared_ptr<JSFunctionWrapper> func(new JSFunctionWrapper(cx, obj, args.get(0)));
cobj->setOnDidFinishLoading([=](experimental::ui::WebView *sender, const std::string &url)->void{ cobj->setOnDidFinishLoading([=](experimental::ui::WebView *sender, const std::string &url)->void{
jsval arg[2]; Director::getInstance()->getScheduler()->performFunctionInCocosThread([=]
js_proxy_t *proxy = js_get_or_create_proxy(cx, sender); {
if(proxy) JSB_AUTOCOMPARTMENT_WITH_GLOBAL_OBJCET
arg[0] = OBJECT_TO_JSVAL(proxy->obj); jsval arg[2];
else js_proxy_t *proxy = js_get_or_create_proxy(cx, sender);
arg[0] = JSVAL_NULL; if(proxy)
arg[1] = std_string_to_jsval(cx, url); arg[0] = OBJECT_TO_JSVAL(proxy->obj);
JS::RootedValue rval(cx); else
arg[0] = JSVAL_NULL;
arg[1] = std_string_to_jsval(cx, url);
JS::RootedValue rval(cx);
bool ok = func->invoke(2, arg, &rval); bool ok = func->invoke(2, arg, &rval);
if (!ok && JS_IsExceptionPending(cx)) { if (!ok && JS_IsExceptionPending(cx)) {
JS_ReportPendingException(cx); JS_ReportPendingException(cx);
} }
});
}); });
return true; return true;
} }
@ -79,19 +86,23 @@ static bool jsb_cocos2dx_experimental_webView_setOnDidFailLoading(JSContext *cx,
JS::CallArgs args = JS::CallArgsFromVp(argc, vp); JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
std::shared_ptr<JSFunctionWrapper> func(new JSFunctionWrapper(cx, obj, args.get(0))); std::shared_ptr<JSFunctionWrapper> func(new JSFunctionWrapper(cx, obj, args.get(0)));
cobj->setOnDidFailLoading([=](experimental::ui::WebView *sender, const std::string &url)->void{ cobj->setOnDidFailLoading([=](experimental::ui::WebView *sender, const std::string &url)->void{
jsval arg[2]; Director::getInstance()->getScheduler()->performFunctionInCocosThread([=]
js_proxy_t *proxy = js_get_or_create_proxy(cx, sender); {
if(proxy) JSB_AUTOCOMPARTMENT_WITH_GLOBAL_OBJCET
arg[0] = OBJECT_TO_JSVAL(proxy->obj); jsval arg[2];
else js_proxy_t *proxy = js_get_or_create_proxy(cx, sender);
arg[0] = JSVAL_NULL; if(proxy)
arg[1] = std_string_to_jsval(cx, url); arg[0] = OBJECT_TO_JSVAL(proxy->obj);
JS::RootedValue rval(cx); else
arg[0] = JSVAL_NULL;
arg[1] = std_string_to_jsval(cx, url);
JS::RootedValue rval(cx);
bool ok = func->invoke(2, arg, &rval); bool ok = func->invoke(2, arg, &rval);
if (!ok && JS_IsExceptionPending(cx)) { if (!ok && JS_IsExceptionPending(cx)) {
JS_ReportPendingException(cx); JS_ReportPendingException(cx);
} }
});
}); });
return true; return true;
} }
@ -108,19 +119,23 @@ static bool jsb_cocos2dx_experimental_webView_setOnJSCallback(JSContext *cx, uin
JS::CallArgs args = JS::CallArgsFromVp(argc, vp); JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
std::shared_ptr<JSFunctionWrapper> func(new JSFunctionWrapper(cx, obj, args.get(0))); std::shared_ptr<JSFunctionWrapper> func(new JSFunctionWrapper(cx, obj, args.get(0)));
cobj->setOnJSCallback([=](experimental::ui::WebView *sender, const std::string &url)->void{ cobj->setOnJSCallback([=](experimental::ui::WebView *sender, const std::string &url)->void{
jsval arg[2]; Director::getInstance()->getScheduler()->performFunctionInCocosThread([=]
js_proxy_t *proxy = js_get_or_create_proxy(cx, sender); {
if(proxy) JSB_AUTOCOMPARTMENT_WITH_GLOBAL_OBJCET
arg[0] = OBJECT_TO_JSVAL(proxy->obj); jsval arg[2];
else js_proxy_t *proxy = js_get_or_create_proxy(cx, sender);
arg[0] = JSVAL_NULL; if(proxy)
arg[1] = std_string_to_jsval(cx, url); arg[0] = OBJECT_TO_JSVAL(proxy->obj);
JS::RootedValue rval(cx); else
arg[0] = JSVAL_NULL;
arg[1] = std_string_to_jsval(cx, url);
JS::RootedValue rval(cx);
bool ok = func->invoke(2, arg, &rval); bool ok = func->invoke(2, arg, &rval);
if (!ok && JS_IsExceptionPending(cx)) { if (!ok && JS_IsExceptionPending(cx)) {
JS_ReportPendingException(cx); JS_ReportPendingException(cx);
} }
});
}); });
return true; return true;
} }