blob: 224a4b70c7a2f7737700a2c1d74e13e40f78aed3 [file] [log] [blame]
/*
Copyright (C) 2011 ProFUSION embedded systems
Copyright (C) 2011 Samsung Electronics
Copyright (C) 2012 Intel Corporation. All rights reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "config.h"
#include "DumpRenderTreeSupportEfl.h"
#include "FrameLoaderClientEfl.h"
#include "ewk_frame_private.h"
#include "ewk_history_private.h"
#include "ewk_private.h"
#include "ewk_view_private.h"
#include <APICast.h>
#include <AnimationController.h>
#include <DOMWindow.h>
#include <DocumentLoader.h>
#include <Editor.h>
#include <EditorClientEfl.h>
#include <Eina.h>
#include <Evas.h>
#include <FindOptions.h>
#include <FloatSize.h>
#include <FocusController.h>
#include <FrameLoader.h>
#include <FrameSelection.h>
#include <FrameView.h>
#include <HTMLInputElement.h>
#include <InspectorController.h>
#include <IntRect.h>
#include <JSCSSStyleDeclaration.h>
#include <JSDOMWindow.h>
#include <JSElement.h>
#include <JavaScriptCore/OpaqueJSString.h>
#include <MemoryCache.h>
#include <MutationObserver.h>
#include <PageGroup.h>
#include <PrintContext.h>
#include <RenderTreeAsText.h>
#include <ResourceLoadScheduler.h>
#include <RuntimeEnabledFeatures.h>
#include <SchemeRegistry.h>
#include <ScriptController.h>
#include <ScriptValue.h>
#include <Settings.h>
#include <TextIterator.h>
#include <bindings/js/GCController.h>
#include <history/HistoryItem.h>
#include <wtf/HashMap.h>
#if ENABLE(GEOLOCATION)
#include <GeolocationClientMock.h>
#include <GeolocationController.h>
#include <GeolocationError.h>
#include <GeolocationPosition.h>
#include <wtf/CurrentTime.h>
#endif
#if HAVE(ACCESSIBILITY)
#include "AXObjectCache.h"
#include "AccessibilityObject.h"
#include "WebKitAccessibleWrapperAtk.h"
#endif
#define DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame, ...) \
WebCore::Frame* frame = EWKPrivate::coreFrame(ewkFrame); \
if (!frame) \
return __VA_ARGS__;
#define DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page, ...) \
WebCore::Page* page = EWKPrivate::corePage(ewkView); \
if (!page) \
return __VA_ARGS__;
bool DumpRenderTreeSupportEfl::s_drtRun = false;
void DumpRenderTreeSupportEfl::setDumpRenderTreeModeEnabled(bool enabled)
{
s_drtRun = enabled;
}
bool DumpRenderTreeSupportEfl::dumpRenderTreeModeEnabled()
{
return s_drtRun;
}
bool DumpRenderTreeSupportEfl::callShouldCloseOnWebView(Evas_Object* ewkFrame)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame, false);
return frame->loader()->shouldClose();
}
void DumpRenderTreeSupportEfl::clearFrameName(Evas_Object* ewkFrame)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame);
frame->tree()->clearName();
}
void DumpRenderTreeSupportEfl::clearOpener(Evas_Object* ewkFrame)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame);
frame->loader()->setOpener(0);
}
String DumpRenderTreeSupportEfl::layerTreeAsText(const Evas_Object* ewkFrame)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame, String());
return frame->layerTreeAsText();
}
Eina_List* DumpRenderTreeSupportEfl::frameChildren(const Evas_Object* ewkFrame)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame, 0);
Eina_List* childFrames = 0;
for (unsigned index = 0; index < frame->tree()->childCount(); index++) {
WebCore::Frame *childFrame = frame->tree()->child(index);
WebCore::FrameLoaderClientEfl *client = static_cast<WebCore::FrameLoaderClientEfl*>(childFrame->loader()->client());
if (!client)
continue;
childFrames = eina_list_append(childFrames, client->webFrame());
}
return childFrames;
}
WebCore::Frame* DumpRenderTreeSupportEfl::frameParent(const Evas_Object* ewkFrame)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame, 0);
return frame->tree()->parent();
}
void DumpRenderTreeSupportEfl::layoutFrame(Evas_Object* ewkFrame)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame);
if (!frame->view())
return;
frame->view()->layout();
}
unsigned DumpRenderTreeSupportEfl::pendingUnloadEventCount(const Evas_Object* ewkFrame)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame, 0);
return frame->document()->domWindow()->pendingUnloadEventListeners();
}
String DumpRenderTreeSupportEfl::renderTreeDump(Evas_Object* ewkFrame)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame, String());
WebCore::FrameView *frameView = frame->view();
if (frameView && frameView->layoutPending())
frameView->layout();
return WebCore::externalRepresentation(frame);
}
String DumpRenderTreeSupportEfl::responseMimeType(const Evas_Object* ewkFrame)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame, String());
WebCore::DocumentLoader *documentLoader = frame->loader()->documentLoader();
if (!documentLoader)
return String();
return documentLoader->responseMIMEType();
}
WebCore::IntRect DumpRenderTreeSupportEfl::selectionRectangle(const Evas_Object* ewkFrame)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame, WebCore::IntRect());
return enclosingIntRect(frame->selection()->bounds());
}
// Compare with "WebKit/Tools/DumpRenderTree/mac/FrameLoadDelegate.mm
String DumpRenderTreeSupportEfl::suitableDRTFrameName(const Evas_Object* ewkFrame)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame, String());
const String frameName(ewk_frame_name_get(ewkFrame));
if (ewkFrame == ewk_view_frame_main_get(ewk_frame_view_get(ewkFrame))) {
if (!frameName.isEmpty())
return String("main frame \"") + frameName + String("\"");
return String("main frame");
}
if (!frameName.isEmpty())
return String("frame \"") + frameName + String("\"");
return String("frame (anonymous)");
}
void DumpRenderTreeSupportEfl::setValueForUser(JSContextRef context, JSValueRef nodeObject, const String& value)
{
JSC::ExecState* exec = toJS(context);
WebCore::Element* element = WebCore::toElement(toJS(exec, nodeObject));
if (!element)
return;
WebCore::HTMLInputElement* inputElement = element->toInputElement();
if (!inputElement)
return;
inputElement->setValueForUser(value);
}
void DumpRenderTreeSupportEfl::setDefersLoading(Evas_Object* ewkView, bool defers)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
page->setDefersLoading(defers);
}
void DumpRenderTreeSupportEfl::setLoadsSiteIconsIgnoringImageLoadingSetting(Evas_Object* ewkView, bool loadsSiteIconsIgnoringImageLoadingPreferences)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
page->settings()->setLoadsSiteIconsIgnoringImageLoadingSetting(loadsSiteIconsIgnoringImageLoadingPreferences);
}
void DumpRenderTreeSupportEfl::setMinimumLogicalFontSize(Evas_Object* ewkView, int size)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
page->settings()->setMinimumLogicalFontSize(size);
}
void DumpRenderTreeSupportEfl::addUserScript(const Evas_Object* ewkView, const String& sourceCode, bool runAtStart, bool allFrames)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
page->group().addUserScriptToWorld(WebCore::mainThreadNormalWorld(), sourceCode, WebCore::KURL(),
Vector<String>(), Vector<String>(), runAtStart ? WebCore::InjectAtDocumentStart : WebCore::InjectAtDocumentEnd,
allFrames ? WebCore::InjectInAllFrames : WebCore::InjectInTopFrameOnly);
}
void DumpRenderTreeSupportEfl::clearUserScripts(const Evas_Object* ewkView)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
page->group().removeUserScriptsFromWorld(WebCore::mainThreadNormalWorld());
}
void DumpRenderTreeSupportEfl::addUserStyleSheet(const Evas_Object* ewkView, const String& sourceCode, bool allFrames)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
page->group().addUserStyleSheetToWorld(WebCore::mainThreadNormalWorld(), sourceCode, WebCore::KURL(), Vector<String>(), Vector<String>(), allFrames ? WebCore::InjectInAllFrames : WebCore::InjectInTopFrameOnly);
}
void DumpRenderTreeSupportEfl::clearUserStyleSheets(const Evas_Object* ewkView)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
page->group().removeUserStyleSheetsFromWorld(WebCore::mainThreadNormalWorld());
}
void DumpRenderTreeSupportEfl::executeCoreCommandByName(const Evas_Object* ewkView, const char* name, const char* value)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
page->focusController()->focusedOrMainFrame()->editor().command(name).execute(value);
}
bool DumpRenderTreeSupportEfl::findString(const Evas_Object* ewkView, const String& text, WebCore::FindOptions options)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page, false);
return page->findString(text, options);
}
void DumpRenderTreeSupportEfl::setCSSGridLayoutEnabled(const Evas_Object* ewkView, bool enabled)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
page->settings()->setCSSGridLayoutEnabled(enabled);
}
void DumpRenderTreeSupportEfl::setCSSRegionsEnabled(const Evas_Object* ewkView, bool enabled)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
WebCore::RuntimeEnabledFeatures::setCSSRegionsEnabled(enabled);
}
void DumpRenderTreeSupportEfl::setSeamlessIFramesEnabled(bool enabled)
{
#if ENABLE(IFRAME_SEAMLESS)
WebCore::RuntimeEnabledFeatures::setSeamlessIFramesEnabled(enabled);
#else
UNUSED_PARAM(enabled);
#endif
}
bool DumpRenderTreeSupportEfl::isCommandEnabled(const Evas_Object* ewkView, const char* name)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page, false);
return page->focusController()->focusedOrMainFrame()->editor().command(name).isEnabled();
}
void DumpRenderTreeSupportEfl::forceLayout(Evas_Object* ewkFrame)
{
ewk_frame_force_layout(ewkFrame);
}
void DumpRenderTreeSupportEfl::setTracksRepaints(Evas_Object* ewkFrame, bool enabled)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame);
if (frame->view())
frame->view()->setTracksRepaints(enabled);
}
void DumpRenderTreeSupportEfl::resetTrackedRepaints(Evas_Object* ewkFrame)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame);
if (frame->view())
frame->view()->resetTrackedRepaints();
}
bool DumpRenderTreeSupportEfl::isTrackingRepaints(const Evas_Object* ewkFrame)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame, false);
if (!frame->view())
return false;
return frame->view()->isTrackingRepaints();
}
Eina_List* DumpRenderTreeSupportEfl::trackedRepaintRects(const Evas_Object* ewkFrame)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame, 0);
if (!frame->view())
return 0;
const Vector<WebCore::IntRect>& repaintRects = frame->view()->trackedRepaintRects();
size_t count = repaintRects.size();
Eina_List* rectList = 0;
for (size_t i = 0; i < count; ++i) {
Eina_Rectangle* rect = eina_rectangle_new(repaintRects[i].x(), repaintRects[i].y(), repaintRects[i].width(), repaintRects[i].height());
rectList = eina_list_append(rectList, rect);
}
return rectList;
}
void DumpRenderTreeSupportEfl::garbageCollectorCollect()
{
WebCore::gcController().garbageCollectNow();
}
void DumpRenderTreeSupportEfl::garbageCollectorCollectOnAlternateThread(bool waitUntilDone)
{
WebCore::gcController().garbageCollectOnAlternateThreadForDebugging(waitUntilDone);
}
size_t DumpRenderTreeSupportEfl::javaScriptObjectsCount()
{
return WebCore::JSDOMWindow::commonVM()->heap.objectCount();
}
void DumpRenderTreeSupportEfl::setDeadDecodedDataDeletionInterval(double interval)
{
WebCore::memoryCache()->setDeadDecodedDataDeletionInterval(interval);
}
HistoryItemChildrenVector DumpRenderTreeSupportEfl::childHistoryItems(const Ewk_History_Item* ewkHistoryItem)
{
WebCore::HistoryItem* historyItem = EWKPrivate::coreHistoryItem(ewkHistoryItem);
HistoryItemChildrenVector kids;
if (!historyItem)
return kids;
const WebCore::HistoryItemVector& children = historyItem->children();
const unsigned size = children.size();
for (unsigned i = 0; i < size; ++i) {
Ewk_History_Item* kid = ewk_history_item_new_from_core(children[i].get());
kids.append(kid);
}
return kids;
}
String DumpRenderTreeSupportEfl::historyItemTarget(const Ewk_History_Item* ewkHistoryItem)
{
WebCore::HistoryItem* historyItem = EWKPrivate::coreHistoryItem(ewkHistoryItem);
if (!historyItem)
return String();
return historyItem->target();
}
bool DumpRenderTreeSupportEfl::isTargetItem(const Ewk_History_Item* ewkHistoryItem)
{
WebCore::HistoryItem* historyItem = EWKPrivate::coreHistoryItem(ewkHistoryItem);
if (!historyItem)
return false;
return historyItem->isTargetItem();
}
void DumpRenderTreeSupportEfl::evaluateInWebInspector(const Evas_Object* ewkView, long callId, const String& script)
{
#if ENABLE(INSPECTOR)
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
if (page->inspectorController())
page->inspectorController()->evaluateForTestInFrontend(callId, script);
#else
UNUSED_PARAM(ewkView);
UNUSED_PARAM(callId);
UNUSED_PARAM(script);
#endif
}
void DumpRenderTreeSupportEfl::evaluateScriptInIsolatedWorld(const Evas_Object* ewkFrame, int worldID, JSObjectRef globalObject, const String& script)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame);
// Comment from mac: Start off with some guess at a frame and a global object, we'll try to do better...!
WebCore::JSDOMWindow* anyWorldGlobalObject = frame->script()->globalObject(WebCore::mainThreadNormalWorld());
// Comment from mac: The global object is probably a shell object? - if so, we know how to use this!
JSC::JSObject* globalObjectObj = toJS(globalObject);
if (!strcmp(globalObjectObj->classInfo()->className, "JSDOMWindowShell"))
anyWorldGlobalObject = static_cast<WebCore::JSDOMWindowShell*>(globalObjectObj)->window();
// Comment from mac: Get the frame from the global object we've settled on.
WebCore::Frame* globalFrame = anyWorldGlobalObject->impl()->frame();
if (!globalFrame)
return;
WebCore::ScriptController* proxy = globalFrame->script();
if (!proxy)
return;
static WTF::HashMap<int, WTF::RefPtr<WebCore::DOMWrapperWorld > > worldMap;
WTF::RefPtr<WebCore::DOMWrapperWorld> scriptWorld;
if (!worldID)
scriptWorld = WebCore::ScriptController::createWorld();
else {
WTF::HashMap<int, RefPtr<WebCore::DOMWrapperWorld > >::const_iterator it = worldMap.find(worldID);
if (it != worldMap.end())
scriptWorld = (*it).value;
else {
scriptWorld = WebCore::ScriptController::createWorld();
worldMap.set(worldID, scriptWorld);
}
}
// The code below is only valid for JSC, V8 specific code is to be added
// when V8 will be supported in EFL port. See Qt implemenation.
proxy->executeScriptInWorld(scriptWorld.get(), script, true);
}
JSGlobalContextRef DumpRenderTreeSupportEfl::globalContextRefForFrame(const Evas_Object* ewkFrame)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame, 0);
return toGlobalRef(frame->script()->globalObject(WebCore::mainThreadNormalWorld())->globalExec());
}
void DumpRenderTreeSupportEfl::setMockScrollbarsEnabled(bool enable)
{
WebCore::Settings::setMockScrollbarsEnabled(enable);
}
void DumpRenderTreeSupportEfl::deliverAllMutationsIfNecessary()
{
WebCore::MutationObserver::deliverAllMutations();
}
void DumpRenderTreeSupportEfl::setInteractiveFormValidationEnabled(Evas_Object* ewkView, bool enabled)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
page->settings()->setInteractiveFormValidationEnabled(enabled);
}
void DumpRenderTreeSupportEfl::setValidationMessageTimerMagnification(Evas_Object* ewkView, int value)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
page->settings()->setValidationMessageTimerMagnification(value);
}
void DumpRenderTreeSupportEfl::setAuthorAndUserStylesEnabled(Evas_Object* ewkView, bool enabled)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
page->settings()->setAuthorAndUserStylesEnabled(enabled);
}
void DumpRenderTreeSupportEfl::setSerializeHTTPLoads(bool enabled)
{
WebCore::resourceLoadScheduler()->setSerialLoadingEnabled(enabled);
}
void DumpRenderTreeSupportEfl::setShouldTrackVisitedLinks(bool shouldTrack)
{
WebCore::PageGroup::setShouldTrackVisitedLinks(shouldTrack);
}
void DumpRenderTreeSupportEfl::setComposition(Evas_Object* ewkView, const char* text, int start, int length)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
if (!page->focusController() || !page->focusController()->focusedOrMainFrame())
return;
WebCore::Editor& editor = page->focusController()->focusedOrMainFrame()->editor();
if (!editor.canEdit() && !editor.hasComposition())
return;
const String compositionString = String::fromUTF8(text);
Vector<WebCore::CompositionUnderline> underlines;
underlines.append(WebCore::CompositionUnderline(0, compositionString.length(), WebCore::Color(0, 0, 0), false));
editor.setComposition(compositionString, underlines, start, start + length);
}
bool DumpRenderTreeSupportEfl::hasComposition(const Evas_Object* ewkView)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page, false);
if (!page->focusController() || !page->focusController()->focusedOrMainFrame())
return false;
return page->focusController()->focusedOrMainFrame()->editor().hasComposition();
}
bool DumpRenderTreeSupportEfl::compositionRange(Evas_Object* ewkView, int* start, int* length)
{
*start = *length = 0;
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page, false);
if (!page->focusController() || !page->focusController()->focusedOrMainFrame())
return false;
WebCore::Editor& editor = page->focusController()->focusedOrMainFrame()->editor();
if (!editor.hasComposition())
return false;
*start = editor.compositionStart();
*length = editor.compositionEnd() - *start;
return true;
}
void DumpRenderTreeSupportEfl::confirmComposition(Evas_Object* ewkView, const char* text)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
if (!page->focusController() || !page->focusController()->focusedOrMainFrame())
return;
WebCore::Editor& editor = page->focusController()->focusedOrMainFrame()->editor();
if (!editor.hasComposition()) {
editor.insertText(String::fromUTF8(text), 0);
return;
}
if (text) {
editor.confirmComposition(String::fromUTF8(text));
return;
}
editor.confirmComposition();
}
WebCore::IntRect DumpRenderTreeSupportEfl::firstRectForCharacterRange(Evas_Object* ewkView, int location, int length)
{
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page, WebCore::IntRect());
if (!page->focusController() || !page->focusController()->focusedOrMainFrame())
return WebCore::IntRect();
if ((location + length < location) && (location + length))
length = 0;
WebCore::Frame* frame = page->focusController()->focusedOrMainFrame();
RefPtr<WebCore::Range> range = WebCore::TextIterator::rangeFromLocationAndLength(frame->selection()->rootEditableElementOrDocumentElement(), location, length);
if (!range)
return WebCore::IntRect();
return frame->editor().firstRectForRange(range.get());
}
bool DumpRenderTreeSupportEfl::selectedRange(Evas_Object* ewkView, int* start, int* length)
{
if (!(start && length))
return false;
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page, false);
if (!page->focusController() || !page->focusController()->focusedOrMainFrame())
return false;
WebCore::Frame* frame = page->focusController()->focusedOrMainFrame();
RefPtr<WebCore::Range> range = frame->selection()->toNormalizedRange().get();
if (!range)
return false;
WebCore::Element* selectionRoot = frame->selection()->rootEditableElement();
WebCore::Element* scope = selectionRoot ? selectionRoot : frame->document()->documentElement();
RefPtr<WebCore::Range> testRange = WebCore::Range::create(scope->document(), scope, 0, range->startContainer(), range->startOffset());
*start = WebCore::TextIterator::rangeLength(testRange.get());
WebCore::ExceptionCode ec;
testRange->setEnd(range->endContainer(), range->endOffset(), ec);
*length = WebCore::TextIterator::rangeLength(testRange.get());
return true;
}
void DumpRenderTreeSupportEfl::setDomainRelaxationForbiddenForURLScheme(bool forbidden, const String& scheme)
{
WebCore::SchemeRegistry::setDomainRelaxationForbiddenForURLScheme(forbidden, scheme);
}
void DumpRenderTreeSupportEfl::resetGeolocationClientMock(const Evas_Object* ewkView)
{
#if ENABLE(GEOLOCATION)
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
WebCore::GeolocationClientMock* mock = static_cast<WebCore::GeolocationClientMock*>(WebCore::GeolocationController::from(page)->client());
mock->reset();
#else
UNUSED_PARAM(ewkView);
#endif
}
void DumpRenderTreeSupportEfl::setMockGeolocationPermission(const Evas_Object* ewkView, bool allowed)
{
#if ENABLE(GEOLOCATION)
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
WebCore::GeolocationClientMock* mock = static_cast<WebCore::GeolocationClientMock*>(WebCore::GeolocationController::from(page)->client());
mock->setPermission(allowed);
#else
UNUSED_PARAM(ewkView);
UNUSED_PARAM(allowed);
#endif
}
void DumpRenderTreeSupportEfl::setMockGeolocationPosition(const Evas_Object* ewkView, double latitude, double longitude, double accuracy, bool canProvideAltitude, double altitude, bool canProvideAltitudeAccuracy, double altitudeAccuracy, bool canProvideHeading, double heading, bool canProvideSpeed, double speed)
{
#if ENABLE(GEOLOCATION)
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
WebCore::GeolocationClientMock* mock = static_cast<WebCore::GeolocationClientMock*>(WebCore::GeolocationController::from(page)->client());
mock->setPosition(WebCore::GeolocationPosition::create(currentTime(), latitude, longitude, accuracy, canProvideAltitude, altitude, canProvideAltitudeAccuracy, altitudeAccuracy, canProvideHeading, heading, canProvideSpeed, speed));
#else
UNUSED_PARAM(ewkView);
UNUSED_PARAM(latitude);
UNUSED_PARAM(longitude);
UNUSED_PARAM(accuracy);
UNUSED_PARAM(canProvideAltitude);
UNUSED_PARAM(altitude);
UNUSED_PARAM(canProvideAltitudeAccuracy);
UNUSED_PARAM(altitudeAccuracy);
UNUSED_PARAM(canProvideHeading);
UNUSED_PARAM(heading);
UNUSED_PARAM(canProvideSpeed);
UNUSED_PARAM(speed);
#endif
}
void DumpRenderTreeSupportEfl::setMockGeolocationPositionUnavailableError(const Evas_Object* ewkView, const char* errorMessage)
{
#if ENABLE(GEOLOCATION)
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page);
WebCore::GeolocationClientMock* mock = static_cast<WebCore::GeolocationClientMock*>(WebCore::GeolocationController::from(page)->client());
mock->setPositionUnavailableError(errorMessage);
#else
UNUSED_PARAM(ewkView);
UNUSED_PARAM(errorMessage);
#endif
}
int DumpRenderTreeSupportEfl::numberOfPendingGeolocationPermissionRequests(const Evas_Object* ewkView)
{
#if ENABLE(GEOLOCATION)
DRT_SUPPRT_PAGE_GET_OR_RETURN(ewkView, page, -1);
WebCore::GeolocationClientMock* mock = static_cast<WebCore::GeolocationClientMock*>(WebCore::GeolocationController::from(page)->client());
return mock->numberOfPendingPermissionRequests();
#else
UNUSED_PARAM(ewkView);
return 0;
#endif
}
#if HAVE(ACCESSIBILITY)
String DumpRenderTreeSupportEfl::accessibilityHelpText(const AtkObject* axObject)
{
if (!axObject || !WEBKIT_IS_ACCESSIBLE(axObject))
return String();
WebCore::AccessibilityObject* coreObject = webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(axObject));
if (!coreObject)
return String();
return coreObject->helpText();
}
AtkObject* DumpRenderTreeSupportEfl::rootAccessibleElement(const Evas_Object* ewkFrame)
{
DRT_SUPPORT_FRAME_GET_OR_RETURN(ewkFrame, frame, 0);
if (!WebCore::AXObjectCache::accessibilityEnabled())
WebCore::AXObjectCache::enableAccessibility();
if (!frame->document())
return 0;
AtkObject* wrapper = frame->document()->axObjectCache()->rootObject()->wrapper();
if (!wrapper)
return 0;
return wrapper;
}
AtkObject* DumpRenderTreeSupportEfl::focusedAccessibleElement(const Evas_Object* ewkFrame)
{
AtkObject* wrapper = rootAccessibleElement(ewkFrame);
if (!wrapper)
return 0;
return webkitAccessibleGetFocusedElement(WEBKIT_ACCESSIBLE(wrapper));
}
#endif