123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874 |
- /*
- * Copyright (C) 2011 ProFUSION Embedded Systems
- * Copyright (C) 2011 Samsung Electronics
- * Copyright (C) 2012 Intel Corporation
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND ITS CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
- * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDERS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- #include "config.h"
- #include "DumpRenderTreeChrome.h"
- #include "DumpRenderTree.h"
- #include "DumpRenderTreeView.h"
- #include "EditingCallbacks.h"
- #include "EventSender.h"
- #include "GCController.h"
- #include "KURL.h"
- #include "NotImplemented.h"
- #include "TestRunner.h"
- #include "TextInputController.h"
- #include "WebCoreSupport/DumpRenderTreeSupportEfl.h"
- #include "WebCoreTestSupport.h"
- #include "WorkQueue.h"
- #include "ewk_private.h" // FIXME: create some WebCoreSupport/DumpRenderTree.cpp instead
- #include <EWebKit.h>
- #include <Ecore.h>
- #include <Eina.h>
- #include <Evas.h>
- #include <cstdio>
- #include <wtf/NotFound.h>
- #include <wtf/text/StringBuilder.h>
- #if HAVE(ACCESSIBILITY)
- #include "AccessibilityController.h"
- #endif
- using namespace WebCore;
- HashMap<unsigned long, CString> DumpRenderTreeChrome::m_dumpAssignedUrls;
- Evas_Object* DumpRenderTreeChrome::m_provisionalLoadFailedFrame = 0;
- PassOwnPtr<DumpRenderTreeChrome> DumpRenderTreeChrome::create(Evas* evas)
- {
- OwnPtr<DumpRenderTreeChrome> chrome = adoptPtr(new DumpRenderTreeChrome(evas));
- if (!chrome->initialize())
- return nullptr;
- return chrome.release();
- }
- DumpRenderTreeChrome::DumpRenderTreeChrome(Evas* evas)
- : m_mainView(0)
- , m_mainFrame(0)
- , m_evas(evas)
- , m_gcController(adoptPtr(new GCController))
- #if HAVE(ACCESSIBILITY)
- , m_axController(adoptPtr(new AccessibilityController))
- #endif
- {
- }
- DumpRenderTreeChrome::~DumpRenderTreeChrome()
- {
- }
- Evas_Object* DumpRenderTreeChrome::createNewWindow()
- {
- Evas_Object* newView = createView();
- ewk_view_setting_scripts_can_open_windows_set(newView, EINA_TRUE);
- ewk_view_setting_scripts_can_close_windows_set(newView, EINA_TRUE);
- m_extraViews.append(newView);
- return newView;
- }
- Evas_Object* DumpRenderTreeChrome::createView() const
- {
- Evas_Object* view = drtViewAdd(m_evas);
- if (!view)
- return 0;
- ewk_view_theme_set(view, TEST_THEME_DIR "/default.edj");
- evas_object_smart_callback_add(view, "download,request", onDownloadRequest, 0);
- evas_object_smart_callback_add(view, "load,resource,failed", onResourceLoadFailed, 0);
- evas_object_smart_callback_add(view, "load,resource,finished", onResourceLoadFinished, 0);
- evas_object_smart_callback_add(view, "load,started", onLoadStarted, 0);
- evas_object_smart_callback_add(view, "window,object,cleared", onWindowObjectCleared, m_gcController.get());
- evas_object_smart_callback_add(view, "statusbar,text,set", onStatusbarTextSet, 0);
- evas_object_smart_callback_add(view, "load,document,finished", onDocumentLoadFinished, 0);
- evas_object_smart_callback_add(view, "resource,request,new", onNewResourceRequest, 0);
- evas_object_smart_callback_add(view, "resource,request,willsend", onWillSendRequest, 0);
- evas_object_smart_callback_add(view, "resource,response,received", onResponseReceived, 0);
- evas_object_smart_callback_add(view, "onload,event", onWebViewOnloadEvent, 0);
- evas_object_smart_callback_add(view, "mixedcontent,run", onInsecureContentRun, 0);
- evas_object_smart_callback_add(view, "mixedcontent,displayed", onInsecureContentDisplayed, 0);
- evas_object_smart_callback_add(view, "frame,created", onFrameCreated, 0);
- evas_object_smart_callback_add(view, "navigate,with,data", onWebViewNavigatedWithData, 0);
- evas_object_smart_callback_add(view, "perform,server,redirect", onWebViewServerRedirect, 0);
- evas_object_smart_callback_add(view, "perform,client,redirect", onWebViewClientRedirect, 0);
- evas_object_smart_callback_add(view, "populate,visited,links", onWebViewPopulateVisitedLinks, 0);
- evas_object_smart_callback_add(view, "inspector,view,create", onInspectorViewCreate, 0);
- evas_object_smart_callback_add(view, "inspector,view,close", onInspectorViewClose, 0);
- connectEditingCallbacks(view);
- Evas_Object* mainFrame = ewk_view_frame_main_get(view);
- evas_object_smart_callback_add(mainFrame, "icon,changed", onFrameIconChanged, 0);
- evas_object_smart_callback_add(mainFrame, "load,provisional", onFrameProvisionalLoad, 0);
- evas_object_smart_callback_add(mainFrame, "load,provisional,failed", onFrameProvisionalLoadFailed, 0);
- evas_object_smart_callback_add(mainFrame, "load,committed", onFrameLoadCommitted, 0);
- evas_object_smart_callback_add(mainFrame, "load,finished", onFrameLoadFinished, 0);
- evas_object_smart_callback_add(mainFrame, "load,error", onFrameLoadError, 0);
- evas_object_smart_callback_add(mainFrame, "redirect,cancelled", onFrameRedirectCancelled, 0);
- evas_object_smart_callback_add(mainFrame, "redirect,load,provisional", onFrameRedirectForProvisionalLoad, 0);
- evas_object_smart_callback_add(mainFrame, "redirect,requested", onFrameRedirectRequested, 0);
- evas_object_smart_callback_add(mainFrame, "title,changed", onFrameTitleChanged, 0);
- evas_object_smart_callback_add(mainFrame, "xss,detected", onDidDetectXSS, 0);
- return view;
- }
- Evas_Object* DumpRenderTreeChrome::createInspectorView()
- {
- Evas_Object* inspectorView = drtViewAdd(m_evas);
- if (!inspectorView)
- return 0;
- // Inspector-related views are not expected to have their output logged.
- const bool ignoreMessages = true;
- evas_object_data_set(inspectorView, "ignore-console-messages", &ignoreMessages);
- ewk_view_theme_set(inspectorView, TEST_THEME_DIR "/default.edj");
- Evas_Object* mainFrame = ewk_view_frame_main_get(inspectorView);
- evas_object_smart_callback_add(mainFrame, "load,finished", onInspectorFrameLoadFinished, 0);
- evas_object_resize(inspectorView, TestRunner::viewWidth, TestRunner::viewHeight);
- evas_object_show(inspectorView);
- evas_object_focus_set(inspectorView, true);
- return inspectorView;
- }
- void DumpRenderTreeChrome::removeInspectorView()
- {
- Evas_Object* inspectorView = ewk_view_inspector_view_get(mainView());
- if (!inspectorView)
- return;
- Evas_Object* mainFrame = ewk_view_frame_main_get(inspectorView);
- evas_object_smart_callback_del(mainFrame, "load,finished", onInspectorFrameLoadFinished);
- evas_object_del(inspectorView);
- ewk_view_inspector_view_set(mainView(), 0);
- }
- void DumpRenderTreeChrome::waitInspectorLoadFinished()
- {
- // Waits until the page has finished loading.
- // Because it can't complete loading inspector.html before loading testURL.
- Evas_Object* inspectorView = ewk_view_inspector_view_get(mainView());
- if (inspectorView)
- ecore_main_loop_begin();
- }
- void DumpRenderTreeChrome::removeWindow(Evas_Object* view)
- {
- const size_t pos = m_extraViews.find(view);
- if (pos == notFound)
- return;
- m_extraViews.remove(pos);
- evas_object_del(view);
- }
- bool DumpRenderTreeChrome::initialize()
- {
- // Notifies that DRT is running for ewkView to create testable objects.
- DumpRenderTreeSupportEfl::setDumpRenderTreeModeEnabled(true);
- DumpRenderTreeSupportEfl::setMockScrollbarsEnabled(true);
- m_mainView = createView();
- if (!m_mainView)
- return false;
- ewk_view_theme_set(m_mainView, TEST_THEME_DIR "/default.edj");
- evas_object_name_set(m_mainView, "m_mainView");
- evas_object_move(m_mainView, 0, 0);
- evas_object_resize(m_mainView, TestRunner::viewWidth, TestRunner::viewHeight);
- evas_object_layer_set(m_mainView, EVAS_LAYER_MAX);
- evas_object_show(m_mainView);
- evas_object_focus_set(m_mainView, EINA_TRUE);
- m_mainFrame = ewk_view_frame_main_get(m_mainView);
- return true;
- }
- const Vector<Evas_Object*>& DumpRenderTreeChrome::extraViews() const
- {
- return m_extraViews;
- }
- void DumpRenderTreeChrome::clearExtraViews()
- {
- Vector<Evas_Object*>::iterator it = m_extraViews.begin();
- for (; it != m_extraViews.end(); ++it)
- evas_object_del(*it);
- m_extraViews.clear();
- }
- Evas_Object* DumpRenderTreeChrome::mainFrame() const
- {
- return m_mainFrame;
- }
- Evas_Object* DumpRenderTreeChrome::mainView() const
- {
- return m_mainView;
- }
- void DumpRenderTreeChrome::resetDefaultsToConsistentValues()
- {
- ewk_settings_icon_database_clear();
- ewk_settings_icon_database_path_set(0);
- ewk_web_database_remove_all();
- ewk_settings_web_database_default_quota_set(5 * 1024 * 1024);
- ewk_settings_memory_cache_clear();
- ewk_settings_application_cache_clear();
- ewk_settings_shadow_dom_enable_set(EINA_TRUE);
- ewk_view_setting_private_browsing_set(mainView(), EINA_FALSE);
- ewk_view_setting_spatial_navigation_set(mainView(), EINA_FALSE);
- ewk_view_setting_enable_frame_flattening_set(mainView(), EINA_FALSE);
- ewk_view_setting_application_cache_set(mainView(), EINA_TRUE);
- ewk_view_setting_enable_scripts_set(mainView(), EINA_TRUE);
- ewk_view_font_family_name_set(mainView(), EWK_FONT_FAMILY_STANDARD, "Times");
- ewk_view_font_family_name_set(mainView(), EWK_FONT_FAMILY_MONOSPACE, "Courier");
- ewk_view_font_family_name_set(mainView(), EWK_FONT_FAMILY_SERIF, "Times");
- ewk_view_font_family_name_set(mainView(), EWK_FONT_FAMILY_SANS_SERIF, "Helvetica");
- ewk_view_font_family_name_set(mainView(), EWK_FONT_FAMILY_CURSIVE, "cursive");
- ewk_view_font_family_name_set(mainView(), EWK_FONT_FAMILY_FANTASY, "fantasy");
- ewk_view_setting_font_default_size_set(mainView(), 16);
- ewk_view_setting_font_monospace_size_set(mainView(), 13);
- ewk_view_setting_font_minimum_size_set(mainView(), 0);
- ewk_view_setting_caret_browsing_set(mainView(), EINA_FALSE);
- ewk_view_setting_page_cache_set(mainView(), EINA_FALSE);
- ewk_view_setting_enable_auto_resize_window_set(mainView(), EINA_TRUE);
- ewk_view_setting_enable_plugins_set(mainView(), EINA_TRUE);
- ewk_view_setting_scripts_can_open_windows_set(mainView(), EINA_TRUE);
- ewk_view_setting_scripts_can_close_windows_set(mainView(), EINA_TRUE);
- ewk_view_setting_auto_load_images_set(mainView(), EINA_TRUE);
- ewk_view_setting_user_stylesheet_set(mainView(), 0);
- ewk_view_setting_enable_xss_auditor_set(browser->mainView(), EINA_TRUE);
- ewk_view_setting_enable_webgl_set(mainView(), EINA_TRUE);
- ewk_view_setting_enable_hyperlink_auditing_set(mainView(), EINA_FALSE);
- ewk_view_setting_include_links_in_focus_chain_set(mainView(), EINA_FALSE);
- ewk_view_setting_scripts_can_access_clipboard_set(mainView(), EINA_TRUE);
- ewk_view_setting_allow_universal_access_from_file_urls_set(mainView(), EINA_TRUE);
- ewk_view_setting_allow_file_access_from_file_urls_set(mainView(), EINA_TRUE);
- ewk_view_setting_resizable_textareas_set(mainView(), EINA_TRUE);
- ewk_view_zoom_set(mainView(), 1.0, 0, 0);
- ewk_view_scale_set(mainView(), 1.0, 0, 0);
- ewk_view_text_zoom_set(mainView(), 1.0);
- ewk_view_visibility_state_set(mainView(), EWK_PAGE_VISIBILITY_STATE_VISIBLE, true);
- ewk_view_text_direction_set(mainView(), EWK_TEXT_DIRECTION_DEFAULT);
- ewk_history_clear(ewk_view_history_get(mainView()));
- ewk_frame_feed_focus_in(mainFrame());
- ewk_cookies_clear();
- ewk_cookies_policy_set(EWK_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY);
- ewk_security_policy_whitelist_origin_reset();
- #if HAVE(ACCESSIBILITY)
- browser->accessibilityController()->resetToConsistentState();
- #endif
- DumpRenderTreeSupportEfl::clearFrameName(mainFrame());
- DumpRenderTreeSupportEfl::clearOpener(mainFrame());
- DumpRenderTreeSupportEfl::clearUserScripts(mainView());
- DumpRenderTreeSupportEfl::clearUserStyleSheets(mainView());
- DumpRenderTreeSupportEfl::resetGeolocationClientMock(mainView());
- DumpRenderTreeSupportEfl::setInteractiveFormValidationEnabled(mainView(), true);
- DumpRenderTreeSupportEfl::setValidationMessageTimerMagnification(mainView(), -1);
- DumpRenderTreeSupportEfl::setAuthorAndUserStylesEnabled(mainView(), true);
- DumpRenderTreeSupportEfl::setCSSGridLayoutEnabled(mainView(), false);
- DumpRenderTreeSupportEfl::setDefersLoading(mainView(), false);
- DumpRenderTreeSupportEfl::setLoadsSiteIconsIgnoringImageLoadingSetting(mainView(), false);
- DumpRenderTreeSupportEfl::setSerializeHTTPLoads(false);
- DumpRenderTreeSupportEfl::setMinimumLogicalFontSize(mainView(), 9);
- DumpRenderTreeSupportEfl::setCSSRegionsEnabled(mainView(), true);
- DumpRenderTreeSupportEfl::setShouldTrackVisitedLinks(false);
- DumpRenderTreeSupportEfl::setTracksRepaints(mainFrame(), false);
- DumpRenderTreeSupportEfl::setSeamlessIFramesEnabled(true);
- DumpRenderTreeSupportEfl::setWebAudioEnabled(mainView(), false);
- // Reset capacities for the memory cache for dead objects.
- static const unsigned cacheTotalCapacity = 8192 * 1024;
- ewk_settings_object_cache_capacity_set(0, cacheTotalCapacity, cacheTotalCapacity);
- DumpRenderTreeSupportEfl::setDeadDecodedDataDeletionInterval(0);
- ewk_settings_page_cache_capacity_set(3);
- policyDelegateEnabled = false;
- policyDelegatePermissive = false;
- }
- static CString pathSuitableForTestResult(const char* uriString)
- {
- if (!uriString)
- return CString();
- KURL uri = KURL(ParsedURLString, uriString);
- if (!uri.isLocalFile())
- return uri.string().utf8();
- String pathString = uri.path();
- size_t indexBaseName = pathString.reverseFind('/');
- String baseName;
- if (indexBaseName == notFound)
- baseName = pathString;
- else
- baseName = pathString.substring(indexBaseName + 1);
- String dirName;
- if (indexBaseName != notFound) {
- size_t indexDirName = pathString.reverseFind('/', indexBaseName - 1);
- if (indexDirName != notFound)
- dirName = pathString.substring(indexDirName + 1, indexBaseName - indexDirName - 1);
- }
- String ret = dirName + "/" + baseName;
- return ret.utf8();
- }
- static CString urlSuitableForTestResult(const char* uriString)
- {
- KURL uri = KURL(ParsedURLString, uriString);
- if (!uri.isLocalFile())
- return CString(uriString);
- unsigned startIndex = uri.pathAfterLastSlash();
- return uri.string().substring(startIndex).utf8();
- }
- static CString descriptionSuitableForTestResult(Ewk_Frame_Resource_Request* request)
- {
- StringBuilder builder;
- builder.appendLiteral("<NSURLRequest URL ");
- builder.append(pathSuitableForTestResult(request->url).data());
- builder.appendLiteral(", main document URL ");
- builder.append(urlSuitableForTestResult(request->first_party).data());
- builder.appendLiteral(", http method ");
- if (request->http_method)
- builder.append(String(request->http_method));
- else
- builder.appendLiteral("(none)");
- builder.append('>');
- return builder.toString().utf8();
- }
- static CString descriptionSuitableForTestResult(const Ewk_Frame_Resource_Response* response)
- {
- if (!response)
- return CString("(null)");
- StringBuilder builder;
- builder.appendLiteral("<NSURLResponse ");
- builder.append(pathSuitableForTestResult(response->url).data());
- builder.appendLiteral(", http status code ");
- builder.append(String::number(response->status_code));
- builder.append('>');
- return builder.toString().utf8();
- }
- static CString descriptionSuitableForTestResult(Ewk_Frame_Load_Error* error)
- {
- const char* errorDomain = error->domain;
- int errorCode = error->code;
- // We need to do some error mapping here to match
- // the test expectations.
- if (!strcmp(error->domain, "WebKitNetworkError")) {
- errorDomain = "NSURLErrorDomain";
- errorCode = -999;
- }
- if (!strcmp(errorDomain, "WebKitPolicyError"))
- errorDomain = "WebKitErrorDomain";
- String ret = makeString("<NSError domain ", errorDomain, ", code ", String::number(errorCode));
- if (error->failing_url && *error->failing_url != '\0')
- ret = makeString(ret, ", failing URL \"", error->failing_url, "\"");
- ret = makeString(ret, ">");
- return ret.utf8();
- }
- // Smart Callbacks
- // ---------------
- void DumpRenderTreeChrome::onWindowObjectCleared(void* userData, Evas_Object*, void* eventInfo)
- {
- Ewk_Window_Object_Cleared_Event* objectClearedInfo = static_cast<Ewk_Window_Object_Cleared_Event*>(eventInfo);
- JSValueRef exception = 0;
- ASSERT(gTestRunner);
- #if HAVE(ACCESSIBILITY)
- browser->accessibilityController()->makeWindowObject(objectClearedInfo->context, objectClearedInfo->windowObject, &exception);
- ASSERT(!exception);
- #endif
- GCController* gcController = static_cast<GCController*>(userData);
- ASSERT(gcController);
- gTestRunner->makeWindowObject(objectClearedInfo->context, objectClearedInfo->windowObject, &exception);
- ASSERT(!exception);
- gcController->makeWindowObject(objectClearedInfo->context, objectClearedInfo->windowObject, &exception);
- ASSERT(!exception);
- JSRetainPtr<JSStringRef> controllerName(Adopt, JSStringCreateWithUTF8CString("eventSender"));
- JSObjectSetProperty(objectClearedInfo->context, objectClearedInfo->windowObject,
- controllerName.get(),
- makeEventSender(objectClearedInfo->context, !DumpRenderTreeSupportEfl::frameParent(objectClearedInfo->frame)),
- kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, 0);
- JSRetainPtr<JSStringRef> textInputControllerName(Adopt, JSStringCreateWithUTF8CString("textInputController"));
- JSObjectSetProperty(objectClearedInfo->context, objectClearedInfo->windowObject,
- textInputControllerName.get(),
- makeTextInputController(objectClearedInfo->context),
- kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, 0);
- WebCoreTestSupport::injectInternalsObject(objectClearedInfo->context);
- }
- void DumpRenderTreeChrome::onLoadStarted(void*, Evas_Object* view, void* eventInfo)
- {
- Evas_Object* frame = static_cast<Evas_Object*>(eventInfo);
- // Make sure we only set this once per test. If it gets cleared, and then set again, we might
- // end up doing two dumps for one test.
- if (!topLoadingFrame && !done)
- topLoadingFrame = frame;
- }
- Eina_Bool DumpRenderTreeChrome::processWork(void*)
- {
- if (WorkQueue::shared()->processWork() && !gTestRunner->waitToDump())
- dump();
- return ECORE_CALLBACK_CANCEL;
- }
- void DumpRenderTreeChrome::topLoadingFrameLoadFinished()
- {
- topLoadingFrame = 0;
- WorkQueue::shared()->setFrozen(true);
- if (gTestRunner->waitToDump())
- return;
- if (WorkQueue::shared()->count())
- ecore_idler_add(processWork, 0 /*frame*/);
- else
- dump();
- }
- void DumpRenderTreeChrome::onStatusbarTextSet(void*, Evas_Object*, void* eventInfo)
- {
- if (!gTestRunner->dumpStatusCallbacks())
- return;
- const char* statusbarText = static_cast<const char*>(eventInfo);
- printf("UI DELEGATE STATUS CALLBACK: setStatusText:%s\n", statusbarText);
- }
- void DumpRenderTreeChrome::onFrameIconChanged(void*, Evas_Object* frame, void*)
- {
- if (!done && gTestRunner->dumpIconChanges()) {
- const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
- printf("%s - didChangeIcons\n", frameName.utf8().data());
- }
- }
- void DumpRenderTreeChrome::onFrameTitleChanged(void*, Evas_Object* frame, void* eventInfo)
- {
- const Ewk_Text_With_Direction* titleText = static_cast<const Ewk_Text_With_Direction*>(eventInfo);
- if (!done && gTestRunner->dumpFrameLoadCallbacks()) {
- const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
- printf("%s - didReceiveTitle: %s\n", frameName.utf8().data(), (titleText && titleText->string) ? titleText->string : "");
- }
- if (!done && gTestRunner->dumpTitleChanges())
- printf("TITLE CHANGED: '%s'\n", (titleText && titleText->string) ? titleText->string : "");
- if (!done && gTestRunner->dumpHistoryDelegateCallbacks())
- printf("WebView updated the title for history URL \"%s\" to \"%s\".\n", ewk_frame_uri_get(frame)
- , (titleText && titleText->string) ? titleText->string : "");
- gTestRunner->setTitleTextDirection(titleText->direction == EWK_TEXT_DIRECTION_LEFT_TO_RIGHT ? "ltr" : "rtl");
- }
- void DumpRenderTreeChrome::onDocumentLoadFinished(void*, Evas_Object*, void* eventInfo)
- {
- const Evas_Object* frame = static_cast<Evas_Object*>(eventInfo);
- const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
- if (!done && gTestRunner->dumpFrameLoadCallbacks())
- printf("%s - didFinishDocumentLoadForFrame\n", frameName.utf8().data());
- else if (!done) {
- const unsigned pendingFrameUnloadEvents = DumpRenderTreeSupportEfl::pendingUnloadEventCount(frame);
- if (pendingFrameUnloadEvents)
- printf("%s - has %u onunload handler(s)\n", frameName.utf8().data(), pendingFrameUnloadEvents);
- }
- }
- void DumpRenderTreeChrome::onWillSendRequest(void*, Evas_Object*, void* eventInfo)
- {
- Ewk_Frame_Resource_Messages* messages = static_cast<Ewk_Frame_Resource_Messages*>(eventInfo);
- if (!done && gTestRunner->dumpResourceLoadCallbacks())
- printf("%s - willSendRequest %s redirectResponse %s\n",
- m_dumpAssignedUrls.contains(messages->request->identifier) ? m_dumpAssignedUrls.get(messages->request->identifier).data() : "<unknown>",
- descriptionSuitableForTestResult(messages->request).data(),
- descriptionSuitableForTestResult(messages->redirect_response).data());
- if (!done && gTestRunner->willSendRequestReturnsNull()) {
- // As requested by the TestRunner, don't perform the request.
- messages->request->url = 0;
- return;
- }
- if (!done && gTestRunner->willSendRequestReturnsNullOnRedirect() && messages->redirect_response) {
- printf("Returning null for this redirect\n");
- messages->request->url = 0;
- return;
- }
- KURL url = KURL(ParsedURLString, messages->request->url);
- if (url.isValid()
- && url.protocolIsInHTTPFamily()
- && url.host() != "127.0.0.1"
- && url.host() != "255.255.255.255"
- && url.host().lower() != "localhost") {
- printf("Blocked access to external URL %s\n", messages->request->url);
- messages->request->url = 0;
- return;
- }
- const std::string& destination = gTestRunner->redirectionDestinationForURL(url.string().utf8().data());
- if (destination.length())
- messages->request->url = strdup(destination.c_str());
- }
- void DumpRenderTreeChrome::onWebViewOnloadEvent(void*, Evas_Object*, void* eventInfo)
- {
- const Evas_Object* frame = static_cast<Evas_Object*>(eventInfo);
- if (!done && gTestRunner->dumpFrameLoadCallbacks()) {
- const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
- printf("%s - didHandleOnloadEventsForFrame\n", frameName.utf8().data());
- }
- }
- void DumpRenderTreeChrome::onInsecureContentRun(void*, Evas_Object*, void*)
- {
- if (!done && gTestRunner->dumpFrameLoadCallbacks())
- printf("didRunInsecureContent\n");
- }
- void DumpRenderTreeChrome::onInsecureContentDisplayed(void*, Evas_Object*, void*)
- {
- if (!done && gTestRunner->dumpFrameLoadCallbacks())
- printf("didDisplayInsecureContent\n");
- }
- void DumpRenderTreeChrome::onFrameCreated(void*, Evas_Object*, void* eventInfo)
- {
- Evas_Object* frame = static_cast<Evas_Object*>(eventInfo);
- evas_object_smart_callback_add(frame, "icon,changed", onFrameIconChanged, 0);
- evas_object_smart_callback_add(frame, "load,provisional", onFrameProvisionalLoad, 0);
- evas_object_smart_callback_add(frame, "load,provisional,failed", onFrameProvisionalLoadFailed, 0);
- evas_object_smart_callback_add(frame, "load,committed", onFrameLoadCommitted, 0);
- evas_object_smart_callback_add(frame, "load,finished", onFrameLoadFinished, 0);
- evas_object_smart_callback_add(frame, "load,error", onFrameLoadError, 0);
- evas_object_smart_callback_add(frame, "redirect,cancelled", onFrameRedirectCancelled, 0);
- evas_object_smart_callback_add(frame, "redirect,load,provisional", onFrameRedirectForProvisionalLoad, 0);
- evas_object_smart_callback_add(frame, "redirect,requested", onFrameRedirectRequested, 0);
- evas_object_smart_callback_add(frame, "title,changed", onFrameTitleChanged, 0);
- evas_object_smart_callback_add(frame, "xss,detected", onDidDetectXSS, 0);
- }
- void DumpRenderTreeChrome::onWebViewNavigatedWithData(void*, Evas_Object*, void* eventInfo)
- {
- if (done || !gTestRunner->dumpHistoryDelegateCallbacks())
- return;
- ASSERT(eventInfo);
- const Ewk_View_Navigation_Data* navigationData = static_cast<Ewk_View_Navigation_Data*>(eventInfo);
- ASSERT(navigationData->request);
- ASSERT(navigationData->response);
- const bool wasFailure = navigationData->has_substitute_data || navigationData->response->status_code >= 400;
- const bool wasRedirected = navigationData->client_redirect_source && *(navigationData->client_redirect_source);
- printf("WebView navigated to url \"%s\" with title \"%s\" with HTTP equivalent method \"%s\". The navigation was %s and was %s%s.\n",
- navigationData->url,
- navigationData->title,
- navigationData->request->http_method,
- wasFailure? "a failure" : "successful",
- (wasRedirected ? "a client redirect from " : "not a client redirect"),
- (wasRedirected ? navigationData->client_redirect_source : ""));
- }
- void DumpRenderTreeChrome::onWebViewServerRedirect(void*, Evas_Object*, void* eventInfo)
- {
- if (done || !gTestRunner->dumpHistoryDelegateCallbacks())
- return;
- ASSERT(eventInfo);
- const Ewk_View_Redirection_Data* data = static_cast<Ewk_View_Redirection_Data*>(eventInfo);
- printf("WebView performed a server redirect from \"%s\" to \"%s\".\n", data->source_url, data->destination_url);
- }
- void DumpRenderTreeChrome::onWebViewClientRedirect(void*, Evas_Object*, void* eventInfo)
- {
- if (done || !gTestRunner->dumpHistoryDelegateCallbacks())
- return;
- ASSERT(eventInfo);
- const Ewk_View_Redirection_Data* data = static_cast<Ewk_View_Redirection_Data*>(eventInfo);
- printf("WebView performed a client redirect from \"%s\" to \"%s\".\n", data->source_url, data->destination_url);
- }
- void DumpRenderTreeChrome::onWebViewPopulateVisitedLinks(void*, Evas_Object* ewkView, void*)
- {
- if (done || !gTestRunner->dumpHistoryDelegateCallbacks())
- return;
- printf("Asked to populate visited links for WebView \"%s\"\n", ewk_view_uri_get(ewkView));
- }
- void DumpRenderTreeChrome::onInspectorViewCreate(void*, Evas_Object*, void*)
- {
- Evas_Object* inspectorView = browser->createInspectorView();
- if (inspectorView)
- ewk_view_inspector_view_set(browser->mainView(), inspectorView);
- }
- void DumpRenderTreeChrome::onInspectorViewClose(void*, Evas_Object*, void*)
- {
- browser->removeInspectorView();
- }
- void DumpRenderTreeChrome::onInspectorFrameLoadFinished(void*, Evas_Object*, void*)
- {
- Evas_Object* inspectorView = ewk_view_inspector_view_get(browser->mainView());
- if (inspectorView)
- ecore_main_loop_quit();
- }
- void DumpRenderTreeChrome::onFrameProvisionalLoad(void*, Evas_Object* frame, void*)
- {
- if (!done && gTestRunner->dumpFrameLoadCallbacks()) {
- const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
- printf("%s - didStartProvisionalLoadForFrame\n", frameName.utf8().data());
- }
- if (!topLoadingFrame && !done)
- topLoadingFrame = frame;
-
- if (!done && gTestRunner->stopProvisionalFrameLoads()) {
- const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
- printf("%s - stopping load in didStartProvisionalLoadForFrame callback\n", frameName.utf8().data());
- ewk_frame_stop(frame);
- }
- }
- void DumpRenderTreeChrome::onFrameProvisionalLoadFailed(void*, Evas_Object* frame, void*)
- {
- m_provisionalLoadFailedFrame = frame;
- if (!done && gTestRunner->dumpFrameLoadCallbacks()) {
- const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
- printf("%s - didFailProvisionalLoadWithError\n", frameName.utf8().data());
- }
- }
- void DumpRenderTreeChrome::onFrameLoadCommitted(void*, Evas_Object* frame, void*)
- {
- if (!done && gTestRunner->dumpFrameLoadCallbacks()) {
- const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
- printf("%s - didCommitLoadForFrame\n", frameName.utf8().data());
- }
- }
- void DumpRenderTreeChrome::onFrameLoadFinished(void*, Evas_Object* frame, void* eventInfo)
- {
- const Ewk_Frame_Load_Error* error = static_cast<Ewk_Frame_Load_Error*>(eventInfo);
- // EFL port emits both "load,finished" and "load,error" signals in error case.
- // Error case is therefore already handled in onFrameLoadError() and we don't need
- // to handle it here.
- if (error)
- return;
- if (!done && gTestRunner->dumpProgressFinishedCallback())
- printf("postProgressFinishedNotification\n");
- if (!done && gTestRunner->dumpFrameLoadCallbacks()) {
- const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
- printf("%s - didFinishLoadForFrame\n", frameName.utf8().data());
- }
- if (frame == topLoadingFrame)
- topLoadingFrameLoadFinished();
- }
- void DumpRenderTreeChrome::onFrameLoadError(void*, Evas_Object* frame, void*)
- {
- // In case of provisional load error, we receive both "load,error" and "load,provisional,failed"
- // signals. m_provisionalLoadFailedFrame is used to avoid printing twice the load error: in
- // onFrameProvisionalLoadFailed() and onFrameLoadError().
- if (!done && gTestRunner->dumpFrameLoadCallbacks() && frame != m_provisionalLoadFailedFrame) {
- const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
- printf("%s - didFailLoadWithError\n", frameName.utf8().data());
- }
- if (m_provisionalLoadFailedFrame && frame == m_provisionalLoadFailedFrame)
- m_provisionalLoadFailedFrame = 0;
- if (frame == topLoadingFrame)
- topLoadingFrameLoadFinished();
- }
- void DumpRenderTreeChrome::onFrameRedirectCancelled(void*, Evas_Object* frame, void*)
- {
- if (!done && gTestRunner->dumpFrameLoadCallbacks()) {
- const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
- printf("%s - didCancelClientRedirectForFrame\n", frameName.utf8().data());
- }
- }
- void DumpRenderTreeChrome::onFrameRedirectForProvisionalLoad(void*, Evas_Object* frame, void*)
- {
- if (!done && gTestRunner->dumpFrameLoadCallbacks()) {
- const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
- printf("%s - didReceiveServerRedirectForProvisionalLoadForFrame\n", frameName.utf8().data());
- }
- }
- void DumpRenderTreeChrome::onFrameRedirectRequested(void*, Evas_Object* frame, void* eventInfo)
- {
- const char* url = static_cast<const char*>(eventInfo);
- if (!done && gTestRunner->dumpFrameLoadCallbacks()) {
- const String frameName(DumpRenderTreeSupportEfl::suitableDRTFrameName(frame));
- printf("%s - willPerformClientRedirectToURL: %s \n", frameName.utf8().data(), pathSuitableForTestResult(url).data());
- }
- }
- void DumpRenderTreeChrome::onDidDetectXSS(void*, Evas_Object* view, void*)
- {
- if (!done && gTestRunner->dumpFrameLoadCallbacks())
- printf("didDetectXSS\n");
- }
- void DumpRenderTreeChrome::onResponseReceived(void*, Evas_Object*, void* eventInfo)
- {
- Ewk_Frame_Resource_Response* response = static_cast<Ewk_Frame_Resource_Response*>(eventInfo);
- if (!done && gTestRunner->dumpResourceLoadCallbacks()) {
- CString responseDescription(descriptionSuitableForTestResult(response));
- printf("%s - didReceiveResponse %s\n",
- m_dumpAssignedUrls.contains(response->identifier) ? m_dumpAssignedUrls.get(response->identifier).data() : "<unknown>",
- responseDescription.data());
- }
- if (!done && gTestRunner->dumpResourceResponseMIMETypes()) {
- printf("%s has MIME type %s\n",
- KURL(ParsedURLString, response->url).lastPathComponent().utf8().data(),
- response->mime_type);
- }
- }
- void DumpRenderTreeChrome::onResourceLoadFinished(void*, Evas_Object*, void* eventInfo)
- {
- unsigned long identifier = *static_cast<unsigned long*>(eventInfo);
- if (!done && gTestRunner->dumpResourceLoadCallbacks())
- printf("%s - didFinishLoading\n",
- (m_dumpAssignedUrls.contains(identifier) ? m_dumpAssignedUrls.take(identifier).data() : "<unknown>"));
- }
- void DumpRenderTreeChrome::onResourceLoadFailed(void*, Evas_Object*, void* eventInfo)
- {
- Ewk_Frame_Load_Error* error = static_cast<Ewk_Frame_Load_Error*>(eventInfo);
- if (!done && gTestRunner->dumpResourceLoadCallbacks())
- printf("%s - didFailLoadingWithError: %s\n",
- (m_dumpAssignedUrls.contains(error->resource_identifier) ? m_dumpAssignedUrls.take(error->resource_identifier).data() : "<unknown>"),
- descriptionSuitableForTestResult(error).data());
- }
- void DumpRenderTreeChrome::onNewResourceRequest(void*, Evas_Object*, void* eventInfo)
- {
- Ewk_Frame_Resource_Request* request = static_cast<Ewk_Frame_Resource_Request*>(eventInfo);
- if (!done && gTestRunner->dumpResourceLoadCallbacks())
- m_dumpAssignedUrls.add(request->identifier, pathSuitableForTestResult(request->url));
- }
- void DumpRenderTreeChrome::onDownloadRequest(void*, Evas_Object*, void* eventInfo)
- {
- // In case of "download,request", the URL need to be downloaded, not opened on the current view.
- // Because there is no download agent for the DumpRenderTree,
- // create a new view and load the URL on that view just for a test.
- Evas_Object* newView = browser->createView();
- if (!newView)
- return;
- Ewk_Download* download = static_cast<Ewk_Download*>(eventInfo);
- ewk_view_theme_set(newView, TEST_THEME_DIR "/default.edj");
- ewk_view_uri_set(newView, download->url);
-
- browser->m_extraViews.append(newView);
- }
- #if HAVE(ACCESSIBILITY)
- AccessibilityController* DumpRenderTreeChrome::accessibilityController() const
- {
- return m_axController.get();
- }
- #endif
|