tizen beta release
[profile/ivi/webkit-efl.git] / Tools / DumpRenderTree / efl / DumpRenderTreeChrome.cpp
1 /*
2  * Copyright (C) 2011 ProFUSION Embedded Systems
3  * Copyright (C) 2011 Samsung Electronics
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 ITS CONTRIBUTORS
15  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
17  * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT
18  * HOLDERS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT 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 OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include "config.h"
28 #include "DumpRenderTreeChrome.h"
29
30 #if ENABLE(TIZEN_WEBKIT_EFL_DRT)
31 #include "DumpRenderTree.h"
32 #include "DumpRenderTreeView.h"
33 #include "EventSender.h"
34 #include "GCController.h"
35 #include "LayoutTestController.h"
36 #include "NotImplemented.h"
37 #include "WebCoreSupport/DumpRenderTreeSupportEfl.h"
38 #include "WorkQueue.h"
39 #include "ewk_private.h" // FIXME: create some WebCoreSupport/DumpRenderTree.cpp instead
40
41 #include <EWebKit.h>
42 #include <Ecore.h>
43 #include <Eina.h>
44 #include <Evas.h>
45 #include <cstdio>
46 #include <wtf/NotFound.h>
47
48 PassOwnPtr<DumpRenderTreeChrome> DumpRenderTreeChrome::create(Evas* evas)
49 {
50     OwnPtr<DumpRenderTreeChrome> chrome = adoptPtr(new DumpRenderTreeChrome(evas));
51
52     if (!chrome->initialize())
53         return nullptr;
54
55     return chrome.release();
56 }
57
58 DumpRenderTreeChrome::DumpRenderTreeChrome(Evas* evas)
59     : m_mainView(0)
60     , m_mainFrame(0)
61     , m_evas(evas)
62     , m_gcController(adoptPtr(new GCController))
63 {
64 }
65
66 DumpRenderTreeChrome::~DumpRenderTreeChrome()
67 {
68 }
69
70 Evas_Object* DumpRenderTreeChrome::createNewWindow()
71 {
72     Evas_Object* newView = createView();
73
74     ewk_view_setting_scripts_can_open_windows_set(newView, EINA_TRUE);
75     ewk_view_setting_scripts_can_close_windows_set(newView, EINA_TRUE);
76
77     m_extraViews.append(newView);
78
79     return newView;
80 }
81
82 Evas_Object* DumpRenderTreeChrome::createView() const
83 {
84     Evas_Object* view = drtViewAdd(m_evas);
85     if (!view)
86         return 0;
87
88     ewk_view_theme_set(view, DATA_DIR"/default.edj");
89
90     evas_object_smart_callback_add(view, "load,started", onLoadStarted, 0);
91     evas_object_smart_callback_add(view, "load,finished", onLoadFinished, 0);
92     evas_object_smart_callback_add(view, "title,changed", onTitleChanged, 0);
93     evas_object_smart_callback_add(view, "window,object,cleared", onWindowObjectCleared, m_gcController.get());
94     evas_object_smart_callback_add(view, "statusbar,text,set", onStatusbarTextSet, 0);
95     evas_object_smart_callback_add(view, "load,document,finished", onDocumentLoadFinished, 0);
96
97     return view;
98 }
99
100 void DumpRenderTreeChrome::removeWindow(Evas_Object* view)
101 {
102     const size_t pos = m_extraViews.find(view);
103
104     if (pos == notFound)
105         return;
106
107     m_extraViews.remove(pos);
108     evas_object_del(view);
109 }
110
111 bool DumpRenderTreeChrome::initialize()
112 {
113     DumpRenderTreeSupportEfl::setMockScrollbarsEnabled(true);
114
115     m_mainView = createView();
116     if (!m_mainView)
117         return false;
118
119     ewk_view_theme_set(m_mainView, DATA_DIR"/default.edj");
120
121     evas_object_name_set(m_mainView, "m_mainView");
122     evas_object_move(m_mainView, 0, 0);
123     evas_object_resize(m_mainView, 800, 600);
124     evas_object_layer_set(m_mainView, EVAS_LAYER_MAX);
125     evas_object_show(m_mainView);
126     evas_object_focus_set(m_mainView, EINA_TRUE);
127
128     m_mainFrame = ewk_view_frame_main_get(m_mainView);
129
130     return true;
131 }
132
133 Vector<Evas_Object*> DumpRenderTreeChrome::extraViews() const
134 {
135     return m_extraViews;
136 }
137
138 Evas_Object* DumpRenderTreeChrome::mainFrame() const
139 {
140     return m_mainFrame;
141 }
142
143 Evas_Object* DumpRenderTreeChrome::mainView() const
144 {
145     return m_mainView;
146 }
147
148 void DumpRenderTreeChrome::resetDefaultsToConsistentValues()
149 {
150     Vector<Evas_Object*>::iterator it = m_extraViews.begin();
151     for (; it != m_extraViews.end(); ++it)
152         evas_object_del(*it);
153     m_extraViews.clear();
154
155     ewk_settings_icon_database_clear();
156     ewk_settings_icon_database_path_set(0);
157
158     ewk_view_setting_private_browsing_set(mainView(), EINA_FALSE);
159     ewk_view_setting_spatial_navigation_set(mainView(), EINA_FALSE);
160     ewk_view_setting_enable_frame_flattening_set(mainView(), EINA_FALSE);
161     ewk_view_setting_application_cache_set(mainView(), EINA_TRUE);
162     ewk_view_setting_enable_scripts_set(mainView(), EINA_TRUE);
163     ewk_view_font_family_name_set(mainView(), EWK_FONT_FAMILY_STANDARD, "Times");
164     ewk_view_font_family_name_set(mainView(), EWK_FONT_FAMILY_MONOSPACE, "Courier");
165     ewk_view_font_family_name_set(mainView(), EWK_FONT_FAMILY_SERIF, "Times");
166     ewk_view_font_family_name_set(mainView(), EWK_FONT_FAMILY_SANS_SERIF, "Helvetica");
167     ewk_view_font_family_name_set(mainView(), EWK_FONT_FAMILY_CURSIVE, "cursive");
168     ewk_view_font_family_name_set(mainView(), EWK_FONT_FAMILY_FANTASY, "fantasy");
169     ewk_view_setting_font_default_size_set(mainView(), 16);
170     ewk_view_setting_font_monospace_size_set(mainView(), 13);
171     ewk_view_setting_font_minimum_size_set(mainView(), 0);
172     ewk_view_setting_caret_browsing_set(mainView(), EINA_FALSE);
173     ewk_view_setting_page_cache_set(mainView(), EINA_FALSE);
174     ewk_view_setting_enable_auto_resize_window_set(mainView(), EINA_TRUE);
175     ewk_view_setting_enable_plugins_set(mainView(), EINA_TRUE);
176     ewk_view_setting_scripts_can_open_windows_set(mainView(), EINA_TRUE);
177     ewk_view_setting_scripts_can_close_windows_set(mainView(), EINA_TRUE);
178
179     ewk_view_zoom_set(mainView(), 1.0, 0, 0);
180     ewk_view_scale_set(mainView(), 1.0, 0, 0);
181
182     ewk_history_clear(ewk_view_history_get(mainView()));
183
184     ewk_cookies_clear();
185     ewk_cookies_policy_set(EWK_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY);
186
187     DumpRenderTreeSupportEfl::clearFrameName(mainFrame());
188     DumpRenderTreeSupportEfl::clearOpener(mainFrame());
189 }
190
191 // Smart Callbacks
192 // ---------------
193
194 void DumpRenderTreeChrome::onWindowObjectCleared(void* userData, Evas_Object*, void* eventInfo)
195 {
196     Ewk_Window_Object_Cleared_Event* objectClearedInfo = static_cast<Ewk_Window_Object_Cleared_Event*>(eventInfo);
197     JSValueRef exception = 0;
198     ASSERT(gLayoutTestController);
199
200     GCController* gcController = static_cast<GCController*>(userData);
201     ASSERT(gcController);
202
203     gLayoutTestController->makeWindowObject(objectClearedInfo->context, objectClearedInfo->windowObject, &exception);
204     ASSERT(!exception);
205
206     gcController->makeWindowObject(objectClearedInfo->context, objectClearedInfo->windowObject, &exception);
207     ASSERT(!exception);
208
209     JSRetainPtr<JSStringRef> controllerName(JSStringCreateWithUTF8CString("eventSender"));
210     JSObjectSetProperty(objectClearedInfo->context, objectClearedInfo->windowObject,
211                         controllerName.get(),
212                         makeEventSender(objectClearedInfo->context, !DumpRenderTreeSupportEfl::frameParent(objectClearedInfo->frame)),
213                         kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, 0);
214 }
215
216 void DumpRenderTreeChrome::onLoadStarted(void*, Evas_Object* view, void*)
217 {
218     // FIXME: we actually need the frame related to this event
219     Evas_Object* frame = ewk_view_frame_main_get(view);
220
221     // Make sure we only set this once per test. If it gets cleared, and then set again, we might
222     // end up doing two dumps for one test.
223     if (!topLoadingFrame && !done)
224         topLoadingFrame = frame;
225 }
226
227 Eina_Bool DumpRenderTreeChrome::processWork(void* data)
228 {
229     Evas_Object* frame = static_cast<Evas_Object*>(data);
230
231     if (WorkQueue::shared()->processWork() && !gLayoutTestController->waitToDump())
232         dump();
233
234     return ECORE_CALLBACK_CANCEL;
235 }
236
237 void DumpRenderTreeChrome::onLoadFinished(void*, Evas_Object* view, void*)
238 {
239     // FIXME: we actually need the frame related to this event
240     Evas_Object* frame = ewk_view_frame_main_get(view);
241
242     if (topLoadingFrame != frame)
243         return;
244
245     topLoadingFrame = 0;
246
247     WorkQueue::shared()->setFrozen(true);
248     if (gLayoutTestController->waitToDump())
249         return;
250
251     if (WorkQueue::shared()->count())
252         ecore_idler_add(processWork, frame);
253     else
254         dump();
255 }
256
257 void DumpRenderTreeChrome::onStatusbarTextSet(void*, Evas_Object*, void* eventInfo)
258 {
259     if (!gLayoutTestController->dumpStatusCallbacks())
260         return;
261
262     const char* statusbarText = static_cast<const char*>(eventInfo);
263     printf("UI DELEGATE STATUS CALLBACK: setStatusText:%s\n", statusbarText);
264 }
265
266 void DumpRenderTreeChrome::onTitleChanged(void*, Evas_Object*, void*)
267 {
268     notImplemented();
269 }
270
271 void DumpRenderTreeChrome::onDocumentLoadFinished(void*, Evas_Object*, void* eventInfo)
272 {
273     const Evas_Object* frame = static_cast<Evas_Object*>(eventInfo);
274     const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
275
276     if (!done && gLayoutTestController->dumpFrameLoadCallbacks())
277         printf("%s - didFinishDocumentLoadForFrame\n", frameName.utf8().data());
278     else if (!done) {
279         const unsigned pendingFrameUnloadEvents = DumpRenderTreeSupportEfl::pendingUnloadEventCount(frame);
280         if (pendingFrameUnloadEvents)
281             printf("%s - has %u onunload handler(s)\n", frameName.utf8().data(), pendingFrameUnloadEvents);
282     }
283 }
284 #endif
285