Unreviewed, rolling out r189530 and r189534.
[WebKit-https.git] / Tools / WebKitTestRunner / efl / PlatformWebViewEfl.cpp
1 /*
2  * Copyright (C) 2012 Samsung Electronics
3  * Copyright (C) 2012 Intel Corporation. All rights reserved.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this program; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #include "config.h"
22 #include "ewk_view_private.h"
23 #include "PlatformWebView.h"
24
25 #include "EWebKit2.h"
26 #include <Ecore_Evas.h>
27 #include <WebCore/RefPtrCairo.h>
28 #include <WebKit/WKImageCairo.h>
29 #include <WebKit/WKViewEfl.h>
30 #include <cairo.h>
31
32 using namespace WebKit;
33
34 namespace WTR {
35
36 static Ecore_Evas* initEcoreEvas()
37 {
38     Ecore_Evas* ecoreEvas = 0;
39 #if defined(HAVE_ECORE_X)
40     const char* engine = "opengl_x11";
41     ecoreEvas = ecore_evas_new(engine, 0, 0, 800, 600, 0);
42     // Graceful fallback to software rendering if evas_gl engine is not available.
43     if (!ecoreEvas)
44 #endif
45     ecoreEvas = ecore_evas_new(0, 0, 0, 800, 600, 0);
46
47     if (!ecoreEvas)
48         return 0;
49
50     ecore_evas_title_set(ecoreEvas, "EFL WebKitTestRunner");
51     ecore_evas_show(ecoreEvas);
52
53     return ecoreEvas;
54 }
55
56 PlatformWebView::PlatformWebView(WKPageConfigurationRef configuration, const ViewOptions& options)
57     : m_options(options)
58 {
59     WKRetainPtr<WKStringRef> useFixedLayoutKey(AdoptWK, WKStringCreateWithUTF8CString("UseFixedLayout"));
60     m_usingFixedLayout = options.useFixedLayout;
61
62     m_window = initEcoreEvas();
63
64     WKContextRef context = WKPageConfigurationGetContext(configuration);
65     WKPageGroupRef pageGroup = WKPageConfigurationGetPageGroup(configuration);
66     m_view = EWKViewCreate(context, pageGroup, ecore_evas_get(m_window), /* smart */ 0);
67
68     WKPageSetUseFixedLayout(WKViewGetPage(EWKViewGetWKView(m_view)), m_usingFixedLayout);
69
70     if (m_usingFixedLayout)
71         resizeTo(800, 600);
72
73     ewk_view_theme_set(m_view, DEFAULT_THEME_DIR "/default.edj");
74     m_windowIsKey = false;
75     evas_object_show(m_view);
76 }
77
78 PlatformWebView::~PlatformWebView()
79 {
80     evas_object_del(m_view);
81
82     ecore_evas_free(m_window);
83 }
84
85 void PlatformWebView::resizeTo(unsigned width, unsigned height)
86 {
87     // FIXME: Don't we need to resize the window too?
88     evas_object_resize(m_view, width, height);
89 }
90
91 WKPageRef PlatformWebView::page()
92 {
93     return WKViewGetPage(EWKViewGetWKView(m_view));
94 }
95
96 void PlatformWebView::focus()
97 {
98     // In a few cases, an iframe might receive focus from JavaScript and Evas is not aware of it at all
99     // (WebCoreSupport::focusedFrameChanged() does not emit any notification). We then manually remove the
100     // focus from the view to make the call give focus to evas_object_focus_set(..., true) to be effectful.
101     if (WKPageGetFocusedFrame(page()) != WKPageGetMainFrame(page()))
102         evas_object_focus_set(m_view, false);
103     evas_object_focus_set(m_view, true);
104 }
105
106 WKRect PlatformWebView::windowFrame()
107 {
108     int x, y, width, height;
109
110     ecore_evas_request_geometry_get(m_window, &x, &y, &width, &height);
111
112     return WKRectMake(x, y, width, height);
113 }
114
115 void PlatformWebView::setWindowFrame(WKRect frame)
116 {
117     ecore_evas_move_resize(m_window, frame.origin.x, frame.origin.y, frame.size.width, frame.size.height);
118     evas_object_resize(m_view, frame.size.width, frame.size.height);
119 }
120
121 void PlatformWebView::addChromeInputField()
122 {
123 }
124
125 void PlatformWebView::removeChromeInputField()
126 {
127 }
128
129 void PlatformWebView::makeWebViewFirstResponder()
130 {
131 }
132
133 void PlatformWebView::changeWindowScaleIfNeeded(float)
134 {
135 }
136
137 WKRetainPtr<WKImageRef> PlatformWebView::windowSnapshotImage()
138 {
139     int width;
140     int height;
141     ecore_evas_geometry_get(m_window, 0, 0, &width, &height);
142     ASSERT(width > 0 && height > 0);
143
144     return adoptWK(WKViewCreateSnapshot(EWKViewGetWKView(m_view)));
145 }
146
147 bool PlatformWebView::viewSupportsOptions(const ViewOptions& options) const
148 {
149     if (m_options.useFixedLayout != options.useFixedLayout)
150         return false;
151
152     return true;
153 }
154
155 void PlatformWebView::didInitializeClients()
156 {
157 }
158
159 void PlatformWebView::setNavigationGesturesEnabled(bool)
160 {
161 }
162
163 } // namespace WTR
164