2 * Copyright (C) 2011 ProFUSION Embedded Systems
3 * Copyright (C) 2011 Samsung Electronics
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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.
28 #include "DumpRenderTreeChrome.h"
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
46 #include <wtf/NotFound.h>
48 PassOwnPtr<DumpRenderTreeChrome> DumpRenderTreeChrome::create(Evas* evas)
50 OwnPtr<DumpRenderTreeChrome> chrome = adoptPtr(new DumpRenderTreeChrome(evas));
52 if (!chrome->initialize())
55 return chrome.release();
58 DumpRenderTreeChrome::DumpRenderTreeChrome(Evas* evas)
62 , m_gcController(adoptPtr(new GCController))
66 DumpRenderTreeChrome::~DumpRenderTreeChrome()
70 Evas_Object* DumpRenderTreeChrome::createNewWindow()
72 Evas_Object* newView = createView();
74 ewk_view_setting_scripts_can_open_windows_set(newView, EINA_TRUE);
75 ewk_view_setting_scripts_can_close_windows_set(newView, EINA_TRUE);
77 m_extraViews.append(newView);
82 Evas_Object* DumpRenderTreeChrome::createView() const
84 Evas_Object* view = drtViewAdd(m_evas);
88 ewk_view_theme_set(view, DATA_DIR"/default.edj");
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);
100 void DumpRenderTreeChrome::removeWindow(Evas_Object* view)
102 const size_t pos = m_extraViews.find(view);
107 m_extraViews.remove(pos);
108 evas_object_del(view);
111 bool DumpRenderTreeChrome::initialize()
113 DumpRenderTreeSupportEfl::setMockScrollbarsEnabled(true);
115 m_mainView = createView();
119 ewk_view_theme_set(m_mainView, DATA_DIR"/default.edj");
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);
128 m_mainFrame = ewk_view_frame_main_get(m_mainView);
133 Vector<Evas_Object*> DumpRenderTreeChrome::extraViews() const
138 Evas_Object* DumpRenderTreeChrome::mainFrame() const
143 Evas_Object* DumpRenderTreeChrome::mainView() const
148 void DumpRenderTreeChrome::resetDefaultsToConsistentValues()
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();
155 ewk_settings_icon_database_clear();
156 ewk_settings_icon_database_path_set(0);
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);
179 ewk_view_zoom_set(mainView(), 1.0, 0, 0);
180 ewk_view_scale_set(mainView(), 1.0, 0, 0);
182 ewk_history_clear(ewk_view_history_get(mainView()));
185 ewk_cookies_policy_set(EWK_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY);
187 DumpRenderTreeSupportEfl::clearFrameName(mainFrame());
188 DumpRenderTreeSupportEfl::clearOpener(mainFrame());
194 void DumpRenderTreeChrome::onWindowObjectCleared(void* userData, Evas_Object*, void* eventInfo)
196 Ewk_Window_Object_Cleared_Event* objectClearedInfo = static_cast<Ewk_Window_Object_Cleared_Event*>(eventInfo);
197 JSValueRef exception = 0;
198 ASSERT(gLayoutTestController);
200 GCController* gcController = static_cast<GCController*>(userData);
201 ASSERT(gcController);
203 gLayoutTestController->makeWindowObject(objectClearedInfo->context, objectClearedInfo->windowObject, &exception);
206 gcController->makeWindowObject(objectClearedInfo->context, objectClearedInfo->windowObject, &exception);
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);
216 void DumpRenderTreeChrome::onLoadStarted(void*, Evas_Object* view, void*)
218 // FIXME: we actually need the frame related to this event
219 Evas_Object* frame = ewk_view_frame_main_get(view);
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;
227 Eina_Bool DumpRenderTreeChrome::processWork(void* data)
229 Evas_Object* frame = static_cast<Evas_Object*>(data);
231 if (WorkQueue::shared()->processWork() && !gLayoutTestController->waitToDump())
234 return ECORE_CALLBACK_CANCEL;
237 void DumpRenderTreeChrome::onLoadFinished(void*, Evas_Object* view, void*)
239 // FIXME: we actually need the frame related to this event
240 Evas_Object* frame = ewk_view_frame_main_get(view);
242 if (topLoadingFrame != frame)
247 WorkQueue::shared()->setFrozen(true);
248 if (gLayoutTestController->waitToDump())
251 if (WorkQueue::shared()->count())
252 ecore_idler_add(processWork, frame);
257 void DumpRenderTreeChrome::onStatusbarTextSet(void*, Evas_Object*, void* eventInfo)
259 if (!gLayoutTestController->dumpStatusCallbacks())
262 const char* statusbarText = static_cast<const char*>(eventInfo);
263 printf("UI DELEGATE STATUS CALLBACK: setStatusText:%s\n", statusbarText);
266 void DumpRenderTreeChrome::onTitleChanged(void*, Evas_Object*, void*)
271 void DumpRenderTreeChrome::onDocumentLoadFinished(void*, Evas_Object*, void* eventInfo)
273 const Evas_Object* frame = static_cast<Evas_Object*>(eventInfo);
274 const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
276 if (!done && gLayoutTestController->dumpFrameLoadCallbacks())
277 printf("%s - didFinishDocumentLoadForFrame\n", frameName.utf8().data());
279 const unsigned pendingFrameUnloadEvents = DumpRenderTreeSupportEfl::pendingUnloadEventCount(frame);
280 if (pendingFrameUnloadEvents)
281 printf("%s - has %u onunload handler(s)\n", frameName.utf8().data(), pendingFrameUnloadEvents);