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 #include "DumpRenderTree.h"
31 #include "DumpRenderTreeView.h"
32 #include "EventSender.h"
33 #include "GCController.h"
34 #include "LayoutTestController.h"
35 #include "NotImplemented.h"
36 #include "WebCoreSupport/DumpRenderTreeSupportEfl.h"
37 #include "WebCoreTestSupport.h"
38 #include "WorkQueue.h"
39 #include "ewk_private.h" // FIXME: create some WebCoreSupport/DumpRenderTree.cpp instead
46 #include <wtf/NotFound.h>
48 using namespace WebCore;
50 HashMap<unsigned long, CString> DumpRenderTreeChrome::m_dumpAssignedUrls;
52 PassOwnPtr<DumpRenderTreeChrome> DumpRenderTreeChrome::create(Evas* evas)
54 OwnPtr<DumpRenderTreeChrome> chrome = adoptPtr(new DumpRenderTreeChrome(evas));
56 if (!chrome->initialize())
59 return chrome.release();
62 DumpRenderTreeChrome::DumpRenderTreeChrome(Evas* evas)
66 , m_gcController(adoptPtr(new GCController))
70 DumpRenderTreeChrome::~DumpRenderTreeChrome()
74 Evas_Object* DumpRenderTreeChrome::createNewWindow()
76 Evas_Object* newView = createView();
78 ewk_view_setting_scripts_can_open_windows_set(newView, EINA_TRUE);
79 ewk_view_setting_scripts_can_close_windows_set(newView, EINA_TRUE);
81 m_extraViews.append(newView);
86 Evas_Object* DumpRenderTreeChrome::createView() const
88 Evas_Object* view = drtViewAdd(m_evas);
92 ewk_view_theme_set(view, DATA_DIR"/default.edj");
94 evas_object_smart_callback_add(view, "load,resource,failed", onResourceLoadFailed, 0);
95 evas_object_smart_callback_add(view, "load,resource,finished", onResourceLoadFinished, 0);
96 evas_object_smart_callback_add(view, "load,started", onLoadStarted, 0);
97 evas_object_smart_callback_add(view, "title,changed", onTitleChanged, 0);
98 evas_object_smart_callback_add(view, "window,object,cleared", onWindowObjectCleared, m_gcController.get());
99 evas_object_smart_callback_add(view, "statusbar,text,set", onStatusbarTextSet, 0);
100 evas_object_smart_callback_add(view, "load,document,finished", onDocumentLoadFinished, 0);
101 evas_object_smart_callback_add(view, "resource,request,new", onNewResourceRequest, 0);
102 evas_object_smart_callback_add(view, "resource,request,willsend", onWillSendRequest, 0);
103 evas_object_smart_callback_add(view, "resource,response,received", onResponseReceived, 0);
104 evas_object_smart_callback_add(view, "onload,event", onWebViewOnloadEvent, 0);
105 evas_object_smart_callback_add(view, "mixedcontent,run", onInsecureContentRun, 0);
106 evas_object_smart_callback_add(view, "mixedcontent,displayed", onInsecureContentDisplayed, 0);
107 evas_object_smart_callback_add(view, "frame,created", onFrameCreated, 0);
109 Evas_Object* mainFrame = ewk_view_frame_main_get(view);
110 evas_object_smart_callback_add(mainFrame, "load,provisional", onFrameProvisionalLoad, 0);
111 evas_object_smart_callback_add(mainFrame, "load,committed", onFrameLoadCommitted, 0);
112 evas_object_smart_callback_add(mainFrame, "load,finished", onFrameLoadFinished, 0);
113 evas_object_smart_callback_add(mainFrame, "load,error", onFrameLoadError, 0);
114 evas_object_smart_callback_add(mainFrame, "redirect,cancelled", onFrameRedirectCancelled, 0);
115 evas_object_smart_callback_add(mainFrame, "redirect,load,provisional", onFrameRedirectForProvisionalLoad, 0);
116 evas_object_smart_callback_add(mainFrame, "redirect,requested", onFrameRedirectRequested, 0);
117 evas_object_smart_callback_add(mainFrame, "xss,detected", onDidDetectXSS, 0);
122 void DumpRenderTreeChrome::removeWindow(Evas_Object* view)
124 const size_t pos = m_extraViews.find(view);
129 m_extraViews.remove(pos);
130 evas_object_del(view);
133 bool DumpRenderTreeChrome::initialize()
135 DumpRenderTreeSupportEfl::setMockScrollbarsEnabled(true);
137 m_mainView = createView();
141 ewk_view_theme_set(m_mainView, DATA_DIR"/default.edj");
143 evas_object_name_set(m_mainView, "m_mainView");
144 evas_object_move(m_mainView, 0, 0);
145 evas_object_resize(m_mainView, 800, 600);
146 evas_object_layer_set(m_mainView, EVAS_LAYER_MAX);
147 evas_object_show(m_mainView);
148 evas_object_focus_set(m_mainView, EINA_TRUE);
150 m_mainFrame = ewk_view_frame_main_get(m_mainView);
152 char* drtTemp = getenv("DUMPRENDERTREE_TEMP");
155 eina_str_join(path, sizeof(path), '/', drtTemp, "LocalStorage");
156 ewk_settings_local_storage_path_set(path);
157 eina_str_join(path, sizeof(path), '/', drtTemp, "Databases");
158 ewk_settings_web_database_path_set(path);
164 Vector<Evas_Object*> DumpRenderTreeChrome::extraViews() const
169 void DumpRenderTreeChrome::clearExtraViews()
171 Vector<Evas_Object*>::iterator it = m_extraViews.begin();
172 for (; it != m_extraViews.end(); ++it)
173 evas_object_del(*it);
174 m_extraViews.clear();
177 Evas_Object* DumpRenderTreeChrome::mainFrame() const
182 Evas_Object* DumpRenderTreeChrome::mainView() const
187 static inline const char* defaultEditingBehavior()
202 void DumpRenderTreeChrome::resetDefaultsToConsistentValues()
204 ewk_settings_icon_database_clear();
205 ewk_settings_icon_database_path_set(0);
207 ewk_settings_web_database_clear();
208 ewk_settings_web_database_default_quota_set(5 * 1024 * 1024);
210 ewk_settings_memory_cache_clear();
212 ewk_view_setting_private_browsing_set(mainView(), EINA_FALSE);
213 ewk_view_setting_spatial_navigation_set(mainView(), EINA_FALSE);
214 ewk_view_setting_enable_frame_flattening_set(mainView(), EINA_FALSE);
215 ewk_view_setting_application_cache_set(mainView(), EINA_TRUE);
216 ewk_view_setting_enable_scripts_set(mainView(), EINA_TRUE);
217 ewk_view_font_family_name_set(mainView(), EWK_FONT_FAMILY_STANDARD, "Times");
218 ewk_view_font_family_name_set(mainView(), EWK_FONT_FAMILY_MONOSPACE, "Courier");
219 ewk_view_font_family_name_set(mainView(), EWK_FONT_FAMILY_SERIF, "Times");
220 ewk_view_font_family_name_set(mainView(), EWK_FONT_FAMILY_SANS_SERIF, "Helvetica");
221 ewk_view_font_family_name_set(mainView(), EWK_FONT_FAMILY_CURSIVE, "cursive");
222 ewk_view_font_family_name_set(mainView(), EWK_FONT_FAMILY_FANTASY, "fantasy");
223 ewk_view_setting_font_default_size_set(mainView(), 16);
224 ewk_view_setting_font_monospace_size_set(mainView(), 13);
225 ewk_view_setting_font_minimum_size_set(mainView(), 0);
226 ewk_view_setting_caret_browsing_set(mainView(), EINA_FALSE);
227 ewk_view_setting_page_cache_set(mainView(), EINA_FALSE);
228 ewk_view_setting_enable_auto_resize_window_set(mainView(), EINA_TRUE);
229 ewk_view_setting_enable_plugins_set(mainView(), EINA_TRUE);
230 ewk_view_setting_scripts_can_open_windows_set(mainView(), EINA_TRUE);
231 ewk_view_setting_scripts_can_close_windows_set(mainView(), EINA_TRUE);
232 ewk_view_setting_auto_load_images_set(mainView(), EINA_TRUE);
233 ewk_view_setting_user_stylesheet_set(mainView(), 0);
234 ewk_view_setting_enable_xss_auditor_set(browser->mainView(), EINA_TRUE);
235 ewk_view_setting_enable_developer_extras_set(browser->mainView(), EINA_FALSE);
236 ewk_view_setting_minimum_timer_interval_set(browser->mainView(), 0.010); // 10 milliseconds (DOMTimer::s_minDefaultTimerInterval)
237 ewk_view_setting_enable_webgl_set(mainView(), EINA_TRUE);
238 ewk_view_setting_enable_hyperlink_auditing_set(mainView(), EINA_FALSE);
239 ewk_view_setting_include_links_in_focus_chain_set(mainView(), EINA_TRUE);
241 ewk_view_zoom_set(mainView(), 1.0, 0, 0);
242 ewk_view_scale_set(mainView(), 1.0, 0, 0);
243 ewk_view_text_zoom_set(mainView(), 1.0);
244 ewk_view_visibility_state_set(mainView(), EWK_PAGE_VISIBILITY_STATE_VISIBLE, true);
246 ewk_history_clear(ewk_view_history_get(mainView()));
249 ewk_cookies_policy_set(EWK_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY);
251 ewk_security_policy_whitelist_origin_reset();
253 DumpRenderTreeSupportEfl::clearFrameName(mainFrame());
254 DumpRenderTreeSupportEfl::clearOpener(mainFrame());
255 DumpRenderTreeSupportEfl::setInteractiveFormValidationEnabled(mainView(), true);
256 DumpRenderTreeSupportEfl::setAuthorAndUserStylesEnabled(mainView(), true);
257 DumpRenderTreeSupportEfl::setSmartInsertDeleteEnabled(mainView(), false);
258 DumpRenderTreeSupportEfl::setSelectTrailingWhitespaceEnabled(mainView(), false);
259 DumpRenderTreeSupportEfl::setDefersLoading(mainView(), false);
260 DumpRenderTreeSupportEfl::setEditingBehavior(mainView(), defaultEditingBehavior());
261 DumpRenderTreeSupportEfl::setJavaScriptProfilingEnabled(mainView(), false);
262 DumpRenderTreeSupportEfl::setLoadsSiteIconsIgnoringImageLoadingSetting(mainView(), false);
265 static CString pathSuitableForTestResult(const char* uriString)
270 KURL uri = KURL(ParsedURLString, uriString);
272 if (!uri.isLocalFile())
273 return uri.string().utf8();
275 String pathString = uri.path();
276 size_t indexBaseName = pathString.reverseFind('/');
278 if (indexBaseName == notFound)
279 baseName = pathString;
281 baseName = pathString.substring(indexBaseName + 1);
284 if (indexBaseName != notFound) {
285 size_t indexDirName = pathString.reverseFind('/', indexBaseName - 1);
286 if (indexDirName != notFound)
287 dirName = pathString.substring(indexDirName + 1, indexBaseName - indexDirName - 1);
290 String ret = dirName + "/" + baseName;
294 static CString urlSuitableForTestResult(const char* uriString)
296 KURL uri = KURL(ParsedURLString, uriString);
297 if (!uri.isLocalFile())
298 return CString(uriString);
300 unsigned startIndex = uri.pathAfterLastSlash();
301 return uri.string().substring(startIndex).utf8();
304 static CString descriptionSuitableForTestResult(Ewk_Frame_Resource_Request* request)
306 String ret = "<NSURLRequest URL ";
307 ret += pathSuitableForTestResult(request->url).data();
308 ret += ", main document URL ";
309 ret += urlSuitableForTestResult(request->first_party).data();
310 ret += ", http method ";
311 ret += request->http_method ? String(request->http_method) : "(none)";
317 static CString descriptionSuitableForTestResult(const Ewk_Frame_Resource_Response* response)
320 return CString("(null)");
322 String ret = "<NSURLResponse ";
323 ret += pathSuitableForTestResult(response->url).data();
324 ret += ", http status code ";
325 ret += String::number(response->status_code);
331 static CString descriptionSuitableForTestResult(Ewk_Frame_Load_Error* error)
333 String ret = "<NSError domain ";
334 ret += error->domain;
336 ret += String::number(error->code);
337 if (error->failing_url && *error->failing_url != '\0') {
338 ret += ", failing URL \"";
339 ret += error->failing_url;
350 void DumpRenderTreeChrome::onWindowObjectCleared(void* userData, Evas_Object*, void* eventInfo)
352 Ewk_Window_Object_Cleared_Event* objectClearedInfo = static_cast<Ewk_Window_Object_Cleared_Event*>(eventInfo);
353 JSValueRef exception = 0;
354 ASSERT(gLayoutTestController);
356 GCController* gcController = static_cast<GCController*>(userData);
357 ASSERT(gcController);
359 gLayoutTestController->makeWindowObject(objectClearedInfo->context, objectClearedInfo->windowObject, &exception);
362 gcController->makeWindowObject(objectClearedInfo->context, objectClearedInfo->windowObject, &exception);
365 JSRetainPtr<JSStringRef> controllerName(JSStringCreateWithUTF8CString("eventSender"));
366 JSObjectSetProperty(objectClearedInfo->context, objectClearedInfo->windowObject,
367 controllerName.get(),
368 makeEventSender(objectClearedInfo->context, !DumpRenderTreeSupportEfl::frameParent(objectClearedInfo->frame)),
369 kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, 0);
371 WebCoreTestSupport::injectInternalsObject(objectClearedInfo->context);
374 void DumpRenderTreeChrome::onLoadStarted(void*, Evas_Object* view, void* eventInfo)
376 Evas_Object* frame = static_cast<Evas_Object*>(eventInfo);
378 // Make sure we only set this once per test. If it gets cleared, and then set again, we might
379 // end up doing two dumps for one test.
380 if (!topLoadingFrame && !done)
381 topLoadingFrame = frame;
384 Eina_Bool DumpRenderTreeChrome::processWork(void*)
386 if (WorkQueue::shared()->processWork() && !gLayoutTestController->waitToDump())
389 return ECORE_CALLBACK_CANCEL;
392 void DumpRenderTreeChrome::topLoadingFrameLoadFinished()
396 WorkQueue::shared()->setFrozen(true);
397 if (gLayoutTestController->waitToDump())
400 if (WorkQueue::shared()->count())
401 ecore_idler_add(processWork, 0 /*frame*/);
406 void DumpRenderTreeChrome::onStatusbarTextSet(void*, Evas_Object*, void* eventInfo)
408 if (!gLayoutTestController->dumpStatusCallbacks())
411 const char* statusbarText = static_cast<const char*>(eventInfo);
412 printf("UI DELEGATE STATUS CALLBACK: setStatusText:%s\n", statusbarText);
415 void DumpRenderTreeChrome::onTitleChanged(void*, Evas_Object*, void* eventInfo)
417 if (!gLayoutTestController->dumpTitleChanges())
420 const char* titleText = static_cast<const char*>(eventInfo);
421 printf("TITLE CHANGED: %s\n", titleText);
424 void DumpRenderTreeChrome::onDocumentLoadFinished(void*, Evas_Object*, void* eventInfo)
426 const Evas_Object* frame = static_cast<Evas_Object*>(eventInfo);
427 const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
429 if (!done && gLayoutTestController->dumpFrameLoadCallbacks())
430 printf("%s - didFinishDocumentLoadForFrame\n", frameName.utf8().data());
432 const unsigned pendingFrameUnloadEvents = DumpRenderTreeSupportEfl::pendingUnloadEventCount(frame);
433 if (pendingFrameUnloadEvents)
434 printf("%s - has %u onunload handler(s)\n", frameName.utf8().data(), pendingFrameUnloadEvents);
438 void DumpRenderTreeChrome::onWillSendRequest(void*, Evas_Object*, void* eventInfo)
440 Ewk_Frame_Resource_Messages* messages = static_cast<Ewk_Frame_Resource_Messages*>(eventInfo);
442 if (!done && gLayoutTestController->dumpResourceLoadCallbacks())
443 printf("%s - willSendRequest %s redirectResponse %s\n",
444 m_dumpAssignedUrls.contains(messages->request->identifier) ? m_dumpAssignedUrls.get(messages->request->identifier).data() : "<unknown>",
445 descriptionSuitableForTestResult(messages->request).data(),
446 descriptionSuitableForTestResult(messages->redirect_response).data());
448 if (!done && gLayoutTestController->willSendRequestReturnsNull()) {
449 // As requested by the LayoutTestController, don't perform the request.
450 messages->request->url = 0;
454 if (!done && gLayoutTestController->willSendRequestReturnsNullOnRedirect() && messages->redirect_response) {
455 printf("Returning null for this redirect\n");
456 messages->request->url = 0;
460 KURL url = KURL(ParsedURLString, messages->request->url);
463 && url.protocolIsInHTTPFamily()
464 && url.host() != "127.0.0.1"
465 && url.host() != "255.255.255.255"
466 && url.host().lower() != "localhost") {
467 printf("Blocked access to external URL %s\n", messages->request->url);
468 messages->request->url = 0;
472 const std::string& destination = gLayoutTestController->redirectionDestinationForURL(url.string().utf8().data());
473 if (destination.length())
474 messages->request->url = strdup(destination.c_str());
477 void DumpRenderTreeChrome::onWebViewOnloadEvent(void*, Evas_Object*, void* eventInfo)
479 const Evas_Object* frame = static_cast<Evas_Object*>(eventInfo);
481 if (!done && gLayoutTestController->dumpFrameLoadCallbacks()) {
482 const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
483 printf("%s - didHandleOnloadEventsForFrame\n", frameName.utf8().data());
487 void DumpRenderTreeChrome::onInsecureContentRun(void*, Evas_Object*, void*)
489 if (!done && gLayoutTestController->dumpFrameLoadCallbacks())
490 printf("didRunInsecureContent\n");
493 void DumpRenderTreeChrome::onInsecureContentDisplayed(void*, Evas_Object*, void*)
495 if (!done && gLayoutTestController->dumpFrameLoadCallbacks())
496 printf("didDisplayInsecureContent\n");
499 void DumpRenderTreeChrome::onFrameCreated(void*, Evas_Object*, void* eventInfo)
501 Evas_Object* frame = static_cast<Evas_Object*>(eventInfo);
503 evas_object_smart_callback_add(frame, "load,provisional", onFrameProvisionalLoad, 0);
504 evas_object_smart_callback_add(frame, "load,committed", onFrameLoadCommitted, 0);
505 evas_object_smart_callback_add(frame, "load,finished", onFrameLoadFinished, 0);
506 evas_object_smart_callback_add(frame, "load,error", onFrameLoadError, 0);
507 evas_object_smart_callback_add(frame, "redirect,cancelled", onFrameRedirectCancelled, 0);
508 evas_object_smart_callback_add(frame, "redirect,load,provisional", onFrameRedirectForProvisionalLoad, 0);
509 evas_object_smart_callback_add(frame, "redirect,requested", onFrameRedirectRequested, 0);
510 evas_object_smart_callback_add(frame, "xss,detected", onDidDetectXSS, 0);
513 void DumpRenderTreeChrome::onFrameProvisionalLoad(void*, Evas_Object* frame, void*)
515 if (!done && gLayoutTestController->dumpFrameLoadCallbacks()) {
516 const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
517 printf("%s - didStartProvisionalLoadForFrame\n", frameName.utf8().data());
521 void DumpRenderTreeChrome::onFrameLoadCommitted(void*, Evas_Object* frame, void*)
523 if (!done && gLayoutTestController->dumpFrameLoadCallbacks()) {
524 const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
525 printf("%s - didCommitLoadForFrame\n", frameName.utf8().data());
529 void DumpRenderTreeChrome::onFrameLoadFinished(void*, Evas_Object* frame, void* eventInfo)
531 const Ewk_Frame_Load_Error* error = static_cast<Ewk_Frame_Load_Error*>(eventInfo);
533 // EFL port emits both "load,finished" and "load,error" signals in error case.
534 // Error case is therefore already handled in onFrameLoadError() and we don't need
535 // to handle it here.
539 if (!done && gLayoutTestController->dumpFrameLoadCallbacks()) {
540 const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
541 printf("%s - didFinishLoadForFrame\n", frameName.utf8().data());
544 if (frame == topLoadingFrame)
545 topLoadingFrameLoadFinished();
548 void DumpRenderTreeChrome::onFrameLoadError(void*, Evas_Object* frame, void*)
550 if (!done && gLayoutTestController->dumpFrameLoadCallbacks()) {
551 const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
552 printf("%s - didFailLoadWithError\n", frameName.utf8().data());
555 if (frame == topLoadingFrame)
556 topLoadingFrameLoadFinished();
559 void DumpRenderTreeChrome::onFrameRedirectCancelled(void*, Evas_Object* frame, void*)
561 if (!done && gLayoutTestController->dumpFrameLoadCallbacks()) {
562 const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
563 printf("%s - didCancelClientRedirectForFrame\n", frameName.utf8().data());
567 void DumpRenderTreeChrome::onFrameRedirectForProvisionalLoad(void*, Evas_Object* frame, void*)
569 if (!done && gLayoutTestController->dumpFrameLoadCallbacks()) {
570 const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
571 printf("%s - didReceiveServerRedirectForProvisionalLoadForFrame\n", frameName.utf8().data());
575 void DumpRenderTreeChrome::onFrameRedirectRequested(void*, Evas_Object* frame, void* eventInfo)
577 const char* url = static_cast<const char*>(eventInfo);
579 if (!done && gLayoutTestController->dumpFrameLoadCallbacks()) {
580 const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
581 printf("%s - willPerformClientRedirectToURL: %s \n", frameName.utf8().data(), pathSuitableForTestResult(url).data());
585 void DumpRenderTreeChrome::onDidDetectXSS(void*, Evas_Object* view, void*)
587 if (!done && gLayoutTestController->dumpFrameLoadCallbacks())
588 printf("didDetectXSS\n");
591 void DumpRenderTreeChrome::onResponseReceived(void*, Evas_Object*, void* eventInfo)
593 Ewk_Frame_Resource_Response* response = static_cast<Ewk_Frame_Resource_Response*>(eventInfo);
595 if (!done && gLayoutTestController->dumpResourceLoadCallbacks()) {
596 CString responseDescription(descriptionSuitableForTestResult(response));
597 printf("%s - didReceiveResponse %s\n",
598 m_dumpAssignedUrls.contains(response->identifier) ? m_dumpAssignedUrls.get(response->identifier).data() : "<unknown>",
599 responseDescription.data());
602 if (!done && gLayoutTestController->dumpResourceResponseMIMETypes()) {
603 printf("%s has MIME type %s\n",
604 KURL(ParsedURLString, response->url).lastPathComponent().utf8().data(),
605 response->mime_type);
609 void DumpRenderTreeChrome::onResourceLoadFinished(void*, Evas_Object*, void* eventInfo)
611 unsigned long identifier = *static_cast<unsigned long*>(eventInfo);
613 if (!done && gLayoutTestController->dumpResourceLoadCallbacks())
614 printf("%s - didFinishLoading\n",
615 (m_dumpAssignedUrls.contains(identifier) ? m_dumpAssignedUrls.take(identifier).data() : "<unknown>"));
618 void DumpRenderTreeChrome::onResourceLoadFailed(void*, Evas_Object*, void* eventInfo)
620 Ewk_Frame_Load_Error* error = static_cast<Ewk_Frame_Load_Error*>(eventInfo);
622 if (!done && gLayoutTestController->dumpResourceLoadCallbacks())
623 printf("%s - didFailLoadingWithError: %s\n",
624 (m_dumpAssignedUrls.contains(error->resource_identifier) ? m_dumpAssignedUrls.take(error->resource_identifier).data() : "<unknown>"),
625 descriptionSuitableForTestResult(error).data());
628 void DumpRenderTreeChrome::onNewResourceRequest(void*, Evas_Object*, void* eventInfo)
630 Ewk_Frame_Resource_Request* request = static_cast<Ewk_Frame_Resource_Request*>(eventInfo);
632 if (!done && gLayoutTestController->dumpResourceLoadCallbacks())
633 m_dumpAssignedUrls.add(request->identifier, pathSuitableForTestResult(request->url));