From db14019a23d96bc8a444b6576a5da8bd1cfbc8b0 Mon Sep 17 00:00:00 2001 From: Steve Block Date: Wed, 4 Aug 2010 11:41:34 +0100 Subject: Merge WebKit at r64523 : Initial merge by git. Change-Id: Ibb796c6802e757b1d9b40f58205cfbe4da95fcd4 --- WebKitTools/QtTestBrowser/QtTestBrowser.pro | 4 +- WebKitTools/QtTestBrowser/launcherwindow.cpp | 881 ++++++++++++++++++++++ WebKitTools/QtTestBrowser/launcherwindow.h | 185 +++++ WebKitTools/QtTestBrowser/main.cpp | 1023 +------------------------- WebKitTools/QtTestBrowser/webpage.cpp | 29 + WebKitTools/QtTestBrowser/webview.h | 1 + 6 files changed, 1109 insertions(+), 1014 deletions(-) create mode 100644 WebKitTools/QtTestBrowser/launcherwindow.cpp create mode 100644 WebKitTools/QtTestBrowser/launcherwindow.h (limited to 'WebKitTools/QtTestBrowser') diff --git a/WebKitTools/QtTestBrowser/QtTestBrowser.pro b/WebKitTools/QtTestBrowser/QtTestBrowser.pro index fa16c82..08e0fb8 100644 --- a/WebKitTools/QtTestBrowser/QtTestBrowser.pro +++ b/WebKitTools/QtTestBrowser/QtTestBrowser.pro @@ -2,6 +2,7 @@ TEMPLATE = app SOURCES += \ locationedit.cpp \ + launcherwindow.cpp \ main.cpp \ mainwindow.cpp \ urlloader.cpp \ @@ -12,6 +13,7 @@ SOURCES += \ HEADERS += \ locationedit.h \ + launcherwindow.h \ mainwindow.h \ urlloader.h \ utils.h \ @@ -46,7 +48,7 @@ linux-* { symbian { TARGET.UID3 = 0xA000E543 - TARGET.CAPABILITY = ReadUserData WriteUserData NetworkServices + TARGET.CAPABILITY = ReadUserData WriteUserData NetworkServices Location } contains(QT_CONFIG, opengl) { diff --git a/WebKitTools/QtTestBrowser/launcherwindow.cpp b/WebKitTools/QtTestBrowser/launcherwindow.cpp new file mode 100644 index 0000000..177adea --- /dev/null +++ b/WebKitTools/QtTestBrowser/launcherwindow.cpp @@ -0,0 +1,881 @@ +/* + * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) + * Copyright (C) 2009 Girish Ramakrishnan + * Copyright (C) 2006 George Staikos + * Copyright (C) 2006 Dirk Mueller + * Copyright (C) 2006 Zack Rusin + * Copyright (C) 2006 Simon Hausmann + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "launcherwindow.h" + +bool LauncherWindow::gUseGraphicsView = false; +bool LauncherWindow::gUseCompositing = true; +bool LauncherWindow::gCacheWebView = false; +bool LauncherWindow::gShowFrameRate = false; +bool LauncherWindow::gResizesToContents = false; +bool LauncherWindow::gUseTiledBackingStore = false; +QGraphicsView::ViewportUpdateMode LauncherWindow::gViewportUpdateMode = QGraphicsView::MinimalViewportUpdate; +QUrl LauncherWindow::gInspectorUrl; + +#if defined(Q_WS_MAEMO_5) || defined(Q_WS_S60) +bool LauncherWindow::gUseFrameFlattening = true; +#else +bool LauncherWindow::gUseFrameFlattening = false; +#endif + +#if defined(QT_CONFIGURED_WITH_OPENGL) +bool LauncherWindow::gUseQGLWidgetViewport = false; +#endif + +LauncherWindow::LauncherWindow(LauncherWindow* other, bool shareScene) + : MainWindow() + , m_currentZoom(100) + , m_view(0) + , m_inspector(0) + , m_formatMenuAction(0) + , m_flipAnimated(0) + , m_flipYAnimated(0) +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + , m_zoomAnimation(0) +#endif +{ + if (other) { + init(other->isGraphicsBased()); + applyPrefs(other); + if (shareScene && other->isGraphicsBased()) { + QGraphicsView* otherView = static_cast(other->m_view); + static_cast(m_view)->setScene(otherView->scene()); + } + } else { + init(gUseGraphicsView); + applyPrefs(); + } + + createChrome(); +} + +LauncherWindow::~LauncherWindow() +{ + grabZoomKeys(false); +} + +void LauncherWindow::init(bool useGraphicsView) +{ + QSplitter* splitter = new QSplitter(Qt::Vertical, this); + setCentralWidget(splitter); + +#if defined(Q_WS_S60) + setWindowState(Qt::WindowMaximized); +#else + setWindowState(Qt::WindowNoState); + resize(800, 600); +#endif + + initializeView(useGraphicsView); + + connect(page(), SIGNAL(loadStarted()), this, SLOT(loadStarted())); + connect(page(), SIGNAL(loadFinished(bool)), this, SLOT(loadFinished())); + connect(page(), SIGNAL(linkHovered(const QString&, const QString&, const QString&)), + this, SLOT(showLinkHover(const QString&, const QString&))); + connect(this, SIGNAL(enteredFullScreenMode(bool)), this, SLOT(toggleFullScreenMode(bool))); + + m_inspector = new WebInspector(splitter); +#ifndef QT_NO_PROPERTIES + if (!gInspectorUrl.isEmpty()) + m_inspector->setProperty("_q_inspectorUrl", gInspectorUrl); +#endif + m_inspector->setPage(page()); + m_inspector->hide(); + connect(this, SIGNAL(destroyed()), m_inspector, SLOT(deleteLater())); + + // the zoom values are chosen to be like in Mozilla Firefox 3 + m_zoomLevels << 30 << 50 << 67 << 80 << 90; + m_zoomLevels << 100; + m_zoomLevels << 110 << 120 << 133 << 150 << 170 << 200 << 240 << 300; + + grabZoomKeys(true); +} + +void LauncherWindow::initializeView(bool useGraphicsView) +{ + delete m_view; + + QSplitter* splitter = static_cast(centralWidget()); + + if (!useGraphicsView) { + WebViewTraditional* view = new WebViewTraditional(splitter); + view->setPage(page()); + + view->installEventFilter(this); + + m_view = view; + } else { + WebViewGraphicsBased* view = new WebViewGraphicsBased(splitter); + view->setPage(page()); + + if (m_flipAnimated) + connect(m_flipAnimated, SIGNAL(triggered()), view, SLOT(animatedFlip())); + + if (m_flipYAnimated) + connect(m_flipYAnimated, SIGNAL(triggered()), view, SLOT(animatedYFlip())); + + connect(view, SIGNAL(currentFPSUpdated(int)), this, SLOT(updateFPS(int))); + + view->installEventFilter(this); + // The implementation of QAbstractScrollArea::eventFilter makes us need + // to install the event filter also on the viewport of a QGraphicsView. + view->viewport()->installEventFilter(this); + + m_view = view; + } + +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + m_touchMocking = false; +#endif +} + +void LauncherWindow::createChrome() +{ + QMenu* fileMenu = menuBar()->addMenu("&File"); + fileMenu->addAction("New Window", this, SLOT(newWindow()), QKeySequence::New); + fileMenu->addAction(tr("Open File..."), this, SLOT(openFile()), QKeySequence::Open); + fileMenu->addAction(tr("Open Location..."), this, SLOT(openLocation()), QKeySequence(Qt::CTRL | Qt::Key_L)); + fileMenu->addAction("Close Window", this, SLOT(close()), QKeySequence::Close); + fileMenu->addSeparator(); + fileMenu->addAction("Take Screen Shot...", this, SLOT(screenshot())); + fileMenu->addAction(tr("Print..."), this, SLOT(print()), QKeySequence::Print); + fileMenu->addSeparator(); + fileMenu->addAction("Quit", QApplication::instance(), SLOT(closeAllWindows()), QKeySequence(Qt::CTRL | Qt::Key_Q)); + + QMenu* editMenu = menuBar()->addMenu("&Edit"); + editMenu->addAction(page()->action(QWebPage::Undo)); + editMenu->addAction(page()->action(QWebPage::Redo)); + editMenu->addSeparator(); + editMenu->addAction(page()->action(QWebPage::Cut)); + editMenu->addAction(page()->action(QWebPage::Copy)); + editMenu->addAction(page()->action(QWebPage::Paste)); + editMenu->addSeparator(); + QAction* setEditable = editMenu->addAction("Set Editable", this, SLOT(setEditable(bool))); + setEditable->setCheckable(true); + + QMenu* viewMenu = menuBar()->addMenu("&View"); + viewMenu->addAction(page()->action(QWebPage::Stop)); + viewMenu->addAction(page()->action(QWebPage::Reload)); + viewMenu->addSeparator(); + QAction* zoomIn = viewMenu->addAction("Zoom &In", this, SLOT(zoomIn())); + QAction* zoomOut = viewMenu->addAction("Zoom &Out", this, SLOT(zoomOut())); + QAction* resetZoom = viewMenu->addAction("Reset Zoom", this, SLOT(resetZoom())); + QAction* zoomTextOnly = viewMenu->addAction("Zoom Text Only", this, SLOT(toggleZoomTextOnly(bool))); + zoomTextOnly->setCheckable(true); + zoomTextOnly->setChecked(false); + viewMenu->addSeparator(); + viewMenu->addAction("Dump HTML", this, SLOT(dumpHtml())); + // viewMenu->addAction("Dump plugins", this, SLOT(dumpPlugins())); + + QMenu* formatMenu = new QMenu("F&ormat", this); + m_formatMenuAction = menuBar()->addMenu(formatMenu); + m_formatMenuAction->setVisible(false); + formatMenu->addAction(page()->action(QWebPage::ToggleBold)); + formatMenu->addAction(page()->action(QWebPage::ToggleItalic)); + formatMenu->addAction(page()->action(QWebPage::ToggleUnderline)); + QMenu* writingMenu = formatMenu->addMenu(tr("Writing Direction")); + writingMenu->addAction(page()->action(QWebPage::SetTextDirectionDefault)); + writingMenu->addAction(page()->action(QWebPage::SetTextDirectionLeftToRight)); + writingMenu->addAction(page()->action(QWebPage::SetTextDirectionRightToLeft)); + + zoomIn->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Plus)); + zoomOut->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Minus)); + resetZoom->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_0)); + + QMenu* windowMenu = menuBar()->addMenu("&Window"); + QAction* toggleFullScreen = windowMenu->addAction("Toggle FullScreen", this, SIGNAL(enteredFullScreenMode(bool))); + toggleFullScreen->setCheckable(true); + toggleFullScreen->setChecked(false); + + // when exit fullscreen mode by clicking on the exit area (bottom right corner) we must + // uncheck the Toggle FullScreen action + toggleFullScreen->connect(this, SIGNAL(enteredFullScreenMode(bool)), SLOT(setChecked(bool))); + + QMenu* toolsMenu = menuBar()->addMenu("&Develop"); + + QWebSettings* settings = page()->settings(); + + QMenu* graphicsViewMenu = toolsMenu->addMenu("QGraphicsView"); + QAction* toggleGraphicsView = graphicsViewMenu->addAction("Toggle use of QGraphicsView", this, SLOT(initializeView(bool))); + toggleGraphicsView->setCheckable(true); + toggleGraphicsView->setChecked(isGraphicsBased()); + + QAction* toggleWebGL = toolsMenu->addAction("Toggle WebGL", this, SLOT(toggleWebGL(bool))); + toggleWebGL->setCheckable(true); + toggleWebGL->setChecked(settings->testAttribute(QWebSettings::WebGLEnabled)); + + QAction* spatialNavigationAction = toolsMenu->addAction("Toggle Spatial Navigation", this, SLOT(toggleSpatialNavigation(bool))); + spatialNavigationAction->setCheckable(true); + spatialNavigationAction->setShortcut(QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_S)); + + QAction* toggleFrameFlattening = toolsMenu->addAction("Toggle Frame Flattening", this, SLOT(toggleFrameFlattening(bool))); + toggleFrameFlattening->setCheckable(true); + toggleFrameFlattening->setChecked(settings->testAttribute(QWebSettings::FrameFlatteningEnabled)); + +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + QAction* touchMockAction = toolsMenu->addAction("Toggle multitouch mocking", this, SLOT(setTouchMocking(bool))); + touchMockAction->setCheckable(true); + touchMockAction->setShortcut(QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_T)); +#endif + + toolsMenu->addSeparator(); + + QAction* toggleInterruptingJavaScripteEnabled = toolsMenu->addAction("Enable interrupting js scripts", this, SLOT(toggleInterruptingJavaScriptEnabled(bool))); + toggleInterruptingJavaScripteEnabled->setCheckable(true); + toggleInterruptingJavaScripteEnabled->setChecked(false); + + QAction* toggleJavascriptCanOpenWindows = toolsMenu->addAction("Enable js popup windows", this, SLOT(toggleJavascriptCanOpenWindows(bool))); + toggleJavascriptCanOpenWindows->setCheckable(true); + toggleJavascriptCanOpenWindows->setChecked(false); + + toolsMenu->addSeparator(); + + QAction* userAgentAction = toolsMenu->addAction("Change User Agent", this, SLOT(showUserAgentDialog())); + userAgentAction->setShortcut(QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_U)); + + toolsMenu->addAction("Select Elements...", this, SLOT(selectElements())); + + QAction* showInspectorAction = toolsMenu->addAction("Show Web Inspector", m_inspector, SLOT(setVisible(bool)), QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_I)); + showInspectorAction->setCheckable(true); + showInspectorAction->connect(m_inspector, SIGNAL(visibleChanged(bool)), SLOT(setChecked(bool))); + + // GraphicsView sub menu. + QAction* toggleAcceleratedCompositing = graphicsViewMenu->addAction("Toggle Accelerated Compositing", this, SLOT(toggleAcceleratedCompositing(bool))); + toggleAcceleratedCompositing->setCheckable(true); + toggleAcceleratedCompositing->setChecked(settings->testAttribute(QWebSettings::AcceleratedCompositingEnabled)); + toggleAcceleratedCompositing->setEnabled(isGraphicsBased()); + toggleAcceleratedCompositing->connect(toggleGraphicsView, SIGNAL(toggled(bool)), SLOT(setEnabled(bool))); + + QAction* toggleResizesToContents = graphicsViewMenu->addAction("Toggle Resizes To Contents Mode", this, SLOT(toggleResizesToContents(bool))); + toggleResizesToContents->setCheckable(true); + toggleResizesToContents->setChecked(gResizesToContents); + toggleResizesToContents->setEnabled(isGraphicsBased()); + toggleResizesToContents->connect(toggleGraphicsView, SIGNAL(toggled(bool)), SLOT(setEnabled(bool))); + + QAction* toggleTiledBackingStore = graphicsViewMenu->addAction("Toggle Tiled Backing Store", this, SLOT(toggleTiledBackingStore(bool))); + toggleTiledBackingStore->setCheckable(true); + toggleTiledBackingStore->setChecked(false); + toggleTiledBackingStore->setEnabled(isGraphicsBased()); + toggleTiledBackingStore->connect(toggleGraphicsView, SIGNAL(toggled(bool)), SLOT(setEnabled(bool))); + +#if defined(QT_CONFIGURED_WITH_OPENGL) + QAction* toggleQGLWidgetViewport = graphicsViewMenu->addAction("Toggle use of QGLWidget Viewport", this, SLOT(toggleQGLWidgetViewport(bool))); + toggleQGLWidgetViewport->setCheckable(true); + toggleQGLWidgetViewport->setChecked(gUseQGLWidgetViewport); + toggleQGLWidgetViewport->setEnabled(isGraphicsBased()); + toggleQGLWidgetViewport->connect(toggleGraphicsView, SIGNAL(toggled(bool)), SLOT(setEnabled(bool))); +#endif + + QMenu* viewportUpdateMenu = graphicsViewMenu->addMenu("Change Viewport Update Mode"); + viewportUpdateMenu->setEnabled(isGraphicsBased()); + viewportUpdateMenu->connect(toggleGraphicsView, SIGNAL(toggled(bool)), SLOT(setEnabled(bool))); + + QAction* fullUpdate = viewportUpdateMenu->addAction("FullViewportUpdate"); + fullUpdate->setCheckable(true); + fullUpdate->setChecked((gViewportUpdateMode == QGraphicsView::FullViewportUpdate) ? true : false); + + QAction* minimalUpdate = viewportUpdateMenu->addAction("MinimalViewportUpdate"); + minimalUpdate->setCheckable(true); + minimalUpdate->setChecked((gViewportUpdateMode == QGraphicsView::MinimalViewportUpdate) ? true : false); + + QAction* smartUpdate = viewportUpdateMenu->addAction("SmartViewportUpdate"); + smartUpdate->setCheckable(true); + smartUpdate->setChecked((gViewportUpdateMode == QGraphicsView::SmartViewportUpdate) ? true : false); + + QAction* boundingRectUpdate = viewportUpdateMenu->addAction("BoundingRectViewportUpdate"); + boundingRectUpdate->setCheckable(true); + boundingRectUpdate->setChecked((gViewportUpdateMode == QGraphicsView::BoundingRectViewportUpdate) ? true : false); + + QAction* noUpdate = viewportUpdateMenu->addAction("NoViewportUpdate"); + noUpdate->setCheckable(true); + noUpdate->setChecked((gViewportUpdateMode == QGraphicsView::NoViewportUpdate) ? true : false); + + QSignalMapper* signalMapper = new QSignalMapper(viewportUpdateMenu); + signalMapper->setMapping(fullUpdate, QGraphicsView::FullViewportUpdate); + signalMapper->setMapping(minimalUpdate, QGraphicsView::MinimalViewportUpdate); + signalMapper->setMapping(smartUpdate, QGraphicsView::SmartViewportUpdate); + signalMapper->setMapping(boundingRectUpdate, QGraphicsView::BoundingRectViewportUpdate); + signalMapper->setMapping(noUpdate, QGraphicsView::NoViewportUpdate); + + connect(fullUpdate, SIGNAL(triggered()), signalMapper, SLOT(map())); + connect(minimalUpdate, SIGNAL(triggered()), signalMapper, SLOT(map())); + connect(smartUpdate, SIGNAL(triggered()), signalMapper, SLOT(map())); + connect(boundingRectUpdate, SIGNAL(triggered()), signalMapper, SLOT(map())); + connect(noUpdate, SIGNAL(triggered()), signalMapper, SLOT(map())); + + connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(changeViewportUpdateMode(int))); + + QActionGroup* viewportUpdateModeActions = new QActionGroup(viewportUpdateMenu); + viewportUpdateModeActions->addAction(fullUpdate); + viewportUpdateModeActions->addAction(minimalUpdate); + viewportUpdateModeActions->addAction(smartUpdate); + viewportUpdateModeActions->addAction(boundingRectUpdate); + viewportUpdateModeActions->addAction(noUpdate); + + graphicsViewMenu->addSeparator(); + + m_flipAnimated = graphicsViewMenu->addAction("Animated Flip"); + m_flipAnimated->connect(toggleGraphicsView, SIGNAL(toggled(bool)), SLOT(setEnabled(bool))); + m_flipAnimated->setEnabled(isGraphicsBased()); + + m_flipYAnimated = graphicsViewMenu->addAction("Animated Y-Flip"); + m_flipYAnimated->connect(toggleGraphicsView, SIGNAL(toggled(bool)), SLOT(setEnabled(bool))); + m_flipYAnimated->setEnabled(isGraphicsBased()); + + if (isGraphicsBased()) { + WebViewGraphicsBased* view = static_cast(m_view); + connect(m_flipAnimated, SIGNAL(triggered()), view, SLOT(animatedFlip())); + connect(m_flipYAnimated, SIGNAL(triggered()), view, SLOT(animatedYFlip())); + } + + QAction* cloneWindow = graphicsViewMenu->addAction("Clone Window", this, SLOT(cloneWindow())); + cloneWindow->connect(toggleGraphicsView, SIGNAL(toggled(bool)), SLOT(setEnabled(bool))); + cloneWindow->setEnabled(isGraphicsBased()); + + graphicsViewMenu->addSeparator(); + + QAction* showFPS = graphicsViewMenu->addAction("Show FPS", this, SLOT(showFPS(bool))); + showFPS->setCheckable(true); + showFPS->setEnabled(isGraphicsBased()); + showFPS->connect(toggleGraphicsView, SIGNAL(toggled(bool)), SLOT(setEnabled(bool))); + showFPS->setChecked(gShowFrameRate); +} + +bool LauncherWindow::isGraphicsBased() const +{ + return bool(qobject_cast(m_view)); +} + +inline void applySetting(QWebSettings::WebAttribute type, QWebSettings* settings, QWebSettings* other, bool defaultValue) +{ + settings->setAttribute(type, other ? other->testAttribute(type) : defaultValue); +} + +void LauncherWindow::applyPrefs(LauncherWindow* source) +{ + QWebSettings* other = source ? source->page()->settings() : 0; + QWebSettings* settings = page()->settings(); + + applySetting(QWebSettings::AcceleratedCompositingEnabled, settings, other, gUseCompositing); + applySetting(QWebSettings::TiledBackingStoreEnabled, settings, other, gUseTiledBackingStore); + applySetting(QWebSettings::WebGLEnabled, settings, other, false); + applySetting(QWebSettings::FrameFlatteningEnabled, settings, other, gUseFrameFlattening); + + if (!isGraphicsBased()) + return; + + WebViewGraphicsBased* view = static_cast(m_view); + WebViewGraphicsBased* otherView = source ? qobject_cast(source->m_view) : 0; + + view->setViewportUpdateMode(otherView ? otherView->viewportUpdateMode() : gViewportUpdateMode); + view->setFrameRateMeasurementEnabled(otherView ? otherView->frameRateMeasurementEnabled() : gShowFrameRate); + + if (otherView) { + view->setItemCacheMode(otherView->itemCacheMode()); + view->setResizesToContents(otherView->resizesToContents()); + } else { + view->setItemCacheMode(gCacheWebView ? QGraphicsItem::DeviceCoordinateCache : QGraphicsItem::NoCache); + view->setResizesToContents(gResizesToContents); + } +} + +void LauncherWindow::keyPressEvent(QKeyEvent* event) +{ +#ifdef Q_WS_MAEMO_5 + switch (event->key()) { + case Qt::Key_F7: + zoomIn(); + event->accept(); + break; + case Qt::Key_F8: + zoomOut(); + event->accept(); + break; + } +#endif + MainWindow::keyPressEvent(event); +} + +void LauncherWindow::grabZoomKeys(bool grab) +{ +#ifdef Q_WS_MAEMO_5 + if (!winId()) { + qWarning("Can't grab keys unless we have a window id"); + return; + } + + Atom atom = XInternAtom(QX11Info::display(), "_HILDON_ZOOM_KEY_ATOM", False); + if (!atom) { + qWarning("Unable to obtain _HILDON_ZOOM_KEY_ATOM"); + return; + } + + unsigned long val = (grab) ? 1 : 0; + XChangeProperty(QX11Info::display(), winId(), atom, XA_INTEGER, 32, PropModeReplace, reinterpret_cast(&val), 1); +#endif +} + +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) +void LauncherWindow::sendTouchEvent() +{ + if (m_touchPoints.isEmpty()) + return; + + QEvent::Type type = QEvent::TouchUpdate; + if (m_touchPoints.size() == 1) { + if (m_touchPoints[0].state() == Qt::TouchPointReleased) + type = QEvent::TouchEnd; + else if (m_touchPoints[0].state() == Qt::TouchPointPressed) + type = QEvent::TouchBegin; + } + + QTouchEvent touchEv(type); + touchEv.setTouchPoints(m_touchPoints); + QCoreApplication::sendEvent(page(), &touchEv); + + // After sending the event, remove all touchpoints that were released + if (m_touchPoints[0].state() == Qt::TouchPointReleased) + m_touchPoints.removeAt(0); + if (m_touchPoints.size() > 1 && m_touchPoints[1].state() == Qt::TouchPointReleased) + m_touchPoints.removeAt(1); +} +#endif // QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + +bool LauncherWindow::eventFilter(QObject* obj, QEvent* event) +{ + // If click pos is the bottom right corner (square with size defined by gExitClickArea) + // and the window is on FullScreen, the window must return to its original state. + if (event->type() == QEvent::MouseButtonRelease) { + QMouseEvent* ev = static_cast(event); + if (windowState() == Qt::WindowFullScreen + && ev->pos().x() > (width() - gExitClickArea) + && ev->pos().y() > (height() - gExitClickArea)) { + + emit enteredFullScreenMode(false); + } + } + +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + if (!m_touchMocking) + return QObject::eventFilter(obj, event); + + if (event->type() == QEvent::MouseButtonPress + || event->type() == QEvent::MouseButtonRelease + || event->type() == QEvent::MouseButtonDblClick + || event->type() == QEvent::MouseMove) { + + QMouseEvent* ev = static_cast(event); + if (ev->type() == QEvent::MouseMove + && !(ev->buttons() & Qt::LeftButton)) + return false; + + QTouchEvent::TouchPoint touchPoint; + touchPoint.setState(Qt::TouchPointMoved); + if ((ev->type() == QEvent::MouseButtonPress + || ev->type() == QEvent::MouseButtonDblClick)) + touchPoint.setState(Qt::TouchPointPressed); + else if (ev->type() == QEvent::MouseButtonRelease) + touchPoint.setState(Qt::TouchPointReleased); + + touchPoint.setId(0); + touchPoint.setScreenPos(ev->globalPos()); + touchPoint.setPos(ev->pos()); + touchPoint.setPressure(1); + + // If the point already exists, update it. Otherwise create it. + if (m_touchPoints.size() > 0 && !m_touchPoints[0].id()) + m_touchPoints[0] = touchPoint; + else if (m_touchPoints.size() > 1 && !m_touchPoints[1].id()) + m_touchPoints[1] = touchPoint; + else + m_touchPoints.append(touchPoint); + + sendTouchEvent(); + } else if (event->type() == QEvent::KeyPress + && static_cast(event)->key() == Qt::Key_F + && static_cast(event)->modifiers() == Qt::ControlModifier) { + + // If the keyboard point is already pressed, release it. + // Otherwise create it and append to m_touchPoints. + if (m_touchPoints.size() > 0 && m_touchPoints[0].id() == 1) { + m_touchPoints[0].setState(Qt::TouchPointReleased); + sendTouchEvent(); + } else if (m_touchPoints.size() > 1 && m_touchPoints[1].id() == 1) { + m_touchPoints[1].setState(Qt::TouchPointReleased); + sendTouchEvent(); + } else { + QTouchEvent::TouchPoint touchPoint; + touchPoint.setState(Qt::TouchPointPressed); + touchPoint.setId(1); + touchPoint.setScreenPos(QCursor::pos()); + touchPoint.setPos(m_view->mapFromGlobal(QCursor::pos())); + touchPoint.setPressure(1); + m_touchPoints.append(touchPoint); + sendTouchEvent(); + + // After sending the event, change the touchpoint state to stationary + m_touchPoints.last().setState(Qt::TouchPointStationary); + } + } +#endif // QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + + return false; +} + +void LauncherWindow::loadStarted() +{ + m_view->setFocus(Qt::OtherFocusReason); +} + +void LauncherWindow::loadFinished() +{ + QUrl url = page()->mainFrame()->url(); + setAddressUrl(url.toString(QUrl::RemoveUserInfo)); + addCompleterEntry(url); +} + +void LauncherWindow::showLinkHover(const QString &link, const QString &toolTip) +{ +#ifndef Q_WS_MAEMO_5 + statusBar()->showMessage(link); +#endif +#ifndef QT_NO_TOOLTIP + if (!toolTip.isEmpty()) + QToolTip::showText(QCursor::pos(), toolTip); +#endif +} + +void LauncherWindow::zoomAnimationFinished() +{ + if (!isGraphicsBased()) + return; + QGraphicsWebView* view = static_cast(m_view)->graphicsWebView(); + view->setTiledBackingStoreFrozen(false); +} + +void LauncherWindow::applyZoom() +{ +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + if (isGraphicsBased() && page()->settings()->testAttribute(QWebSettings::TiledBackingStoreEnabled)) { + QGraphicsWebView* view = static_cast(m_view)->graphicsWebView(); + view->setTiledBackingStoreFrozen(true); + if (!m_zoomAnimation) { + m_zoomAnimation = new QPropertyAnimation(view, "scale"); + m_zoomAnimation->setStartValue(view->scale()); + connect(m_zoomAnimation, SIGNAL(finished()), this, SLOT(zoomAnimationFinished())); + } else { + m_zoomAnimation->stop(); + m_zoomAnimation->setStartValue(m_zoomAnimation->currentValue()); + } + + m_zoomAnimation->setDuration(300); + m_zoomAnimation->setEndValue(qreal(m_currentZoom) / 100.); + m_zoomAnimation->start(); + return; + } +#endif + page()->mainFrame()->setZoomFactor(qreal(m_currentZoom) / 100.0); +} + +void LauncherWindow::zoomIn() +{ + int i = m_zoomLevels.indexOf(m_currentZoom); + Q_ASSERT(i >= 0); + if (i < m_zoomLevels.count() - 1) + m_currentZoom = m_zoomLevels[i + 1]; + + applyZoom(); +} + +void LauncherWindow::zoomOut() +{ + int i = m_zoomLevels.indexOf(m_currentZoom); + Q_ASSERT(i >= 0); + if (i > 0) + m_currentZoom = m_zoomLevels[i - 1]; + + applyZoom(); +} + +void LauncherWindow::resetZoom() +{ + m_currentZoom = 100; + page()->mainFrame()->setZoomFactor(1.0); +} + +void LauncherWindow::toggleZoomTextOnly(bool b) +{ + page()->settings()->setAttribute(QWebSettings::ZoomTextOnly, b); +} + +void LauncherWindow::print() +{ +#if !defined(QT_NO_PRINTER) + QPrintPreviewDialog dlg(this); + connect(&dlg, SIGNAL(paintRequested(QPrinter*)), + page()->mainFrame(), SLOT(print(QPrinter*))); + dlg.exec(); +#endif +} + +void LauncherWindow::screenshot() +{ + QPixmap pixmap = QPixmap::grabWidget(m_view); + QLabel* label = new QLabel; + label->setAttribute(Qt::WA_DeleteOnClose); + label->setWindowTitle("Screenshot - Preview"); + label->setPixmap(pixmap); + label->show(); + + QString fileName = QFileDialog::getSaveFileName(label, "Screenshot"); + if (!fileName.isEmpty()) { + pixmap.save(fileName, "png"); + label->setWindowTitle(QString("Screenshot - Saved at %1").arg(fileName)); + } +} + +void LauncherWindow::setEditable(bool on) +{ + page()->setContentEditable(on); + m_formatMenuAction->setVisible(on); +} + +/* +void LauncherWindow::dumpPlugins() { + QList plugins = QWebSettings::pluginDatabase()->plugins(); + foreach (const QWebPluginInfo plugin, plugins) { + qDebug() << "Plugin:" << plugin.name(); + foreach (const QWebPluginInfo::MimeType mime, plugin.mimeTypes()) { + qDebug() << " " << mime.name; + } + } +} +*/ + +void LauncherWindow::dumpHtml() +{ + qDebug() << "HTML: " << page()->mainFrame()->toHtml(); +} + +void LauncherWindow::selectElements() +{ + bool ok; + QString str = QInputDialog::getText(this, "Select elements", "Choose elements", + QLineEdit::Normal, "a", &ok); + + if (ok && !str.isEmpty()) { + QWebElementCollection result = page()->mainFrame()->findAllElements(str); + foreach (QWebElement e, result) + e.setStyleProperty("background-color", "yellow"); +#ifndef Q_WS_MAEMO_5 + statusBar()->showMessage(QString("%1 element(s) selected").arg(result.count()), 5000); +#endif + } +} + +void LauncherWindow::setTouchMocking(bool on) +{ +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + m_touchMocking = on; +#endif +} + +void LauncherWindow::toggleAcceleratedCompositing(bool toggle) +{ + gUseCompositing = toggle; + page()->settings()->setAttribute(QWebSettings::AcceleratedCompositingEnabled, toggle); +} + +void LauncherWindow::toggleTiledBackingStore(bool toggle) +{ + page()->settings()->setAttribute(QWebSettings::TiledBackingStoreEnabled, toggle); +} + +void LauncherWindow::toggleResizesToContents(bool toggle) +{ + gResizesToContents = toggle; + static_cast(m_view)->setResizesToContents(toggle); +} + +void LauncherWindow::toggleWebGL(bool toggle) +{ + page()->settings()->setAttribute(QWebSettings::WebGLEnabled, toggle); +} + +void LauncherWindow::toggleSpatialNavigation(bool b) +{ + page()->settings()->setAttribute(QWebSettings::SpatialNavigationEnabled, b); +} + +void LauncherWindow::toggleFullScreenMode(bool enable) +{ + if (enable) + setWindowState(Qt::WindowFullScreen); + else { +#if defined(Q_WS_S60) + setWindowState(Qt::WindowMaximized); +#else + setWindowState(Qt::WindowNoState); +#endif + } +} + +void LauncherWindow::toggleFrameFlattening(bool toggle) +{ + gUseFrameFlattening = toggle; + page()->settings()->setAttribute(QWebSettings::FrameFlatteningEnabled, toggle); +} + +void LauncherWindow::toggleInterruptingJavaScriptEnabled(bool enable) +{ + page()->setInterruptingJavaScriptEnabled(enable); +} + +void LauncherWindow::toggleJavascriptCanOpenWindows(bool enable) +{ + page()->settings()->setAttribute(QWebSettings::JavascriptCanOpenWindows, enable); +} + +#if defined(QT_CONFIGURED_WITH_OPENGL) +void LauncherWindow::toggleQGLWidgetViewport(bool enable) +{ + if (!isGraphicsBased()) + return; + + gUseQGLWidgetViewport = enable; + WebViewGraphicsBased* view = static_cast(m_view); + + view->setViewport(enable ? new QGLWidget() : 0); +} +#endif + +void LauncherWindow::changeViewportUpdateMode(int mode) +{ + gViewportUpdateMode = QGraphicsView::ViewportUpdateMode(mode); + + if (!isGraphicsBased()) + return; + + WebViewGraphicsBased* view = static_cast(m_view); + view->setViewportUpdateMode(gViewportUpdateMode); +} + +void LauncherWindow::showFPS(bool enable) +{ + if (!isGraphicsBased()) + return; + + gShowFrameRate = enable; + WebViewGraphicsBased* view = static_cast(m_view); + view->setFrameRateMeasurementEnabled(enable); + + if (!enable) { +#if defined(Q_WS_MAEMO_5) && defined(Q_WS_S60) + setWindowTitle(""); +#else + statusBar()->clearMessage(); +#endif + } +} + +void LauncherWindow::showUserAgentDialog() +{ + QStringList items; + QFile file(":/useragentlist.txt"); + if (file.open(QIODevice::ReadOnly)) { + while (!file.atEnd()) + items << file.readLine().trimmed(); + file.close(); + } + + QSettings settings; + QString customUserAgent = settings.value("CustomUserAgent").toString(); + if (!items.contains(customUserAgent) && !customUserAgent.isEmpty()) + items << customUserAgent; + + QDialog* dialog = new QDialog(this); + dialog->resize(size().width() * 0.7, dialog->size().height()); + dialog->setMaximumHeight(dialog->size().height()); + dialog->setWindowTitle("Change User Agent"); + + QVBoxLayout* layout = new QVBoxLayout(dialog); + dialog->setLayout(layout); + + QComboBox* combo = new QComboBox(dialog); + combo->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLength); + combo->setEditable(true); + combo->insertItems(0, items); + layout->addWidget(combo); + + int index = combo->findText(page()->userAgentForUrl(QUrl())); + combo->setCurrentIndex(index); + + QDialogButtonBox* buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok + | QDialogButtonBox::Cancel, Qt::Horizontal, dialog); + connect(buttonBox, SIGNAL(accepted()), dialog, SLOT(accept())); + connect(buttonBox, SIGNAL(rejected()), dialog, SLOT(reject())); + layout->addWidget(buttonBox); + + if (dialog->exec() && !combo->currentText().isEmpty()) { + page()->setUserAgent(combo->currentText()); + if (!items.contains(combo->currentText())) + settings.setValue("CustomUserAgent", combo->currentText()); + } + + delete dialog; +} + +void LauncherWindow::updateFPS(int fps) +{ + QString fpsStatusText = QString("Current FPS: %1").arg(fps); + +#if defined(Q_WS_MAEMO_5) && defined(Q_WS_S60) + setWindowTitle(fpsStatusText); +#else + statusBar()->showMessage(fpsStatusText); +#endif +} + +LauncherWindow* LauncherWindow::newWindow() +{ + LauncherWindow* mw = new LauncherWindow(this, false); + mw->show(); + return mw; +} + +LauncherWindow* LauncherWindow::cloneWindow() +{ + LauncherWindow* mw = new LauncherWindow(this, true); + mw->show(); + return mw; +} + diff --git a/WebKitTools/QtTestBrowser/launcherwindow.h b/WebKitTools/QtTestBrowser/launcherwindow.h new file mode 100644 index 0000000..f9f157d --- /dev/null +++ b/WebKitTools/QtTestBrowser/launcherwindow.h @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) + * Copyright (C) 2009 Girish Ramakrishnan + * Copyright (C) 2006 George Staikos + * Copyright (C) 2006 Dirk Mueller + * Copyright (C) 2006 Zack Rusin + * Copyright (C) 2006 Simon Hausmann + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef launcherwindow_h +#define launcherwindow_h + +#include +#include + +#if defined(QT_CONFIGURED_WITH_OPENGL) +#include +#endif + +#if !defined(QT_NO_PRINTER) +#include +#endif + +#ifndef QT_NO_UITOOLS +#include +#endif + +#include + +#include +#include +#include +#include +#include +#include + +#ifdef Q_WS_MAEMO_5 +#include +#endif + +#include "mainwindow.h" +#include "urlloader.h" +#include "utils.h" +#include "webinspector.h" +#include "webpage.h" +#include "webview.h" +#include "../../WebKit/qt/WebCoreSupport/DumpRenderTreeSupportQt.h" + +#ifdef Q_WS_MAEMO_5 +#include +#include +#undef KeyPress +#endif + +class LauncherWindow : public MainWindow { + Q_OBJECT + +public: + LauncherWindow(LauncherWindow* other = 0, bool shareScene = false); + virtual ~LauncherWindow(); + + virtual void keyPressEvent(QKeyEvent* event); + void grabZoomKeys(bool grab); + +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + void sendTouchEvent(); +#endif + + bool eventFilter(QObject* obj, QEvent* event); + +public: + static const int gExitClickArea = 80; + static bool gUseGraphicsView; + static bool gUseCompositing; + static bool gCacheWebView; + static bool gShowFrameRate; + static bool gResizesToContents; + static bool gUseTiledBackingStore; + static bool gUseFrameFlattening; + static QGraphicsView::ViewportUpdateMode gViewportUpdateMode; + static QUrl gInspectorUrl; + +#if defined(QT_CONFIGURED_WITH_OPENGL) + static bool gUseQGLWidgetViewport; +#endif + +protected slots: + void loadStarted(); + void loadFinished(); + + void showLinkHover(const QString &link, const QString &toolTip); + + void zoomIn(); + void zoomOut(); + void resetZoom(); + void toggleZoomTextOnly(bool on); + void zoomAnimationFinished(); + + void print(); + void screenshot(); + + void setEditable(bool on); + + /* void dumpPlugins() */ + void dumpHtml(); + + void initializeView(bool useGraphicsView = false); + + void setTouchMocking(bool on); + void toggleAcceleratedCompositing(bool toggle); + void toggleTiledBackingStore(bool toggle); + void toggleResizesToContents(bool toggle); + void toggleWebGL(bool toggle); + void toggleSpatialNavigation(bool b); + void toggleFullScreenMode(bool enable); + void toggleFrameFlattening(bool toggle); + void toggleInterruptingJavaScriptEnabled(bool enable); + void toggleJavascriptCanOpenWindows(bool enable); + +#if defined(QT_CONFIGURED_WITH_OPENGL) + void toggleQGLWidgetViewport(bool enable); +#endif + + void changeViewportUpdateMode(int mode); + void selectElements(); + void showFPS(bool enable); + void showUserAgentDialog(); + +public slots: + LauncherWindow* newWindow(); + LauncherWindow* cloneWindow(); + void updateFPS(int fps); + +signals: + void enteredFullScreenMode(bool on); + +private: + void init(bool useGraphicsView = false); + bool isGraphicsBased() const; + void createChrome(); + void applyPrefs(LauncherWindow* other = 0); + void applyZoom(); + +private: + QVector m_zoomLevels; + int m_currentZoom; + + QWidget* m_view; + WebInspector* m_inspector; + + QAction* m_formatMenuAction; + QAction* m_flipAnimated; + QAction* m_flipYAnimated; + +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + QPropertyAnimation* m_zoomAnimation; + QList m_touchPoints; + bool m_touchMocking; +#endif +}; + +#endif diff --git a/WebKitTools/QtTestBrowser/main.cpp b/WebKitTools/QtTestBrowser/main.cpp index 288472c..33a6416 100644 --- a/WebKitTools/QtTestBrowser/main.cpp +++ b/WebKitTools/QtTestBrowser/main.cpp @@ -30,1011 +30,8 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include -#include - -#if defined(QT_CONFIGURED_WITH_OPENGL) -#include -#endif - -#if !defined(QT_NO_PRINTER) -#include -#endif - -#ifndef QT_NO_UITOOLS -#include -#endif - -#include - -#include -#include -#include -#include -#include -#include - -#ifdef Q_WS_MAEMO_5 -#include -#endif - -#include "mainwindow.h" +#include "launcherwindow.h" #include "urlloader.h" -#include "utils.h" -#include "webinspector.h" -#include "webpage.h" -#include "webview.h" -#include "../../WebKit/qt/WebCoreSupport/DumpRenderTreeSupportQt.h" - -#ifdef Q_WS_MAEMO_5 -#include -#include -#undef KeyPress -#endif - -static const int gExitClickArea = 80; -static bool gUseGraphicsView = false; -static bool gUseCompositing = true; -static bool gCacheWebView = false; -static bool gShowFrameRate = false; -static QGraphicsView::ViewportUpdateMode gViewportUpdateMode = QGraphicsView::MinimalViewportUpdate; -static QUrl gInspectorUrl; -static bool gResizesToContents = false; -static bool gUseTiledBackingStore = false; - -#if defined(Q_WS_MAEMO_5) || defined(Q_WS_S60) -static bool gUseFrameFlattening = true; -#else -static bool gUseFrameFlattening = false; -#endif - -#if defined(QT_CONFIGURED_WITH_OPENGL) -static bool gUseQGLWidgetViewport = false; -#endif - -class LauncherWindow : public MainWindow { - Q_OBJECT - -public: - LauncherWindow(LauncherWindow* other = 0, bool shareScene = false); - virtual ~LauncherWindow(); - - virtual void keyPressEvent(QKeyEvent* event); - void grabZoomKeys(bool grab); - -#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) - void sendTouchEvent(); -#endif - - bool eventFilter(QObject* obj, QEvent* event); - -protected slots: - void loadStarted(); - void loadFinished(); - - void showLinkHover(const QString &link, const QString &toolTip); - - void zoomIn(); - void zoomOut(); - void resetZoom(); - void toggleZoomTextOnly(bool on); - void zoomAnimationFinished(); - - void print(); - void screenshot(); - - void setEditable(bool on); - - /* void dumpPlugins() */ - void dumpHtml(); - - void selectElements(); - - void setTouchMocking(bool on); - void toggleAcceleratedCompositing(bool toggle); - void toggleTiledBackingStore(bool toggle); - void toggleResizesToContents(bool toggle); - - void toggleWebGL(bool toggle); - void initializeView(bool useGraphicsView = false); - void toggleSpatialNavigation(bool b); - void toggleFullScreenMode(bool enable); - void showFPS(bool enable); - void changeViewportUpdateMode(int mode); - void toggleFrameFlattening(bool toggle); - void toggleInterruptingJavaScriptEnabled(bool enable); - void toggleJavascriptCanOpenWindows(bool enable); - -#if defined(QT_CONFIGURED_WITH_OPENGL) - void toggleQGLWidgetViewport(bool enable); -#endif - - void showUserAgentDialog(); - -public slots: - LauncherWindow* newWindow(); - LauncherWindow* cloneWindow(); - void updateFPS(int fps); - -signals: - void enteredFullScreenMode(bool on); - -private: - void createChrome(); - void applyZoom(); - -private: - QVector m_zoomLevels; - int m_currentZoom; - - QWidget* m_view; - WebInspector* m_inspector; - - QAction* m_formatMenuAction; - QAction* m_flipAnimated; - QAction* m_flipYAnimated; - -#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) - QPropertyAnimation* m_zoomAnimation; - QList m_touchPoints; - bool m_touchMocking; -#endif - - void init(bool useGraphicsView = false); - bool isGraphicsBased() const; - void applyPrefs(LauncherWindow* other = 0); -}; - -LauncherWindow::LauncherWindow(LauncherWindow* other, bool shareScene) - : MainWindow() - , m_currentZoom(100) - , m_view(0) - , m_inspector(0) - , m_formatMenuAction(0) - , m_flipAnimated(0) - , m_flipYAnimated(0) -#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) - , m_zoomAnimation(0) -#endif -{ - if (other) { - init(other->isGraphicsBased()); - applyPrefs(other); - if (shareScene && other->isGraphicsBased()) { - QGraphicsView* otherView = static_cast(other->m_view); - static_cast(m_view)->setScene(otherView->scene()); - } - } else { - init(gUseGraphicsView); - applyPrefs(); - } - - createChrome(); -} - -LauncherWindow::~LauncherWindow() -{ - grabZoomKeys(false); -} - -void LauncherWindow::init(bool useGraphicsView) -{ - QSplitter* splitter = new QSplitter(Qt::Vertical, this); - setCentralWidget(splitter); - -#if defined(Q_WS_S60) - setWindowState(Qt::WindowMaximized); -#else - setWindowState(Qt::WindowNoState); - resize(800, 600); -#endif - - initializeView(useGraphicsView); - - connect(page(), SIGNAL(loadStarted()), this, SLOT(loadStarted())); - connect(page(), SIGNAL(loadFinished(bool)), this, SLOT(loadFinished())); - connect(page(), SIGNAL(linkHovered(const QString&, const QString&, const QString&)), - this, SLOT(showLinkHover(const QString&, const QString&))); - connect(this, SIGNAL(enteredFullScreenMode(bool)), this, SLOT(toggleFullScreenMode(bool))); - - m_inspector = new WebInspector(splitter); -#ifndef QT_NO_PROPERTIES - if (!gInspectorUrl.isEmpty()) - m_inspector->setProperty("_q_inspectorUrl", gInspectorUrl); -#endif - m_inspector->setPage(page()); - m_inspector->hide(); - connect(this, SIGNAL(destroyed()), m_inspector, SLOT(deleteLater())); - - // the zoom values are chosen to be like in Mozilla Firefox 3 - m_zoomLevels << 30 << 50 << 67 << 80 << 90; - m_zoomLevels << 100; - m_zoomLevels << 110 << 120 << 133 << 150 << 170 << 200 << 240 << 300; - - grabZoomKeys(true); -} - -bool LauncherWindow::isGraphicsBased() const -{ - return bool(qobject_cast(m_view)); -} - -inline void applySetting(QWebSettings::WebAttribute type, QWebSettings* settings, QWebSettings* other, bool defaultValue) -{ - settings->setAttribute(type, other ? other->testAttribute(type) : defaultValue); -} - -void LauncherWindow::applyPrefs(LauncherWindow* source) -{ - QWebSettings* other = source ? source->page()->settings() : 0; - QWebSettings* settings = page()->settings(); - - applySetting(QWebSettings::AcceleratedCompositingEnabled, settings, other, gUseCompositing); - applySetting(QWebSettings::TiledBackingStoreEnabled, settings, other, gUseTiledBackingStore); - applySetting(QWebSettings::WebGLEnabled, settings, other, false); - applySetting(QWebSettings::FrameFlatteningEnabled, settings, other, gUseFrameFlattening); - - if (!isGraphicsBased()) - return; - - WebViewGraphicsBased* view = static_cast(m_view); - WebViewGraphicsBased* otherView = source ? qobject_cast(source->m_view) : 0; - - view->setViewportUpdateMode(otherView ? otherView->viewportUpdateMode() : gViewportUpdateMode); - view->setFrameRateMeasurementEnabled(otherView ? otherView->frameRateMeasurementEnabled() : gShowFrameRate); - - if (otherView) - view->setItemCacheMode(otherView->itemCacheMode()); - else - view->setItemCacheMode(gCacheWebView ? QGraphicsItem::DeviceCoordinateCache : QGraphicsItem::NoCache); -} - -void LauncherWindow::keyPressEvent(QKeyEvent* event) -{ -#ifdef Q_WS_MAEMO_5 - switch (event->key()) { - case Qt::Key_F7: - zoomIn(); - event->accept(); - break; - case Qt::Key_F8: - zoomOut(); - event->accept(); - break; - } -#endif - MainWindow::keyPressEvent(event); -} - -void LauncherWindow::grabZoomKeys(bool grab) -{ -#ifdef Q_WS_MAEMO_5 - if (!winId()) { - qWarning("Can't grab keys unless we have a window id"); - return; - } - - Atom atom = XInternAtom(QX11Info::display(), "_HILDON_ZOOM_KEY_ATOM", False); - if (!atom) { - qWarning("Unable to obtain _HILDON_ZOOM_KEY_ATOM"); - return; - } - - unsigned long val = (grab) ? 1 : 0; - XChangeProperty(QX11Info::display(), winId(), atom, XA_INTEGER, 32, PropModeReplace, reinterpret_cast(&val), 1); -#endif -} - -#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) -void LauncherWindow::sendTouchEvent() -{ - if (m_touchPoints.isEmpty()) - return; - - QEvent::Type type = QEvent::TouchUpdate; - if (m_touchPoints.size() == 1) { - if (m_touchPoints[0].state() == Qt::TouchPointReleased) - type = QEvent::TouchEnd; - else if (m_touchPoints[0].state() == Qt::TouchPointPressed) - type = QEvent::TouchBegin; - } - - QTouchEvent touchEv(type); - touchEv.setTouchPoints(m_touchPoints); - QCoreApplication::sendEvent(page(), &touchEv); - - // After sending the event, remove all touchpoints that were released - if (m_touchPoints[0].state() == Qt::TouchPointReleased) - m_touchPoints.removeAt(0); - if (m_touchPoints.size() > 1 && m_touchPoints[1].state() == Qt::TouchPointReleased) - m_touchPoints.removeAt(1); -} -#endif // QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) - -bool LauncherWindow::eventFilter(QObject* obj, QEvent* event) -{ - // If click pos is the bottom right corner (square with size defined by gExitClickArea) - // and the window is on FullScreen, the window must return to its original state. - if (event->type() == QEvent::MouseButtonRelease) { - QMouseEvent* ev = static_cast(event); - if (windowState() == Qt::WindowFullScreen - && ev->pos().x() > (width() - gExitClickArea) - && ev->pos().y() > (height() - gExitClickArea)) { - - emit enteredFullScreenMode(false); - } - } - -#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) - if (!m_touchMocking) - return QObject::eventFilter(obj, event); - - if (event->type() == QEvent::MouseButtonPress - || event->type() == QEvent::MouseButtonRelease - || event->type() == QEvent::MouseButtonDblClick - || event->type() == QEvent::MouseMove) { - - QMouseEvent* ev = static_cast(event); - if (ev->type() == QEvent::MouseMove - && !(ev->buttons() & Qt::LeftButton)) - return false; - - QTouchEvent::TouchPoint touchPoint; - touchPoint.setState(Qt::TouchPointMoved); - if ((ev->type() == QEvent::MouseButtonPress - || ev->type() == QEvent::MouseButtonDblClick)) - touchPoint.setState(Qt::TouchPointPressed); - else if (ev->type() == QEvent::MouseButtonRelease) - touchPoint.setState(Qt::TouchPointReleased); - - touchPoint.setId(0); - touchPoint.setScreenPos(ev->globalPos()); - touchPoint.setPos(ev->pos()); - touchPoint.setPressure(1); - - // If the point already exists, update it. Otherwise create it. - if (m_touchPoints.size() > 0 && !m_touchPoints[0].id()) - m_touchPoints[0] = touchPoint; - else if (m_touchPoints.size() > 1 && !m_touchPoints[1].id()) - m_touchPoints[1] = touchPoint; - else - m_touchPoints.append(touchPoint); - - sendTouchEvent(); - } else if (event->type() == QEvent::KeyPress - && static_cast(event)->key() == Qt::Key_F - && static_cast(event)->modifiers() == Qt::ControlModifier) { - - // If the keyboard point is already pressed, release it. - // Otherwise create it and append to m_touchPoints. - if (m_touchPoints.size() > 0 && m_touchPoints[0].id() == 1) { - m_touchPoints[0].setState(Qt::TouchPointReleased); - sendTouchEvent(); - } else if (m_touchPoints.size() > 1 && m_touchPoints[1].id() == 1) { - m_touchPoints[1].setState(Qt::TouchPointReleased); - sendTouchEvent(); - } else { - QTouchEvent::TouchPoint touchPoint; - touchPoint.setState(Qt::TouchPointPressed); - touchPoint.setId(1); - touchPoint.setScreenPos(QCursor::pos()); - touchPoint.setPos(m_view->mapFromGlobal(QCursor::pos())); - touchPoint.setPressure(1); - m_touchPoints.append(touchPoint); - sendTouchEvent(); - - // After sending the event, change the touchpoint state to stationary - m_touchPoints.last().setState(Qt::TouchPointStationary); - } - } -#endif // QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) - - return false; -} - -void LauncherWindow::loadStarted() -{ - m_view->setFocus(Qt::OtherFocusReason); -} - -void LauncherWindow::loadFinished() -{ - QUrl url = page()->mainFrame()->url(); - setAddressUrl(url.toString(QUrl::RemoveUserInfo)); - addCompleterEntry(url); -} - -void LauncherWindow::showLinkHover(const QString &link, const QString &toolTip) -{ -#ifndef Q_WS_MAEMO_5 - statusBar()->showMessage(link); -#endif -#ifndef QT_NO_TOOLTIP - if (!toolTip.isEmpty()) - QToolTip::showText(QCursor::pos(), toolTip); -#endif -} - -void LauncherWindow::zoomAnimationFinished() -{ - if (!isGraphicsBased()) - return; - QGraphicsWebView* view = static_cast(m_view)->graphicsWebView(); - view->setTiledBackingStoreFrozen(false); -} - -void LauncherWindow::applyZoom() -{ -#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) - if (isGraphicsBased() && page()->settings()->testAttribute(QWebSettings::TiledBackingStoreEnabled)) { - QGraphicsWebView* view = static_cast(m_view)->graphicsWebView(); - view->setTiledBackingStoreFrozen(true); - if (!m_zoomAnimation) { - m_zoomAnimation = new QPropertyAnimation(view, "scale"); - m_zoomAnimation->setStartValue(view->scale()); - connect(m_zoomAnimation, SIGNAL(finished()), this, SLOT(zoomAnimationFinished())); - } else { - m_zoomAnimation->stop(); - m_zoomAnimation->setStartValue(m_zoomAnimation->currentValue()); - } - - m_zoomAnimation->setDuration(300); - m_zoomAnimation->setEndValue(qreal(m_currentZoom) / 100.); - m_zoomAnimation->start(); - return; - } -#endif - page()->mainFrame()->setZoomFactor(qreal(m_currentZoom) / 100.0); -} - -void LauncherWindow::zoomIn() -{ - int i = m_zoomLevels.indexOf(m_currentZoom); - Q_ASSERT(i >= 0); - if (i < m_zoomLevels.count() - 1) - m_currentZoom = m_zoomLevels[i + 1]; - - applyZoom(); -} - -void LauncherWindow::zoomOut() -{ - int i = m_zoomLevels.indexOf(m_currentZoom); - Q_ASSERT(i >= 0); - if (i > 0) - m_currentZoom = m_zoomLevels[i - 1]; - - applyZoom(); -} - -void LauncherWindow::resetZoom() -{ - m_currentZoom = 100; - page()->mainFrame()->setZoomFactor(1.0); -} - -void LauncherWindow::toggleZoomTextOnly(bool b) -{ - page()->settings()->setAttribute(QWebSettings::ZoomTextOnly, b); -} - -void LauncherWindow::print() -{ -#if !defined(QT_NO_PRINTER) - QPrintPreviewDialog dlg(this); - connect(&dlg, SIGNAL(paintRequested(QPrinter*)), - page()->mainFrame(), SLOT(print(QPrinter*))); - dlg.exec(); -#endif -} - -void LauncherWindow::screenshot() -{ - QPixmap pixmap = QPixmap::grabWidget(m_view); - QLabel* label = new QLabel; - label->setAttribute(Qt::WA_DeleteOnClose); - label->setWindowTitle("Screenshot - Preview"); - label->setPixmap(pixmap); - label->show(); - - QString fileName = QFileDialog::getSaveFileName(label, "Screenshot"); - if (!fileName.isEmpty()) { - pixmap.save(fileName, "png"); - label->setWindowTitle(QString("Screenshot - Saved at %1").arg(fileName)); - } -} - -void LauncherWindow::setEditable(bool on) -{ - page()->setContentEditable(on); - m_formatMenuAction->setVisible(on); -} - -/* -void LauncherWindow::dumpPlugins() { - QList plugins = QWebSettings::pluginDatabase()->plugins(); - foreach (const QWebPluginInfo plugin, plugins) { - qDebug() << "Plugin:" << plugin.name(); - foreach (const QWebPluginInfo::MimeType mime, plugin.mimeTypes()) { - qDebug() << " " << mime.name; - } - } -} -*/ - -void LauncherWindow::dumpHtml() -{ - qDebug() << "HTML: " << page()->mainFrame()->toHtml(); -} - -void LauncherWindow::selectElements() -{ - bool ok; - QString str = QInputDialog::getText(this, "Select elements", "Choose elements", - QLineEdit::Normal, "a", &ok); - - if (ok && !str.isEmpty()) { - QWebElementCollection result = page()->mainFrame()->findAllElements(str); - foreach (QWebElement e, result) - e.setStyleProperty("background-color", "yellow"); -#ifndef Q_WS_MAEMO_5 - statusBar()->showMessage(QString("%1 element(s) selected").arg(result.count()), 5000); -#endif - } -} - -void LauncherWindow::setTouchMocking(bool on) -{ -#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) - m_touchMocking = on; -#endif -} - -void LauncherWindow::toggleAcceleratedCompositing(bool toggle) -{ - gUseCompositing = toggle; - page()->settings()->setAttribute(QWebSettings::AcceleratedCompositingEnabled, toggle); -} - -void LauncherWindow::toggleTiledBackingStore(bool toggle) -{ - page()->settings()->setAttribute(QWebSettings::TiledBackingStoreEnabled, toggle); -} - -void LauncherWindow::toggleResizesToContents(bool toggle) -{ - static_cast(m_view)->setResizesToContents(toggle); -} - -void LauncherWindow::toggleWebGL(bool toggle) -{ - page()->settings()->setAttribute(QWebSettings::WebGLEnabled, toggle); -} - -void LauncherWindow::initializeView(bool useGraphicsView) -{ - delete m_view; - - QSplitter* splitter = static_cast(centralWidget()); - - if (!useGraphicsView) { - WebViewTraditional* view = new WebViewTraditional(splitter); - view->setPage(page()); - - view->installEventFilter(this); - - m_view = view; - } else { - WebViewGraphicsBased* view = new WebViewGraphicsBased(splitter); - view->setPage(page()); - - if (m_flipAnimated) - connect(m_flipAnimated, SIGNAL(triggered()), view, SLOT(animatedFlip())); - - if (m_flipYAnimated) - connect(m_flipYAnimated, SIGNAL(triggered()), view, SLOT(animatedYFlip())); - - connect(view, SIGNAL(currentFPSUpdated(int)), this, SLOT(updateFPS(int))); - - view->installEventFilter(this); - // The implementation of QAbstractScrollArea::eventFilter makes us need - // to install the event filter also on the viewport of a QGraphicsView. - view->viewport()->installEventFilter(this); - - m_view = view; - } - -#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) - m_touchMocking = false; -#endif -} - -void LauncherWindow::toggleSpatialNavigation(bool b) -{ - page()->settings()->setAttribute(QWebSettings::SpatialNavigationEnabled, b); -} - -void LauncherWindow::toggleFullScreenMode(bool enable) -{ - if (enable) - setWindowState(Qt::WindowFullScreen); - else { -#if defined(Q_WS_S60) - setWindowState(Qt::WindowMaximized); -#else - setWindowState(Qt::WindowNoState); -#endif - } -} - -void LauncherWindow::showFPS(bool enable) -{ - if (!isGraphicsBased()) - return; - - gShowFrameRate = enable; - WebViewGraphicsBased* view = static_cast(m_view); - view->setFrameRateMeasurementEnabled(enable); - - if (!enable) { -#if defined(Q_WS_MAEMO_5) && defined(Q_WS_S60) - setWindowTitle(""); -#else - statusBar()->clearMessage(); -#endif - } -} - -void LauncherWindow::changeViewportUpdateMode(int mode) -{ - gViewportUpdateMode = QGraphicsView::ViewportUpdateMode(mode); - - if (!isGraphicsBased()) - return; - - WebViewGraphicsBased* view = static_cast(m_view); - view->setViewportUpdateMode(gViewportUpdateMode); -} - -void LauncherWindow::toggleFrameFlattening(bool toggle) -{ - gUseFrameFlattening = toggle; - page()->settings()->setAttribute(QWebSettings::FrameFlatteningEnabled, toggle); -} - -void LauncherWindow::toggleInterruptingJavaScriptEnabled(bool enable) -{ - page()->setInterruptingJavaScriptEnabled(enable); -} - -void LauncherWindow::toggleJavascriptCanOpenWindows(bool enable) -{ - page()->settings()->setAttribute(QWebSettings::JavascriptCanOpenWindows, enable); -} - -#if defined(QT_CONFIGURED_WITH_OPENGL) -void LauncherWindow::toggleQGLWidgetViewport(bool enable) -{ - if (!isGraphicsBased()) - return; - - gUseQGLWidgetViewport = enable; - WebViewGraphicsBased* view = static_cast(m_view); - - view->setViewport(enable ? new QGLWidget() : 0); -} -#endif - -void LauncherWindow::showUserAgentDialog() -{ - QStringList items; - QFile file(":/useragentlist.txt"); - if (file.open(QIODevice::ReadOnly)) { - while (!file.atEnd()) - items << file.readLine().trimmed(); - file.close(); - } - - QSettings settings; - QString customUserAgent = settings.value("CustomUserAgent").toString(); - if (!items.contains(customUserAgent) && !customUserAgent.isEmpty()) - items << customUserAgent; - - QDialog* dialog = new QDialog(this); - dialog->resize(size().width() * 0.7, dialog->size().height()); - dialog->setMaximumHeight(dialog->size().height()); - dialog->setWindowTitle("Change User Agent"); - - QVBoxLayout* layout = new QVBoxLayout(dialog); - dialog->setLayout(layout); - - QComboBox* combo = new QComboBox(dialog); - combo->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLength); - combo->setEditable(true); - combo->insertItems(0, items); - layout->addWidget(combo); - - int index = combo->findText(page()->userAgentForUrl(QUrl())); - combo->setCurrentIndex(index); - - QDialogButtonBox* buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok - | QDialogButtonBox::Cancel, Qt::Horizontal, dialog); - connect(buttonBox, SIGNAL(accepted()), dialog, SLOT(accept())); - connect(buttonBox, SIGNAL(rejected()), dialog, SLOT(reject())); - layout->addWidget(buttonBox); - - if (dialog->exec() && !combo->currentText().isEmpty()) { - page()->setUserAgent(combo->currentText()); - if (!items.contains(combo->currentText())) - settings.setValue("CustomUserAgent", combo->currentText()); - } - - delete dialog; -} - -LauncherWindow* LauncherWindow::newWindow() -{ - LauncherWindow* mw = new LauncherWindow(this, false); - mw->show(); - return mw; -} - -LauncherWindow* LauncherWindow::cloneWindow() -{ - LauncherWindow* mw = new LauncherWindow(this, true); - mw->show(); - return mw; -} - -void LauncherWindow::updateFPS(int fps) -{ - QString fpsStatusText = QString("Current FPS: %1").arg(fps); - -#if defined(Q_WS_MAEMO_5) && defined(Q_WS_S60) - setWindowTitle(fpsStatusText); -#else - statusBar()->showMessage(fpsStatusText); -#endif -} - -void LauncherWindow::createChrome() -{ - QMenu* fileMenu = menuBar()->addMenu("&File"); - fileMenu->addAction("New Window", this, SLOT(newWindow()), QKeySequence::New); - fileMenu->addAction(tr("Open File..."), this, SLOT(openFile()), QKeySequence::Open); - fileMenu->addAction(tr("Open Location..."), this, SLOT(openLocation()), QKeySequence(Qt::CTRL | Qt::Key_L)); - fileMenu->addAction("Close Window", this, SLOT(close()), QKeySequence::Close); - fileMenu->addSeparator(); - fileMenu->addAction("Take Screen Shot...", this, SLOT(screenshot())); - fileMenu->addAction(tr("Print..."), this, SLOT(print()), QKeySequence::Print); - fileMenu->addSeparator(); - fileMenu->addAction("Quit", QApplication::instance(), SLOT(closeAllWindows()), QKeySequence(Qt::CTRL | Qt::Key_Q)); - - QMenu* editMenu = menuBar()->addMenu("&Edit"); - editMenu->addAction(page()->action(QWebPage::Undo)); - editMenu->addAction(page()->action(QWebPage::Redo)); - editMenu->addSeparator(); - editMenu->addAction(page()->action(QWebPage::Cut)); - editMenu->addAction(page()->action(QWebPage::Copy)); - editMenu->addAction(page()->action(QWebPage::Paste)); - editMenu->addSeparator(); - QAction* setEditable = editMenu->addAction("Set Editable", this, SLOT(setEditable(bool))); - setEditable->setCheckable(true); - - QMenu* viewMenu = menuBar()->addMenu("&View"); - viewMenu->addAction(page()->action(QWebPage::Stop)); - viewMenu->addAction(page()->action(QWebPage::Reload)); - viewMenu->addSeparator(); - QAction* zoomIn = viewMenu->addAction("Zoom &In", this, SLOT(zoomIn())); - QAction* zoomOut = viewMenu->addAction("Zoom &Out", this, SLOT(zoomOut())); - QAction* resetZoom = viewMenu->addAction("Reset Zoom", this, SLOT(resetZoom())); - QAction* zoomTextOnly = viewMenu->addAction("Zoom Text Only", this, SLOT(toggleZoomTextOnly(bool))); - zoomTextOnly->setCheckable(true); - zoomTextOnly->setChecked(false); - viewMenu->addSeparator(); - viewMenu->addAction("Dump HTML", this, SLOT(dumpHtml())); - // viewMenu->addAction("Dump plugins", this, SLOT(dumpPlugins())); - - QMenu* formatMenu = new QMenu("F&ormat", this); - m_formatMenuAction = menuBar()->addMenu(formatMenu); - m_formatMenuAction->setVisible(false); - formatMenu->addAction(page()->action(QWebPage::ToggleBold)); - formatMenu->addAction(page()->action(QWebPage::ToggleItalic)); - formatMenu->addAction(page()->action(QWebPage::ToggleUnderline)); - QMenu* writingMenu = formatMenu->addMenu(tr("Writing Direction")); - writingMenu->addAction(page()->action(QWebPage::SetTextDirectionDefault)); - writingMenu->addAction(page()->action(QWebPage::SetTextDirectionLeftToRight)); - writingMenu->addAction(page()->action(QWebPage::SetTextDirectionRightToLeft)); - - zoomIn->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Plus)); - zoomOut->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Minus)); - resetZoom->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_0)); - - QMenu* windowMenu = menuBar()->addMenu("&Window"); - QAction* toggleFullScreen = windowMenu->addAction("Toggle FullScreen", this, SIGNAL(enteredFullScreenMode(bool))); - toggleFullScreen->setCheckable(true); - toggleFullScreen->setChecked(false); - - // when exit fullscreen mode by clicking on the exit area (bottom right corner) we must - // uncheck the Toggle FullScreen action - toggleFullScreen->connect(this, SIGNAL(enteredFullScreenMode(bool)), SLOT(setChecked(bool))); - - QMenu* toolsMenu = menuBar()->addMenu("&Develop"); - - QWebSettings* settings = page()->settings(); - - QMenu* graphicsViewMenu = toolsMenu->addMenu("QGraphicsView"); - QAction* toggleGraphicsView = graphicsViewMenu->addAction("Toggle use of QGraphicsView", this, SLOT(initializeView(bool))); - toggleGraphicsView->setCheckable(true); - toggleGraphicsView->setChecked(isGraphicsBased()); - - QAction* toggleWebGL = toolsMenu->addAction("Toggle WebGL", this, SLOT(toggleWebGL(bool))); - toggleWebGL->setCheckable(true); - toggleWebGL->setChecked(settings->testAttribute(QWebSettings::WebGLEnabled)); - - QAction* spatialNavigationAction = toolsMenu->addAction("Toggle Spatial Navigation", this, SLOT(toggleSpatialNavigation(bool))); - spatialNavigationAction->setCheckable(true); - spatialNavigationAction->setShortcut(QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_S)); - - QAction* toggleFrameFlattening = toolsMenu->addAction("Toggle Frame Flattening", this, SLOT(toggleFrameFlattening(bool))); - toggleFrameFlattening->setCheckable(true); - toggleFrameFlattening->setChecked(settings->testAttribute(QWebSettings::FrameFlatteningEnabled)); - -#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) - QAction* touchMockAction = toolsMenu->addAction("Toggle multitouch mocking", this, SLOT(setTouchMocking(bool))); - touchMockAction->setCheckable(true); - touchMockAction->setShortcut(QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_T)); -#endif - - toolsMenu->addSeparator(); - - QAction* toggleInterruptingJavaScripteEnabled = toolsMenu->addAction("Enable interrupting js scripts", this, SLOT(toggleInterruptingJavaScriptEnabled(bool))); - toggleInterruptingJavaScripteEnabled->setCheckable(true); - toggleInterruptingJavaScripteEnabled->setChecked(false); - - QAction* toggleJavascriptCanOpenWindows = toolsMenu->addAction("Enable js popup windows", this, SLOT(toggleJavascriptCanOpenWindows(bool))); - toggleJavascriptCanOpenWindows->setCheckable(true); - toggleJavascriptCanOpenWindows->setChecked(false); - - toolsMenu->addSeparator(); - - QAction* userAgentAction = toolsMenu->addAction("Change User Agent", this, SLOT(showUserAgentDialog())); - userAgentAction->setShortcut(QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_U)); - - toolsMenu->addAction("Select Elements...", this, SLOT(selectElements())); - - QAction* showInspectorAction = toolsMenu->addAction("Show Web Inspector", m_inspector, SLOT(setVisible(bool)), QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_I)); - showInspectorAction->setCheckable(true); - showInspectorAction->connect(m_inspector, SIGNAL(visibleChanged(bool)), SLOT(setChecked(bool))); - - // GraphicsView sub menu. - QAction* toggleAcceleratedCompositing = graphicsViewMenu->addAction("Toggle Accelerated Compositing", this, SLOT(toggleAcceleratedCompositing(bool))); - toggleAcceleratedCompositing->setCheckable(true); - toggleAcceleratedCompositing->setChecked(settings->testAttribute(QWebSettings::AcceleratedCompositingEnabled)); - toggleAcceleratedCompositing->setEnabled(isGraphicsBased()); - toggleAcceleratedCompositing->connect(toggleGraphicsView, SIGNAL(toggled(bool)), SLOT(setEnabled(bool))); - - QAction* toggleResizesToContents = graphicsViewMenu->addAction("Toggle Resizes To Contents Mode", this, SLOT(toggleResizesToContents(bool))); - toggleResizesToContents->setCheckable(true); - toggleResizesToContents->setChecked(false); - toggleResizesToContents->setEnabled(isGraphicsBased()); - toggleResizesToContents->connect(toggleGraphicsView, SIGNAL(toggled(bool)), SLOT(setEnabled(bool))); - - QAction* toggleTiledBackingStore = graphicsViewMenu->addAction("Toggle Tiled Backing Store", this, SLOT(toggleTiledBackingStore(bool))); - toggleTiledBackingStore->setCheckable(true); - toggleTiledBackingStore->setChecked(false); - toggleTiledBackingStore->setEnabled(isGraphicsBased()); - toggleTiledBackingStore->connect(toggleGraphicsView, SIGNAL(toggled(bool)), SLOT(setEnabled(bool))); - -#if defined(QT_CONFIGURED_WITH_OPENGL) - QAction* toggleQGLWidgetViewport = graphicsViewMenu->addAction("Toggle use of QGLWidget Viewport", this, SLOT(toggleQGLWidgetViewport(bool))); - toggleQGLWidgetViewport->setCheckable(true); - toggleQGLWidgetViewport->setChecked(gUseQGLWidgetViewport); - toggleQGLWidgetViewport->setEnabled(isGraphicsBased()); - toggleQGLWidgetViewport->connect(toggleGraphicsView, SIGNAL(toggled(bool)), SLOT(setEnabled(bool))); -#endif - - QMenu* viewportUpdateMenu = graphicsViewMenu->addMenu("Change Viewport Update Mode"); - viewportUpdateMenu->setEnabled(isGraphicsBased()); - viewportUpdateMenu->connect(toggleGraphicsView, SIGNAL(toggled(bool)), SLOT(setEnabled(bool))); - - QAction* fullUpdate = viewportUpdateMenu->addAction("FullViewportUpdate"); - fullUpdate->setCheckable(true); - fullUpdate->setChecked((gViewportUpdateMode == QGraphicsView::FullViewportUpdate) ? true : false); - - QAction* minimalUpdate = viewportUpdateMenu->addAction("MinimalViewportUpdate"); - minimalUpdate->setCheckable(true); - minimalUpdate->setChecked((gViewportUpdateMode == QGraphicsView::MinimalViewportUpdate) ? true : false); - - QAction* smartUpdate = viewportUpdateMenu->addAction("SmartViewportUpdate"); - smartUpdate->setCheckable(true); - smartUpdate->setChecked((gViewportUpdateMode == QGraphicsView::SmartViewportUpdate) ? true : false); - - QAction* boundingRectUpdate = viewportUpdateMenu->addAction("BoundingRectViewportUpdate"); - boundingRectUpdate->setCheckable(true); - boundingRectUpdate->setChecked((gViewportUpdateMode == QGraphicsView::BoundingRectViewportUpdate) ? true : false); - - QAction* noUpdate = viewportUpdateMenu->addAction("NoViewportUpdate"); - noUpdate->setCheckable(true); - noUpdate->setChecked((gViewportUpdateMode == QGraphicsView::NoViewportUpdate) ? true : false); - - QSignalMapper* signalMapper = new QSignalMapper(viewportUpdateMenu); - signalMapper->setMapping(fullUpdate, QGraphicsView::FullViewportUpdate); - signalMapper->setMapping(minimalUpdate, QGraphicsView::MinimalViewportUpdate); - signalMapper->setMapping(smartUpdate, QGraphicsView::SmartViewportUpdate); - signalMapper->setMapping(boundingRectUpdate, QGraphicsView::BoundingRectViewportUpdate); - signalMapper->setMapping(noUpdate, QGraphicsView::NoViewportUpdate); - - connect(fullUpdate, SIGNAL(triggered()), signalMapper, SLOT(map())); - connect(minimalUpdate, SIGNAL(triggered()), signalMapper, SLOT(map())); - connect(smartUpdate, SIGNAL(triggered()), signalMapper, SLOT(map())); - connect(boundingRectUpdate, SIGNAL(triggered()), signalMapper, SLOT(map())); - connect(noUpdate, SIGNAL(triggered()), signalMapper, SLOT(map())); - - connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(changeViewportUpdateMode(int))); - - QActionGroup* viewportUpdateModeActions = new QActionGroup(viewportUpdateMenu); - viewportUpdateModeActions->addAction(fullUpdate); - viewportUpdateModeActions->addAction(minimalUpdate); - viewportUpdateModeActions->addAction(smartUpdate); - viewportUpdateModeActions->addAction(boundingRectUpdate); - viewportUpdateModeActions->addAction(noUpdate); - - graphicsViewMenu->addSeparator(); - - m_flipAnimated = graphicsViewMenu->addAction("Animated Flip"); - m_flipAnimated->connect(toggleGraphicsView, SIGNAL(toggled(bool)), SLOT(setEnabled(bool))); - m_flipAnimated->setEnabled(isGraphicsBased()); - - m_flipYAnimated = graphicsViewMenu->addAction("Animated Y-Flip"); - m_flipYAnimated->connect(toggleGraphicsView, SIGNAL(toggled(bool)), SLOT(setEnabled(bool))); - m_flipYAnimated->setEnabled(isGraphicsBased()); - - if (isGraphicsBased()) { - WebViewGraphicsBased* view = static_cast(m_view); - connect(m_flipAnimated, SIGNAL(triggered()), view, SLOT(animatedFlip())); - connect(m_flipYAnimated, SIGNAL(triggered()), view, SLOT(animatedYFlip())); - } - - QAction* cloneWindow = graphicsViewMenu->addAction("Clone Window", this, SLOT(cloneWindow())); - cloneWindow->connect(toggleGraphicsView, SIGNAL(toggled(bool)), SLOT(setEnabled(bool))); - cloneWindow->setEnabled(isGraphicsBased()); - - graphicsViewMenu->addSeparator(); - - QAction* showFPS = graphicsViewMenu->addAction("Show FPS", this, SLOT(showFPS(bool))); - showFPS->setCheckable(true); - showFPS->setEnabled(isGraphicsBased()); - showFPS->connect(toggleGraphicsView, SIGNAL(toggled(bool)), SLOT(setEnabled(bool))); - showFPS->setChecked(gShowFrameRate); -} - -QWebPage* WebPage::createWindow(QWebPage::WebWindowType type) -{ - LauncherWindow* mw = new LauncherWindow; - if (type == WebModalDialog) - mw->setWindowModality(Qt::ApplicationModal); - mw->show(); - return mw->page(); -} - -QObject* WebPage::createPlugin(const QString &classId, const QUrl&, const QStringList&, const QStringList&) -{ - if (classId == "alien_QLabel") { - QLabel* l = new QLabel; - l->winId(); - return l; - } - -#ifndef QT_NO_UITOOLS - QUiLoader loader; - return loader.createWidget(classId, view()); -#else - Q_UNUSED(classId); - return 0; -#endif -} - int launcherMain(const QApplication& app) { @@ -1092,7 +89,7 @@ LauncherApplication::LauncherApplication(int& argc, char** argv) static void requiresGraphicsView(const QString& option) { - if (gUseGraphicsView) + if (LauncherWindow::gUseGraphicsView) return; appQuit(1, QString("%1 only works in combination with the -graphicsbased option").arg(option)); } @@ -1124,31 +121,31 @@ void LauncherApplication::handleUserOptions() } if (args.contains("-graphicsbased")) - gUseGraphicsView = true; + LauncherWindow::gUseGraphicsView = true; if (args.contains("-no-compositing")) { requiresGraphicsView("-no-compositing"); - gUseCompositing = false; + LauncherWindow::gUseCompositing = false; } if (args.contains("-show-fps")) { requiresGraphicsView("-show-fps"); - gShowFrameRate = true; + LauncherWindow::gShowFrameRate = true; } if (args.contains("-cache-webview")) { requiresGraphicsView("-cache-webview"); - gCacheWebView = true; + LauncherWindow::gCacheWebView = true; } if (args.contains("-tiled-backing-store")) { requiresGraphicsView("-tiled-backing-store"); - gUseTiledBackingStore = true; + LauncherWindow::gUseTiledBackingStore = true; } if (args.contains("-resizes-to-contents")) { requiresGraphicsView("-resizes-to-contents"); - gResizesToContents = true; + LauncherWindow::gResizesToContents = true; } QString arg1("-viewport-update-mode"); @@ -1163,13 +160,13 @@ void LauncherApplication::handleUserOptions() if (idx == -1) appQuit(1, QString("%1 value has to be one of [%2]").arg(arg1).arg(formatKeys(updateModes))); - gViewportUpdateMode = static_cast(idx); + LauncherWindow::gViewportUpdateMode = static_cast(idx); } QString inspectorUrlArg("-inspector-url"); int inspectorUrlIndex = args.indexOf(inspectorUrlArg); if (inspectorUrlIndex != -1) - gInspectorUrl = takeOptionValue(&args, inspectorUrlIndex); + LauncherWindow::gInspectorUrl = takeOptionValue(&args, inspectorUrlIndex); int robotIndex = args.indexOf("-r"); if (robotIndex != -1) { diff --git a/WebKitTools/QtTestBrowser/webpage.cpp b/WebKitTools/QtTestBrowser/webpage.cpp index ee0232b..137c65c 100644 --- a/WebKitTools/QtTestBrowser/webpage.cpp +++ b/WebKitTools/QtTestBrowser/webpage.cpp @@ -32,6 +32,8 @@ #include "webpage.h" +#include "launcherwindow.h" + #include #include #include @@ -185,3 +187,30 @@ void WebPage::checkPermission(QWebFrame* frame, QWebPage::PermissionDomain domai void WebPage::cancelRequestsForPermission(QWebFrame*, QWebPage::PermissionDomain) { } + +QWebPage* WebPage::createWindow(QWebPage::WebWindowType type) +{ + LauncherWindow* mw = new LauncherWindow; + if (type == WebModalDialog) + mw->setWindowModality(Qt::ApplicationModal); + mw->show(); + return mw->page(); +} + +QObject* WebPage::createPlugin(const QString &classId, const QUrl&, const QStringList&, const QStringList&) +{ + if (classId == "alien_QLabel") { + QLabel* l = new QLabel; + l->winId(); + return l; + } + +#ifndef QT_NO_UITOOLS + QUiLoader loader; + return loader.createWidget(classId, view()); +#else + Q_UNUSED(classId); + return 0; +#endif +} + diff --git a/WebKitTools/QtTestBrowser/webview.h b/WebKitTools/QtTestBrowser/webview.h index 30161bb..9b533b3 100644 --- a/WebKitTools/QtTestBrowser/webview.h +++ b/WebKitTools/QtTestBrowser/webview.h @@ -82,6 +82,7 @@ public: virtual void paintEvent(QPaintEvent* event); void setResizesToContents(bool b); + bool resizesToContents() const { return m_resizesToContents; } void setYRotation(qreal angle) { -- cgit v1.1