ginebra/chromerenderer.cpp
changeset 0 1450b09d0cfd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ginebra/chromerenderer.cpp	Tue May 04 12:39:35 2010 +0300
@@ -0,0 +1,253 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+#include "chromerenderer.h"
+#include "chromewidget.h"
+#include <Qt>
+#include <QNetworkProxy>
+#include <QNetworkAccessManager>
+// -------------------------------------------------------
+
+// Simple wrapper class for QWebPage to allow intercepting of javascript errors in the chrome.
+class ChromeWebPage : public QWebPage {
+  public:
+    ChromeWebPage(ChromeRenderer *renderer) : QWebPage(renderer) {
+        qDebug() << "ChromeWebPage::ChromeWebPage";
+        #if (defined(Q_OS_SYMBIAN) && !defined(Q_CC_NOKIAX86))
+            // empty proxy only for ARMV5 Symbian targets
+        #else
+            networkAccessManager()->setProxy((QNetworkProxy(QNetworkProxy::HttpProxy,QString("bswebproxy01.americas.nokia.com"), 8080)));
+        #endif
+    }
+
+    // Called when javascript errors are hit in the chrome page.
+    virtual void javaScriptConsoleMessage(const QString & message, int lineNumber, const QString & sourceID) {
+        qDebug() << "Chrome javascript error:";
+        qDebug() << (const char*)QString("  %1:%2 %3")
+                    .arg(sourceID)
+                    .arg(lineNumber)
+                    .arg(message).toAscii();
+    }
+};
+
+
+// -------------------------------------------------------
+
+ChromeRenderer::ChromeRenderer(QWidget *parent)
+  : QWidget(parent),
+    m_page(0),
+    m_widget(0)
+{
+  setMouseTracking(true);
+}
+
+ChromeRenderer::~ChromeRenderer()
+{
+    if (m_page)
+      m_page->setView(0);
+
+    if (m_page && m_page->parent() == this)
+        delete m_page;
+}
+
+QSize ChromeRenderer::sizeHint() const
+{
+    return QSize(1,1);
+}
+
+QWebPage *ChromeRenderer::page() const
+{
+    if (!m_page) {
+        ChromeRenderer *that = const_cast<ChromeRenderer *>(this);
+        that->setPage(new ChromeWebPage(that));
+    }
+    return m_page;
+}
+
+void ChromeRenderer::setPage(QWebPage* page){
+  if (m_page == page)
+    return;
+  if (m_page) {
+    if (m_page->parent() == this) {
+      delete m_page;
+    } else {
+      m_page->disconnect(this);
+    }
+  }
+  m_page = page;
+  if (m_page) {
+    m_page->setView(this);
+    m_page->setPalette(palette());
+    connect(m_page, SIGNAL(microFocusChanged()),
+        this, SLOT(updateMicroFocus()));
+  }
+  //setAttribute(Qt::WA_OpaquePaintEvent, m_page); // Needed?
+
+  update();
+}
+
+
+bool ChromeRenderer::event(QEvent *e)
+{
+ //qDebug() << "ChromeRenderer::event " << e;
+ if (m_page) {
+    if (e->type() == QEvent::ShortcutOverride) {
+      m_page->event(e);
+
+    } else if (e->type() == QEvent::Leave) {
+      m_page->event(e);
+    }
+  }
+
+  return QWidget::event(e);
+}
+/*
+void ChromeRenderer::resizeEvent(QResizeEvent *e)
+{
+    if (m_page)
+        m_page->setViewportSize(e->size());
+}
+
+
+void ChromeRenderer::paintEvent(QPaintEvent *ev)
+{
+  qDebug() << "ChromeRenderer::paintEvent: " << ev;
+  //if (!m_widget)
+  //      return;
+
+    //QWebFrame *frame = m_page->mainFrame();
+    //QPainter p(this);
+
+    //frame->render(&p, ev->region());
+    //m_widget->repaintRequested(ev->rect());
+
+}
+
+void ChromeRenderer::mouseMoveEvent(QMouseEvent* ev)
+{
+    if (m_page) {
+        const bool accepted = ev->isAccepted();
+        m_page->event(ev);
+        ev->setAccepted(accepted);
+    }
+}
+
+void ChromeRenderer::mousePressEvent(QMouseEvent* ev)
+{
+  qDebug() << "ChromeRenderer::mousePressEvent: " << ev;
+    if (m_page) {
+        const bool accepted = ev->isAccepted();
+        m_page->event(ev);
+        ev->setAccepted(accepted);
+    }
+}
+
+void ChromeRenderer::mouseDoubleClickEvent(QMouseEvent* ev)
+{
+    if (m_page) {
+        const bool accepted = ev->isAccepted();
+        m_page->event(ev);
+        ev->setAccepted(accepted);
+    }
+}
+
+void ChromeRenderer::mouseReleaseEvent(QMouseEvent* ev)
+{
+    if (m_page) {
+        const bool accepted = ev->isAccepted();
+        m_page->event(ev);
+        ev->setAccepted(accepted);
+    }
+}*/
+
+void ChromeRenderer::keyPressEvent(QKeyEvent* ev)
+{
+    //qDebug() << "ChromeRenderer::keyPressEvent: " << ev;
+    bool isAccepted(ev->isAccepted());
+    if (m_page){
+        m_page->event(ev);
+        isAccepted = ev->isAccepted();
+    }
+#ifdef Q_OS_SYMBIAN //this is the hack for symbian fep key handler
+    if(!isAccepted && (ev->key() == Qt::Key_Select || ev->key() == Qt::Key_Return || ev->key() == Qt::Key_Enter)) {
+            emit symbianCarriageReturn();
+            isAccepted = ev->isAccepted();
+    }
+#endif
+    if (!ev->isAccepted()) {
+        //qDebug() << "ChromeRenderer::keyPressEvent: -> accepted";
+        QWidget::keyPressEvent(ev);
+    }
+}
+
+void ChromeRenderer::keyReleaseEvent(QKeyEvent* ev)
+{
+    if (m_page)
+        m_page->event(ev);
+    if (!ev->isAccepted())
+        QWidget::keyReleaseEvent(ev);
+}
+
+void ChromeRenderer::focusInEvent(QFocusEvent* ev)
+{
+    //qDebug() << "ChromeRenderer::focusInEvent: " << ev;
+    if (m_page && ev->reason() != Qt::PopupFocusReason)
+        m_page->event(ev);
+    else
+        QWidget::focusInEvent(ev);
+}
+
+void ChromeRenderer::focusOutEvent(QFocusEvent* ev)
+{
+    //qDebug() << "ChromeRenderer::focusOutEvent: " << ev;
+    if (m_page)
+        m_page->event(ev);
+    else
+        QWidget::focusOutEvent(ev);
+}
+
+bool ChromeRenderer::focusNextPrevChild(bool next)
+{
+    if (m_page && m_page->focusNextPrevChild(next))
+        return true;
+    return QWidget::focusNextPrevChild(next);
+}
+
+void ChromeRenderer::inputMethodEvent(QInputMethodEvent *e)
+{
+    if (m_page)
+       m_page->event(e);
+}
+
+QVariant ChromeRenderer::inputMethodQuery(Qt::InputMethodQuery property) const
+{
+    if (m_page)
+        return m_page->inputMethodQuery(property);
+
+    return QVariant();
+}
+
+/*
+void ChromeRenderer::changeEvent(QEvent *e)
+{
+    if (m_page && e->type() == QEvent::PaletteChange) {
+        m_page->setPalette(palette());
+    }
+    QWidget::changeEvent(e);
+}
+*/