7f51239992ab883dcda7f0401f84538e1fc43bf6
[WebKit-https.git] / Tools / WebKitTestRunner / qt / PlatformWebViewQt.cpp
1 /*
2  * Copyright (C) 2010 Apple Inc. All rights reserved.
3  * Copyright (C) 2010 University of Szeged. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include "config.h"
28
29 #include "PlatformWebView.h"
30 #include "qquickwebpage_p.h"
31 #include "qquickwebview_p.h"
32
33 #include <QCoreApplication>
34 #include <QDeclarativeProperty>
35 #include <QEventLoop>
36 #include <QtQuick/QQuickView>
37 #include <qwindowsysteminterface_qpa.h>
38
39 namespace WTR {
40
41 class WrapperWindow : public QQuickView {
42     Q_OBJECT
43 public:
44     WrapperWindow(QQuickWebView* view)
45         : QQuickView(QUrl("data:text/plain,import QtQuick 2.0\nItem { objectName: 'root' }"))
46         , m_view(view)
47     {
48         connect(this, SIGNAL(statusChanged(QQuickView::Status)), SLOT(handleStatusChanged(QQuickView::Status)));
49     }
50
51 private slots:
52     void handleStatusChanged(QQuickView::Status status)
53     {
54         if (status != QQuickView::Ready)
55             return;
56
57         setGeometry(0, 0, 800, 600);
58
59         setResizeMode(QQuickView::SizeRootObjectToView);
60         m_view->setParentItem(rootObject());
61         QDeclarativeProperty::write(m_view, "anchors.fill", qVariantFromValue(rootObject()));
62
63         QWindowSystemInterface::handleWindowActivated(this);
64         m_view->page()->setFocus(true);
65     }
66
67 private:
68     QQuickWebView* m_view;
69 };
70
71 PlatformWebView::PlatformWebView(WKContextRef contextRef, WKPageGroupRef pageGroupRef)
72     : m_view(new QQuickWebView(contextRef, pageGroupRef))
73     , m_window(new WrapperWindow(m_view))
74     , m_windowIsKey(true)
75     , m_modalEventLoop(0)
76 {
77     QQuickWebViewExperimental experimental(m_view);
78     experimental.setRenderToOffscreenBuffer(true);
79 }
80
81 PlatformWebView::~PlatformWebView()
82 {
83     delete m_window;
84     if (m_modalEventLoop)
85         m_modalEventLoop->exit();
86 }
87
88 void PlatformWebView::resizeTo(unsigned width, unsigned height)
89 {
90     // If we do not have a platform window we will never get the necessary
91     // resize event, so simulate it in that case to make sure the quickview is
92     // resized to what the layout test expects.
93     if (!m_window->handle()) {
94         QRect newGeometry(m_window->x(), m_window->y(), width, height);
95         QWindowSystemInterface::handleSynchronousGeometryChange(m_window, newGeometry);
96     }
97
98     m_window->resize(width, height);
99 }
100
101 WKPageRef PlatformWebView::page()
102 {
103     return m_view->pageRef();
104 }
105
106 void PlatformWebView::focus()
107 {
108     m_view->setFocus(Qt::OtherFocusReason);
109 }
110
111 WKRect PlatformWebView::windowFrame()
112 {
113     QRect windowRect = m_window->geometry();
114     WKRect wkFrame;
115     wkFrame.origin.x = windowRect.x();
116     wkFrame.origin.y = windowRect.y();
117     wkFrame.size.width = windowRect.size().width();
118     wkFrame.size.height = windowRect.size().height();
119     return wkFrame;
120 }
121
122 void PlatformWebView::setWindowFrame(WKRect wkRect)
123 {
124     m_window->setGeometry(wkRect.origin.x, wkRect.origin.y, wkRect.size.width, wkRect.size.height);
125 }
126
127 bool PlatformWebView::sendEvent(QEvent* event)
128 {
129     return QCoreApplication::sendEvent(m_window, event);
130 }
131
132 void PlatformWebView::postEvent(QEvent* event)
133 {
134     QCoreApplication::postEvent(m_window, event);
135 }
136
137 void PlatformWebView::addChromeInputField()
138 {
139 }
140
141 void PlatformWebView::removeChromeInputField()
142 {
143 }
144
145 void PlatformWebView::makeWebViewFirstResponder()
146 {
147 }
148
149 WKRetainPtr<WKImageRef> PlatformWebView::windowSnapshotImage()
150 {
151     // FIXME: implement to capture pixels in the UI process,
152     // which may be necessary to capture things like 3D transforms.
153     return 0;
154 }
155
156 } // namespace WTR
157
158 #include "PlatformWebViewQt.moc"