diff options
author | Ben Murdoch <benm@google.com> | 2011-05-13 16:23:25 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2011-05-16 11:35:02 +0100 |
commit | 65f03d4f644ce73618e5f4f50dd694b26f55ae12 (patch) | |
tree | f478babb801e720de7bfaee23443ffe029f58731 /Source/WebKit/qt/WebCoreSupport/PageClientQt.h | |
parent | 47de4a2fb7262c7ebdb9cd133ad2c54c187454d0 (diff) | |
download | external_webkit-65f03d4f644ce73618e5f4f50dd694b26f55ae12.zip external_webkit-65f03d4f644ce73618e5f4f50dd694b26f55ae12.tar.gz external_webkit-65f03d4f644ce73618e5f4f50dd694b26f55ae12.tar.bz2 |
Merge WebKit at r75993: Initial merge by git.
Change-Id: I602bbdc3974787a3b0450456a30a7868286921c3
Diffstat (limited to 'Source/WebKit/qt/WebCoreSupport/PageClientQt.h')
-rw-r--r-- | Source/WebKit/qt/WebCoreSupport/PageClientQt.h | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/Source/WebKit/qt/WebCoreSupport/PageClientQt.h b/Source/WebKit/qt/WebCoreSupport/PageClientQt.h new file mode 100644 index 0000000..16bb50c --- /dev/null +++ b/Source/WebKit/qt/WebCoreSupport/PageClientQt.h @@ -0,0 +1,239 @@ +/* + * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef PageClientQt_h +#define PageClientQt_h + +#include "FrameView.h" +#include "GraphicsContext.h" +#include "IntRect.h" +#include "QWebPageClient.h" +#include "TiledBackingStore.h" +#include "qgraphicswebview.h" +#include "qwebframe.h" +#include "qwebframe_p.h" +#include "qwebpage.h" +#include "qwebpage_p.h" +#include <QtCore/qmetaobject.h> +#include <QtGui/qgraphicsscene.h> +#include <QtGui/qgraphicsview.h> +#include <QtGui/qgraphicswidget.h> +#include <QtGui/qscrollbar.h> +#include <QtGui/qstyleoption.h> +#include <QtGui/qwidget.h> + +#include <Settings.h> + +#if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER) +#include "texmap/TextureMapperPlatformLayer.h" +#endif + +namespace WebCore { + +class PageClientQWidget : public QWebPageClient { +public: + PageClientQWidget(QWidget* newView, QWebPage* newPage) + : view(newView) + , page(newPage) +#if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER) + , syncTimer(this, &PageClientQWidget::syncLayers) + , platformLayerProxy(0) +#endif + { + Q_ASSERT(view); + } + virtual ~PageClientQWidget(); + + virtual bool isQWidgetClient() const { return true; } + + virtual void scroll(int dx, int dy, const QRect&); + virtual void update(const QRect& dirtyRect); + virtual void setInputMethodEnabled(bool enable); + virtual bool inputMethodEnabled() const; + virtual void setInputMethodHints(Qt::InputMethodHints hints); + +#ifndef QT_NO_CURSOR + virtual QCursor cursor() const; + virtual void updateCursor(const QCursor& cursor); +#endif + + virtual QPalette palette() const; + virtual int screenNumber() const; + virtual QWidget* ownerWidget() const; + virtual QRect geometryRelativeToOwnerWidget() const; + + virtual QObject* pluginParent() const; + + virtual QStyle* style() const; + + virtual bool viewResizesToContentsEnabled() const { return false; } + + virtual QRectF windowRect() const; + + QWidget* view; + QWebPage* page; + +#if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER) + virtual void setRootGraphicsLayer(TextureMapperPlatformLayer* layer); + virtual void markForSync(bool scheduleSync); + void syncLayers(Timer<PageClientQWidget>*); +#endif + +#if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER) + virtual bool allowsAcceleratedCompositing() const { return true; } +#else + virtual bool allowsAcceleratedCompositing() const { return false; } +#endif + +#if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER) + Timer<PageClientQWidget> syncTimer; + PlatformLayerProxyQt* platformLayerProxy; +#endif +}; + +#if !defined(QT_NO_GRAPHICSVIEW) +// the overlay is here for one reason only: to have the scroll-bars and other +// extra UI elements appear on top of any QGraphicsItems created by CSS compositing layers +class QGraphicsItemOverlay : public QGraphicsObject { + public: + QGraphicsItemOverlay(QGraphicsWidget* view, QWebPage* p) + :QGraphicsObject(view) + , q(view) + , page(p) + { + setPos(0, 0); + setFlag(QGraphicsItem::ItemUsesExtendedStyleOption, true); + setCacheMode(QGraphicsItem::DeviceCoordinateCache); + } + + QRectF boundingRect() const + { + return q->boundingRect(); + } + + void paint(QPainter* painter, const QStyleOptionGraphicsItem* options, QWidget*) + { + page->mainFrame()->render(painter, static_cast<QWebFrame::RenderLayer>(QWebFrame::AllLayers&(~QWebFrame::ContentsLayer)), options->exposedRect.toRect()); + } + + void prepareGraphicsItemGeometryChange() + { + prepareGeometryChange(); + } + + QGraphicsWidget* q; + QWebPage* page; +}; + + +class PageClientQGraphicsWidget : public QWebPageClient { +public: + PageClientQGraphicsWidget(QGraphicsWebView* newView, QWebPage* newPage) + : view(newView) + , page(newPage) + , viewResizesToContents(false) +#if USE(ACCELERATED_COMPOSITING) +#if USE(TEXTURE_MAPPER) + , platformLayerProxy(0) +#endif + , shouldSync(false) +#endif + , overlay(0) + { + Q_ASSERT(view); +#if USE(ACCELERATED_COMPOSITING) + // the overlay and stays alive for the lifetime of + // this QGraphicsWebView as the scrollbars are needed when there's no compositing + view->setFlag(QGraphicsItem::ItemUsesExtendedStyleOption); + syncMetaMethod = view->metaObject()->method(view->metaObject()->indexOfMethod("syncLayers()")); +#endif + } + + virtual ~PageClientQGraphicsWidget(); + + virtual bool isQWidgetClient() const { return false; } + + virtual void scroll(int dx, int dy, const QRect&); + virtual void update(const QRect& dirtyRect); + virtual void setInputMethodEnabled(bool enable); + virtual bool inputMethodEnabled() const; + virtual void setInputMethodHints(Qt::InputMethodHints hints); + +#ifndef QT_NO_CURSOR + virtual QCursor cursor() const; + virtual void updateCursor(const QCursor& cursor); +#endif + + virtual QPalette palette() const; + virtual int screenNumber() const; + virtual QWidget* ownerWidget() const; + virtual QRect geometryRelativeToOwnerWidget() const; + + virtual QObject* pluginParent() const; + + virtual QStyle* style() const; + + virtual bool viewResizesToContentsEnabled() const { return viewResizesToContents; } + + void createOrDeleteOverlay(); + +#if ENABLE(TILED_BACKING_STORE) + void updateTiledBackingStoreScale(); + virtual QRectF graphicsItemVisibleRect() const; +#endif + +#if USE(ACCELERATED_COMPOSITING) + virtual void setRootGraphicsLayer(PlatformLayer* layer); + virtual void markForSync(bool scheduleSync); + void syncLayers(); + + // QGraphicsWebView can render composited layers + virtual bool allowsAcceleratedCompositing() const { return true; } +#endif + + virtual QRectF windowRect() const; + + QGraphicsWebView* view; + QWebPage* page; + bool viewResizesToContents; + +#if USE(ACCELERATED_COMPOSITING) +#if USE(TEXTURE_MAPPER) + PlatformLayerProxyQt* platformLayerProxy; +#else + QWeakPointer<QGraphicsObject> rootGraphicsLayer; +#endif + // we have to flush quite often, so we use a meta-method instead of QTimer::singleShot for putting the event in the queue + QMetaMethod syncMetaMethod; + + // we need to sync the layers if we get a special call from the WebCore + // compositor telling us to do so. We'll get that call from ChromeClientQt + bool shouldSync; +#endif + // the overlay gets instantiated when the root layer is attached, and get deleted when it's detached + QGraphicsItemOverlay* overlay; + + // we need to put the root graphics layer behind the overlay (which contains the scrollbar) + enum { RootGraphicsLayerZValue, OverlayZValue }; +}; +#endif // QT_NO_GRAPHICSVIEW + +} +#endif // PageClientQt |