[EFL] Rename TEST_THEME_DIR macro
[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 "WebKit/WKAPICast.h"
27 #include <Ecore_Evas.h>
28 #include <WebCore/RefPtrCairo.h>
29 #include <WebKit/WKImageCairo.h>
30 #include <WebKit/WKViewEfl.h>
31 #include <cairo.h>
32
33 using namespace WebKit;
34
35 namespace WTR {
36
37 static Ecore_Evas* initEcoreEvas()
38 {
39     Ecore_Evas* ecoreEvas = 0;
40 #if defined(HAVE_ECORE_X)
41     const char* engine = "opengl_x11";
42     ecoreEvas = ecore_evas_new(engine, 0, 0, 800, 600, 0);
43     // Graceful fallback to software rendering if evas_gl engine is not available.
44     if (!ecoreEvas)
45 #endif
46     ecoreEvas = ecore_evas_new(0, 0, 0, 800, 600, 0);
47
48     if (!ecoreEvas)
49         return 0;
50
51     ecore_evas_title_set(ecoreEvas, "EFL WebKitTestRunner");
52     ecore_evas_show(ecoreEvas);
53
54     return ecoreEvas;
55 }
56
57 PlatformWebView::PlatformWebView(WKContextRef context, WKPageGroupRef pageGroup, WKPageRef /* relatedPage */, WKDictionaryRef options)
58     : m_options(options)
59 {
60     WKRetainPtr<WKStringRef> useFixedLayoutKey(AdoptWK, WKStringCreateWithUTF8CString("UseFixedLayout"));
61     m_usingFixedLayout = options ? WKBooleanGetValue(static_cast<WKBooleanRef>(WKDictionaryGetItemForKey(options, useFixedLayoutKey.get()))) : false;
62
63     m_window = initEcoreEvas();
64
65     m_view = EWKViewCreate(context, pageGroup, ecore_evas_get(m_window), /* smart */ 0);
66
67     WKPageSetUseFixedLayout(WKViewGetPage(EWKViewGetWKView(m_view)), m_usingFixedLayout);
68
69     if (m_usingFixedLayout)
70         resizeTo(800, 600);
71
72     ewk_view_theme_set(m_view, DEFAULT_THEME_DIR "/default.edj");
73     m_windowIsKey = false;
74     evas_object_show(m_view);
75 }
76
77 PlatformWebView::~PlatformWebView()
78 {
79     evas_object_del(m_view);
80
81     ecore_evas_free(m_window);
82 }
83
84 void PlatformWebView::resizeTo(unsigned width, unsigned height)
85 {
86     // FIXME: Don't we need to resize the window too?
87     evas_object_resize(m_view, width, height);
88 }
89
90 WKPageRef PlatformWebView::page()
91 {
92     return WKViewGetPage(EWKViewGetWKView(m_view));
93 }
94
95 void PlatformWebView::focus()
96 {
97     // In a few cases, an iframe might receive focus from JavaScript and Evas is not aware of it at all
98     // (WebCoreSupport::focusedFrameChanged() does not emit any notification). We then manually remove the
99     // focus from the view to make the call give focus to evas_object_focus_set(..., true) to be effectful.
100     if (WKPageGetFocusedFrame(page()) != WKPageGetMainFrame(page()))
101         evas_object_focus_set(m_view, false);
102     evas_object_focus_set(m_view, true);
103 }
104
105 WKRect PlatformWebView::windowFrame()
106 {
107     int x, y, width, height;
108
109     ecore_evas_request_geometry_get(m_window, &x, &y, &width, &height);
110
111     return WKRectMake(x, y, width, height);
112 }
113
114 void PlatformWebView::setWindowFrame(WKRect frame)
115 {
116     ecore_evas_move_resize(m_window, frame.origin.x, frame.origin.y, frame.size.width, frame.size.height);
117     evas_object_resize(m_view, frame.size.width, frame.size.height);
118 }
119
120 void PlatformWebView::addChromeInputField()
121 {
122 }
123
124 void PlatformWebView::removeChromeInputField()
125 {
126 }
127
128 void PlatformWebView::makeWebViewFirstResponder()
129 {
130 }
131
132 void PlatformWebView::changeWindowScaleIfNeeded(float)
133 {
134 }
135
136 WKRetainPtr<WKImageRef> PlatformWebView::windowSnapshotImage()
137 {
138     int width;
139     int height;
140     ecore_evas_geometry_get(m_window, 0, 0, &width, &height);
141     ASSERT(width > 0 && height > 0);
142
143     return adoptWK(WKViewCreateSnapshot(EWKViewGetWKView(m_view)));
144 }
145
146 bool PlatformWebView::viewSupportsOptions(WKDictionaryRef options) const
147 {
148     WKRetainPtr<WKStringRef> useFixedLayoutKey(AdoptWK, WKStringCreateWithUTF8CString("UseFixedLayout"));
149
150     return m_usingFixedLayout == (options ? WKBooleanGetValue(static_cast<WKBooleanRef>(WKDictionaryGetItemForKey(options, useFixedLayoutKey.get()))) : false);
151 }
152
153 void PlatformWebView::didInitializeClients()
154 {
155 }
156
157 } // namespace WTR
158