在编程或者QA测试过程中,把debug的包中JS错误打印在屏幕上可以增加开发效率,降低定位bug时间成本。
重写reportError把错误展示在屏幕上,并支持关闭操作
- 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);
- }