diff -r 000000000000 -r 1450b09d0cfd ginebra/chromerenderer.cpp --- /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 +#include +#include +// ------------------------------------------------------- + +// 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(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); +} +*/