Get confirmation that a key has reached JS
-
@McLion
Activated the inspector with the following line:
QWebSettings::globalSettings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
Basically works. However, as soon as I have the inspector turned on my webView's do behave very strange, like they do not get all inputs anymore, and I can not debug the situation.Looks like I need to implement
QWebPage::javaScriptConsoleMessage
and send the messages back to C++ and debug from there.
According docs this is not a signal so I can not simply connect to it. -
@Konstantin-Tokarev
Need some help ...
I have the following:
in h:#include <QWebPage> class DBGWebPage : public QWebPage { Q_OBJECT public: explicit DBGWebPage(QObject *parent = 0); protected: void javaScriptConsoleMessage( const QString & message, int lineNumber, const QString & sourceID ); };
in cpp:
void DBGWebPage::javaScriptConsoleMessage( const QString & message, int lineNumber, const QString & sourceID ) { qDebug() << message << lineNumber << sourceID; }
and my webGUI's are derived from qWebView:
QWebView *webGUI = new QWebView(QTGUI_MainWindow::centralWidget());
How do I make it use the reimplementation of javaScriptConsoleMessage()?
-
@Konstantin-Tokarev
Thanks .. seems to be too late for today ... I don't get it to build ... dam... -
@Konstantin-Tokarev
There's something I don't get ... probably soemthing with these C++ classes I'm always stumbling over:#include <QWebPage> class DBGWebPage : public QWebPage { Q_OBJECT public: explicit DBGWebPage(QObject *parent = 0); QWebPage *DebugWebPage; protected: void javaScriptConsoleMessage( const QString & message, int lineNumber, const QString & sourceID ); };
DBGWebPage::DBGWebPage(QObject *parent) : QWebPage(parent) { //QWebPage* DebugWebPage = new QWebPage; DebugWebPage = new QWebPage(this); }
QWebView * QTGUI_MainWindow::CreateNewWebGUI(int iID) { // check if already existing if(webGUIMap.value(iID) != 0) { qDebug("GUI %d existing", iID); return false; } // check for max GUI count here if(iID > GUI_COUNT_MAX) { qDebug("GUI %d failed - Max GUI ID is %d", iID, GUI_COUNT_MAX); return false; } // create new webGUI and add it to the list QWebView *webGUI = new QWebView(QTGUI_MainWindow::centralWidget()); webGUIMap.insert(iID, webGUI); // make some basic settings to the new GUI webGUI->setPage(DBGWebPage::DebugWebPage); webGUI->setObjectName(QString::fromUtf8("webGUI%1").arg(iID)); ......
Fehler:object missing in reference to 'DBGWebPage::DebugWebPage'
-
This post is deleted!
-
I somehow understand all you're saying, but I so far am not able to modify my code to not crash.
Currently ended up with (modified to it while Konstantin was writing it too):DBGWebPage *page=new DBGWebPage(); webGUI->setPage(page);
and an empty constructor.
Still crashing .... I'm stumped. -
remove DebugWebPage and all code messing with it
-
Found something.
It actually works if comment 2 signal connects for the page, but I need these two.- networkAccessManager for SSL errors
- and the JS bridge
If the page has been set, do I need to connect these in a different way or do these now go to the wrong object?
QWebView * QTGUI_MainWindow::CreateNewWebGUI(int iID) { // check if already existing if(webGUIMap.value(iID) != 0) { qDebug("GUI %d existing", iID); return false; } // check for max GUI count here if(iID > GUI_COUNT_MAX) { qDebug("GUI %d failed - Max GUI ID is %d", iID, GUI_COUNT_MAX); return false; } // create new webGUI and add it to the list QWebView *webGUI = new QWebView(QTGUI_MainWindow::centralWidget()); webGUIMap.insert(iID, webGUI); // make some basic settings to the new GUI DBGWebPage *page=new DBGWebPage(); webGUI->setPage(page); webGUI->setObjectName(QString::fromUtf8("webGUI%1").arg(iID)); //qDebug() << "New webGUI:" << webGUI; //qDebug() << "Map:" << iID << webGUIMap.value(iID); webGUI->setStyleSheet(QString::fromUtf8("background-color: rgba(0, 0, 0, 0);")); webGUI->setUrl(QUrl("about:blank")); webGUI->setRenderHints(QPainter::SmoothPixmapTransform|QPainter::TextAntialiasing); webGUI->page()->mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff); webGUI->page()->mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff); webGUI->setGeometry(0, 0, SCREEN_SIZE_X, SCREEN_SIZE_Y); webGUI->setFocusPolicy(Qt::StrongFocus); webGUI->setMouseTracking(true); webGUI->setAcceptDrops(true); webGUIeventFilter *webGUIEvFil = new webGUIeventFilter; webGUI->installEventFilter(webGUIEvFil); webGUI->hide(); // connect load progress and finished signals connect(webGUI, SIGNAL(loadProgress(int)), ui->webGUIChangeProgressBar, SLOT(setValue(int))); connect(webGUI, SIGNAL(loadFinished(bool)), this, SLOT(webGUI_loadFinished(bool))); // prepare adding objects to JavaScript (bridge from JS to native code) // connect(webGUI->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(populateJavaScriptWindowObject())); // setup SSL error handling // connect(webGUI->page()->networkAccessManager(), SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError> & )), // this, SLOT(HandleGUIsslErrors(QNetworkReply*, const QList<QSslError> & ))); return webGUI; }
-
@Konstantin-Tokarev
Did so - all removed. -
I can not find what I'm doing wrong. The console debug works, as long as I have deactivated the JS bridge.
DBGWebPage *page=new DBGWebPage(); webGUI->setPage(page); // the following lines that use the new page seem to work webGUI->page()->mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff); webGUI->page()->mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff); // and the following line - that I need - let it crash upon boot: connect(webGUI->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(populateJavaScriptWindowObject()));
If I don't use setPage() to change the page that the webView generates by default, the JS bridge works perfectly.
What am I doing wrong to use the page of my own class with the debug added AND use the JS bridge? -
Anyone an idea what I'm doing wrong here?
The code does not crash while connecting. It seems to crashes when the first web page is loaded and the loadProgress or loadFinished signal is sent from the webView.
Edit/Add:
On second thought, it probably crashes when the javaScriptWindowObjectCleared() is called the first time. -
@ambershark
Unfortunately, I don't have any debugger running on this eLinux target. -
@McLion said in Get confirmation that a key has reached JS:
I can not find what I'm doing wrong. The console debug works, as long as I have deactivated the JS bridge.
DBGWebPage *page=new DBGWebPage(); webGUI->setPage(page); // the following lines that use the new page seem to work webGUI->page()->mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff); webGUI->page()->mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff); // and the following line - that I need - let it crash upon boot: connect(webGUI->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(populateJavaScriptWindowObject()));
If I don't use setPage() to change the page that the webView generates by default, the JS bridge works perfectly.
What am I doing wrong to use the page of my own class with the debug added AND use the JS bridge?@McLion Ok if that's the case you'll need to move to using qDebug() or some sort of cout/logfile debugging to figure out what's going on. If you need a logger for linux you're welcome to use mine at https://github.com/ambershark-mike/sharklog. It's not feature complete yet but is definitely more than usable. I use it in a number of projects.
Anyway, my guess with your crash is that
webGUI
orpage()
ormainFrame()
is invalid. One of those is causing the issue almost guaranteed. Assuming the crash is actually on that line. So for instance if you were using my logger you could check it with code like:// sorry for the casts to (int) on the pointers, I don't have hex address/pointer support in the logger yet. // it's a side project I don't have a ton of time for. :) LoggerStream() << "webGUI: " << (int)webGUI << SHARKLOG_END; LoggerStream() << "page: " << (int)webGUI->page() << SHARKLOG_END; LoggerStream() << "mainFrame: " << (int)webGUI->page()->mainFrame() << SHARKLOG_END;
The reason we do all those logs on a separate line is if any of them are bad they will crash. Put these in before your connect and check which object is bad. Probably a null (0), but potentially it has been deleted. If that is the case and it is a dangling pointer it is going to be harder to find without a debugger.