在编程或者QA测试过程中,把debug的包中JS错误打印在屏幕上可以增加开发效率,降低定位bug时间成本。
void ScriptingCore::reportError(JSContext *cx,const char *message,JSErrorReport *report) { js_log("%s:%u:%s\n",report->filename ? report->filename : "<no filename=\"filename\">",(unsigned int) report->lineno,message); // xiaohei add error layer ScriptingCore::getInstance()->showErrorLayer(); }; void ScriptingCore::showErrorLayer() { int delv = 0; auto isDelv = localStorageGetItem("xh_error"); if (!isDelv.empty()) { delv = atoi(isDelv.c_str()); } if (_js_log_buf && delv > 0) { auto winSize = Director::getInstance()->getWinSize(); auto errLayer = LayerColor::create(); errLayer->initWithColor(Color4B(0,0),winSize.width,winSize.height); errLayer->setAnchorPoint(Point(0.5f,0.5f)); errLayer->setPosition(Point(0,0)); errLayer->setOpacity(200); Director::getInstance()->getRunningScene()->addChild(errLayer,10000000,952700); auto listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan = CC_CALLBACK_0(ScriptingCore::onErrorLayerTouchBegin,this); listener->setSwallowTouches(true); Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraPHPriority(listener,errLayer); std::string errlog = _js_log_buf; auto errorLabel = Label::createWithTTF(errlog,"common/font/DFGB_Y7_0.ttf",18); errorLabel->setColor(Color3B::WHITE); errorLabel->setAnchorPoint(Point(0.5f,0.5f)); errorLabel->setPosition(Point(winSize.width / 2.0,winSize.height / 2.0 + 150)); errLayer->addChild(errorLabel,10); std::string path = "res/ui/common/common_close.png"; auto swapMenuItem = MenuItemImage::create(path,path,CC_CALLBACK_0(ScriptingCore::removeErrorLayer,this)); auto swapMenu = Menu::createWithItem(swapMenuItem); swapMenu->setPosition(winSize.width - 100,winSize.height - 100); errLayer->addChild(swapMenu,100); } } bool ScriptingCore::onErrorLayerTouchBegin() { return true; } void ScriptingCore::removeErrorLayer() { Director::getInstance()->getRunningScene()->removeChildByTag(952700); }重写reportError把错误展示在屏幕上,并支持关闭操作