Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Qt WebKit
  4. Get confirmation that a key has reached JS
Forum Updated to NodeBB v4.3 + New Features

Get confirmation that a key has reached JS

Scheduled Pinned Locked Moved Solved Qt WebKit
webview webkitjscriptkeyevent
33 Posts 4 Posters 12.7k Views 4 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • K Konstantin Tokarev

    @McLion No, they go to JS console. You can see it in Inspector, or handle QWebPage::javaScriptConsoleMessage signal

    McLionM Offline
    McLionM Offline
    McLion
    wrote on last edited by
    #8

    @Konstantin-Tokarev

    Ahhh ... OK ... Thanks a lot.
    Never saw the 'Inspector' and will try to read it up ... is it also part of webKit in Qt?
    I know the inspector on desktop browser but it won't help because it unfortunately does not show the issue there.
    I'll try (tomorrow) to connect the signal to a slot and use qDebug() in there.

    McLionM 1 Reply Last reply
    0
    • McLionM McLion

      @Konstantin-Tokarev

      Ahhh ... OK ... Thanks a lot.
      Never saw the 'Inspector' and will try to read it up ... is it also part of webKit in Qt?
      I know the inspector on desktop browser but it won't help because it unfortunately does not show the issue there.
      I'll try (tomorrow) to connect the signal to a slot and use qDebug() in there.

      McLionM Offline
      McLionM Offline
      McLion
      wrote on last edited by
      #9

      @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.

      K 1 Reply Last reply
      0
      • McLionM McLion

        @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.

        K Offline
        K Offline
        Konstantin Tokarev
        wrote on last edited by
        #10

        @McLion Right, I've mixed it up with new consoleMessageReceived() signal that is present in revived QtWebKit only (since TP3)

        McLionM 1 Reply Last reply
        1
        • K Konstantin Tokarev

          @McLion Right, I've mixed it up with new consoleMessageReceived() signal that is present in revived QtWebKit only (since TP3)

          McLionM Offline
          McLionM Offline
          McLion
          wrote on last edited by
          #11

          @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()?

          K 1 Reply Last reply
          0
          • McLionM McLion

            @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()?

            K Offline
            K Offline
            Konstantin Tokarev
            wrote on last edited by
            #12

            @McLion QWebView::setPage

            McLionM 2 Replies Last reply
            0
            • K Konstantin Tokarev

              @McLion QWebView::setPage

              McLionM Offline
              McLionM Offline
              McLion
              wrote on last edited by
              #13

              @Konstantin-Tokarev
              Thanks .. seems to be too late for today ... I don't get it to build ... dam...

              1 Reply Last reply
              0
              • K Konstantin Tokarev

                @McLion QWebView::setPage

                McLionM Offline
                McLionM Offline
                McLion
                wrote on last edited by
                #14

                @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'

                K mrjjM 3 Replies Last reply
                0
                • McLionM McLion

                  @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'

                  K Offline
                  K Offline
                  Konstantin Tokarev
                  wrote on last edited by
                  #15
                  This post is deleted!
                  1 Reply Last reply
                  0
                  • McLionM McLion

                    @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'

                    mrjjM Offline
                    mrjjM Offline
                    mrjj
                    Lifetime Qt Champion
                    wrote on last edited by
                    #16

                    Hi
                    webGUI->setPage(DBGWebPage::DebugWebPage);
                    I would expect be something like
                    DBGWebPage *page=new DBGWebPage();
                    webGUI->setPage(page->DebugWebPage);

                    The other syntax seems odd ?

                    McLionM 1 Reply Last reply
                    0
                    • McLionM McLion

                      @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'

                      K Offline
                      K Offline
                      Konstantin Tokarev
                      wrote on last edited by
                      #17

                      @McLion You derive DBGWebPage from QWebPage and add QWebPage* field to it, then try to use that QWebPage* field (which is vanilla QWebPage, not DBGWebPage) as it was static filed of DBGWebPage.

                      1 Reply Last reply
                      0
                      • mrjjM mrjj

                        Hi
                        webGUI->setPage(DBGWebPage::DebugWebPage);
                        I would expect be something like
                        DBGWebPage *page=new DBGWebPage();
                        webGUI->setPage(page->DebugWebPage);

                        The other syntax seems odd ?

                        McLionM Offline
                        McLionM Offline
                        McLion
                        wrote on last edited by McLion
                        #18

                        @mrjj
                        Thanks.
                        In fact, the other syntax seemed wrong.
                        You code builds without error, however, crashes with SIGSEGV.

                        K 1 Reply Last reply
                        0
                        • McLionM McLion

                          @mrjj
                          Thanks.
                          In fact, the other syntax seemed wrong.
                          You code builds without error, however, crashes with SIGSEGV.

                          K Offline
                          K Offline
                          Konstantin Tokarev
                          wrote on last edited by
                          #19

                          @McLion Because it should be

                          DBGWebPage *page=new DBGWebPage();
                          webGUI->setPage(page);

                          1 Reply Last reply
                          0
                          • McLionM Offline
                            McLionM Offline
                            McLion
                            wrote on last edited by
                            #20

                            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.

                            1 Reply Last reply
                            0
                            • K Offline
                              K Offline
                              Konstantin Tokarev
                              wrote on last edited by
                              #21

                              remove DebugWebPage and all code messing with it

                              McLionM 1 Reply Last reply
                              0
                              • McLionM Offline
                                McLionM Offline
                                McLion
                                wrote on last edited by
                                #22

                                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;
                                }
                                
                                1 Reply Last reply
                                0
                                • K Konstantin Tokarev

                                  remove DebugWebPage and all code messing with it

                                  McLionM Offline
                                  McLionM Offline
                                  McLion
                                  wrote on last edited by
                                  #23

                                  @Konstantin-Tokarev
                                  Did so - all removed.

                                  1 Reply Last reply
                                  0
                                  • McLionM Offline
                                    McLionM Offline
                                    McLion
                                    wrote on last edited by McLion
                                    #24

                                    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?

                                    A 1 Reply Last reply
                                    0
                                    • McLionM Offline
                                      McLionM Offline
                                      McLion
                                      wrote on last edited by McLion
                                      #25

                                      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.

                                      A 1 Reply Last reply
                                      0
                                      • McLionM McLion

                                        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.

                                        A Offline
                                        A Offline
                                        ambershark
                                        wrote on last edited by
                                        #26

                                        @McLion Throw it in gdb or your debugger of choice and give us a backtrace and we can probably tell ya what the issue is.

                                        My L-GPL'd C++ Logger github.com/ambershark-mike/sharklog

                                        McLionM 1 Reply Last reply
                                        0
                                        • A ambershark

                                          @McLion Throw it in gdb or your debugger of choice and give us a backtrace and we can probably tell ya what the issue is.

                                          McLionM Offline
                                          McLionM Offline
                                          McLion
                                          wrote on last edited by
                                          #27

                                          @ambershark
                                          Unfortunately, I don't have any debugger running on this eLinux target.

                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved