[EFL][DRT] Implement LayoutTestController::execCommand
[WebKit-https.git] / Tools / DumpRenderTree / efl / LayoutTestControllerEfl.cpp
1 /*
2  * Copyright (C) 2007 Apple Inc. All rights reserved.
3  * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
4  * Copyright (C) 2008 Nuanti Ltd.
5  * Copyright (C) 2009 Jan Michael Alonzo <jmalonzo@gmail.com>
6  * Copyright (C) 2009,2011 Collabora Ltd.
7  * Copyright (C) 2010 Joone Hur <joone@kldp.org>
8  * Copyright (C) 2011 ProFUSION Embedded Systems
9  * Copyright (C) 2011 Samsung Electronics
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  *
15  * 1.  Redistributions of source code must retain the above copyright
16  *     notice, this list of conditions and the following disclaimer.
17  * 2.  Redistributions in binary form must reproduce the above copyright
18  *     notice, this list of conditions and the following disclaimer in the
19  *     documentation and/or other materials provided with the distribution.
20  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
21  *     its contributors may be used to endorse or promote products derived
22  *     from this software without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
25  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
28  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
31  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35
36 #include "config.h"
37 #include "LayoutTestController.h"
38
39 #include "DumpRenderTree.h"
40 #include "DumpRenderTreeChrome.h"
41 #include "JSStringUtils.h"
42 #include "NotImplemented.h"
43 #include "WebCoreSupport/DumpRenderTreeSupportEfl.h"
44 #include "WorkQueue.h"
45 #include "WorkQueueItem.h"
46 #include "ewk_private.h"
47 #include <EWebKit.h>
48 #include <Ecore_File.h>
49 #include <JavaScriptCore/JSRetainPtr.h>
50 #include <JavaScriptCore/JSStringRef.h>
51 #include <JavaScriptCore/OpaqueJSString.h>
52 #include <KURL.h>
53 #include <editing/FindOptions.h>
54 #include <stdio.h>
55 #include <wtf/text/WTFString.h>
56
57 LayoutTestController::~LayoutTestController()
58 {
59 }
60
61 void LayoutTestController::addDisallowedURL(JSStringRef)
62 {
63     notImplemented();
64 }
65
66 void LayoutTestController::clearBackForwardList()
67 {
68     Ewk_History* history = ewk_view_history_get(browser->mainView());
69     if (!history)
70         return;
71
72     Ewk_History_Item* item = ewk_history_history_item_current_get(history);
73     ewk_history_clear(history);
74     ewk_history_history_item_add(history, item);
75     ewk_history_history_item_set(history, item);
76     ewk_history_item_free(item);
77 }
78
79 JSStringRef LayoutTestController::copyDecodedHostName(JSStringRef)
80 {
81     notImplemented();
82     return 0;
83 }
84
85 JSStringRef LayoutTestController::copyEncodedHostName(JSStringRef)
86 {
87     notImplemented();
88     return 0;
89 }
90
91 void LayoutTestController::dispatchPendingLoadRequests()
92 {
93     // FIXME: Implement for testing fix for 6727495
94     notImplemented();
95 }
96
97 void LayoutTestController::display()
98 {
99     displayWebView();
100 }
101
102 JSRetainPtr<JSStringRef> LayoutTestController::counterValueForElementById(JSStringRef id)
103 {
104     const Evas_Object* mainFrame = browser->mainFrame();
105     const String counterValue(DumpRenderTreeSupportEfl::counterValueByElementId(mainFrame, id->ustring().utf8().data()));
106     return JSRetainPtr<JSStringRef>(Adopt, JSStringCreateWithUTF8CString(counterValue.utf8().data()));
107 }
108
109 void LayoutTestController::keepWebHistory()
110 {
111     notImplemented();
112 }
113
114 JSValueRef LayoutTestController::computedStyleIncludingVisitedInfo(JSContextRef context, JSValueRef value)
115 {
116     return DumpRenderTreeSupportEfl::computedStyleIncludingVisitedInfo(context, value);
117 }
118
119 JSRetainPtr<JSStringRef> LayoutTestController::layerTreeAsText() const
120 {
121     notImplemented();
122     return JSRetainPtr<JSStringRef>(Adopt, JSStringCreateWithUTF8CString(""));
123 }
124
125 int LayoutTestController::pageNumberForElementById(JSStringRef id, float pageWidth, float pageHeight)
126 {
127     return DumpRenderTreeSupportEfl::numberOfPagesForElementId(browser->mainFrame(), id->ustring().utf8().data(), pageWidth, pageHeight);
128 }
129
130 int LayoutTestController::numberOfPages(float pageWidth, float pageHeight)
131 {
132     return DumpRenderTreeSupportEfl::numberOfPages(browser->mainFrame(), pageWidth, pageHeight);
133 }
134
135 JSRetainPtr<JSStringRef> LayoutTestController::pageProperty(const char* propertyName, int pageNumber) const
136 {
137     const String property = DumpRenderTreeSupportEfl::pageProperty(browser->mainFrame(), propertyName, pageNumber);
138     if (property.isEmpty())
139         return 0;
140
141     JSRetainPtr<JSStringRef> propertyValue(Adopt, JSStringCreateWithUTF8CString(property.utf8().data()));
142     return propertyValue;
143 }
144
145 JSRetainPtr<JSStringRef> LayoutTestController::pageSizeAndMarginsInPixels(int pageNumber, int width, int height, int marginTop, int marginRight, int marginBottom, int marginLeft) const
146 {
147     String pageSizeAndMargins = DumpRenderTreeSupportEfl::pageSizeAndMarginsInPixels(browser->mainFrame(), pageNumber, width, height, marginTop, marginRight, marginBottom, marginLeft);
148
149     if (pageSizeAndMargins.isEmpty())
150         return 0;
151
152     JSRetainPtr<JSStringRef> returnValue(Adopt, JSStringCreateWithUTF8CString(pageSizeAndMargins.utf8().data()));
153     return returnValue;
154 }
155
156 size_t LayoutTestController::webHistoryItemCount()
157 {
158     const Ewk_History* history = ewk_view_history_get(browser->mainView());
159     if (!history)
160         return -1;
161
162     return ewk_history_back_list_length(history) + ewk_history_forward_list_length(history);
163 }
164
165 unsigned LayoutTestController::workerThreadCount() const
166 {
167     return DumpRenderTreeSupportEfl::workerThreadCount();
168 }
169
170 void LayoutTestController::notifyDone()
171 {
172     if (m_waitToDump && !topLoadingFrame && !WorkQueue::shared()->count())
173         dump();
174     m_waitToDump = false;
175     waitForPolicy = false;
176 }
177
178 JSStringRef LayoutTestController::pathToLocalResource(JSContextRef context, JSStringRef url)
179 {
180     // Function introduced in r28690. This may need special-casing on Windows.
181     return JSStringRetain(url); // Do nothing on Unix.
182 }
183
184 void LayoutTestController::queueLoad(JSStringRef url, JSStringRef target)
185 {
186     WebCore::KURL baseURL(WebCore::KURL(), String::fromUTF8(ewk_frame_uri_get(browser->mainFrame())));
187     WebCore::KURL absoluteURL(baseURL, WTF::String(url->characters(), url->length()));
188
189     JSRetainPtr<JSStringRef> jsAbsoluteURL(
190         Adopt, JSStringCreateWithUTF8CString(absoluteURL.string().utf8().data()));
191
192     WorkQueue::shared()->queue(new LoadItem(jsAbsoluteURL.get(), target));
193 }
194
195 void LayoutTestController::setAcceptsEditing(bool acceptsEditing)
196 {
197     ewk_view_editable_set(browser->mainView(), acceptsEditing);
198 }
199
200 void LayoutTestController::setAlwaysAcceptCookies(bool alwaysAcceptCookies)
201 {
202     ewk_cookies_policy_set(alwaysAcceptCookies ? EWK_COOKIE_JAR_ACCEPT_ALWAYS : EWK_COOKIE_JAR_ACCEPT_NEVER);
203 }
204
205 void LayoutTestController::setCustomPolicyDelegate(bool, bool)
206 {
207     notImplemented();
208 }
209
210 void LayoutTestController::waitForPolicyDelegate()
211 {
212     waitForPolicy = true;
213     setWaitToDump(true);
214 }
215
216 void LayoutTestController::setScrollbarPolicy(JSStringRef, JSStringRef)
217 {
218     notImplemented();
219 }
220
221 void LayoutTestController::addOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef protocol, JSStringRef host, bool includeSubdomains)
222 {
223     WebCore::KURL kurl;
224     kurl.setProtocol(String(protocol->characters(), protocol->length()));
225     kurl.setHost(String(host->characters(), host->length()));
226
227     ewk_security_policy_whitelist_origin_add(sourceOrigin->ustring().utf8().data(), kurl.string().utf8().data(), includeSubdomains);
228 }
229
230 void LayoutTestController::removeOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef protocol, JSStringRef host, bool includeSubdomains)
231 {
232     WebCore::KURL kurl;
233     kurl.setProtocol(String(protocol->characters(), protocol->length()));
234     kurl.setHost(String(host->characters(), host->length()));
235
236     ewk_security_policy_whitelist_origin_del(sourceOrigin->ustring().utf8().data(), kurl.string().utf8().data(), includeSubdomains);
237 }
238
239 void LayoutTestController::setMainFrameIsFirstResponder(bool)
240 {
241     notImplemented();
242 }
243
244 void LayoutTestController::setTabKeyCyclesThroughElements(bool)
245 {
246     notImplemented();
247 }
248
249 void LayoutTestController::setUseDashboardCompatibilityMode(bool)
250 {
251     notImplemented();
252 }
253
254 static CString gUserStyleSheet;
255 static bool gUserStyleSheetEnabled = true;
256
257 void LayoutTestController::setUserStyleSheetEnabled(bool flag)
258 {
259     gUserStyleSheetEnabled = flag;
260     ewk_view_setting_user_stylesheet_set(browser->mainView(), flag ? gUserStyleSheet.data() : 0);
261 }
262
263 void LayoutTestController::setUserStyleSheetLocation(JSStringRef path)
264 {
265     gUserStyleSheet = path->ustring().utf8();
266
267     if (gUserStyleSheetEnabled)
268         setUserStyleSheetEnabled(true);
269 }
270
271 void LayoutTestController::setValueForUser(JSContextRef context, JSValueRef nodeObject, JSStringRef value)
272 {
273     DumpRenderTreeSupportEfl::setValueForUser(context, nodeObject, value);
274 }
275
276 void LayoutTestController::setViewModeMediaFeature(JSStringRef mode)
277 {
278     Evas_Object* view = browser->mainView();
279     if (!view)
280         return;
281
282     if (equals(mode, "windowed"))
283         ewk_view_mode_set(view, EWK_VIEW_MODE_WINDOWED);
284     else if (equals(mode, "floating"))
285         ewk_view_mode_set(view, EWK_VIEW_MODE_FLOATING);
286     else if (equals(mode, "fullscreen"))
287         ewk_view_mode_set(view, EWK_VIEW_MODE_FULLSCREEN);
288     else if (equals(mode, "maximized"))
289         ewk_view_mode_set(view, EWK_VIEW_MODE_MAXIMIZED);
290     else if (equals(mode, "minimized"))
291         ewk_view_mode_set(view, EWK_VIEW_MODE_MINIMIZED);
292 }
293
294 void LayoutTestController::setWindowIsKey(bool)
295 {
296     notImplemented();
297 }
298
299 void LayoutTestController::setSmartInsertDeleteEnabled(bool flag)
300 {
301     DumpRenderTreeSupportEfl::setSmartInsertDeleteEnabled(browser->mainView(), flag);
302 }
303
304 static Eina_Bool waitToDumpWatchdogFired(void*)
305 {
306     waitToDumpWatchdog = 0;
307     gLayoutTestController->waitToDumpWatchdogTimerFired();
308     return ECORE_CALLBACK_CANCEL;
309 }
310
311 void LayoutTestController::setWaitToDump(bool waitUntilDone)
312 {
313     static const double timeoutSeconds = 30;
314
315     m_waitToDump = waitUntilDone;
316     if (m_waitToDump && !waitToDumpWatchdog)
317         waitToDumpWatchdog = ecore_timer_add(timeoutSeconds, waitToDumpWatchdogFired, 0);
318 }
319
320 int LayoutTestController::windowCount()
321 {
322     return browser->extraViews().size() + 1; // + 1 for the main view.
323 }
324
325 void LayoutTestController::setPrivateBrowsingEnabled(bool flag)
326 {
327     ewk_view_setting_private_browsing_set(browser->mainView(), flag);
328 }
329
330 void LayoutTestController::setJavaScriptCanAccessClipboard(bool flag)
331 {
332     ewk_view_setting_scripts_can_access_clipboard_set(browser->mainView(), flag);
333 }
334
335 void LayoutTestController::setXSSAuditorEnabled(bool flag)
336 {
337     ewk_view_setting_enable_xss_auditor_set(browser->mainView(), flag);
338 }
339
340 void LayoutTestController::setFrameFlatteningEnabled(bool flag)
341 {
342     ewk_view_setting_enable_frame_flattening_set(browser->mainView(), flag);
343 }
344
345 void LayoutTestController::setSpatialNavigationEnabled(bool flag)
346 {
347     ewk_view_setting_spatial_navigation_set(browser->mainView(), flag);
348 }
349
350 void LayoutTestController::setAllowUniversalAccessFromFileURLs(bool)
351 {
352     notImplemented();
353 }
354
355 void LayoutTestController::setAllowFileAccessFromFileURLs(bool)
356 {
357     notImplemented();
358 }
359
360 void LayoutTestController::setAuthorAndUserStylesEnabled(bool flag)
361 {
362     DumpRenderTreeSupportEfl::setAuthorAndUserStylesEnabled(browser->mainView(), flag);
363 }
364
365 void LayoutTestController::setAutofilled(JSContextRef context, JSValueRef nodeObject, bool autofilled)
366 {
367     DumpRenderTreeSupportEfl::setAutofilled(context, nodeObject, autofilled);
368 }
369
370 void LayoutTestController::disableImageLoading()
371 {
372     ewk_view_setting_auto_load_images_set(browser->mainView(), EINA_FALSE);
373 }
374
375 void LayoutTestController::setMockDeviceOrientation(bool, double, bool, double, bool, double)
376 {
377     // FIXME: Implement for DeviceOrientation layout tests.
378     // See https://bugs.webkit.org/show_bug.cgi?id=30335.
379     notImplemented();
380 }
381
382 void LayoutTestController::setMockGeolocationPosition(double, double, double)
383 {
384     // FIXME: Implement for Geolocation layout tests.
385     // See https://bugs.webkit.org/show_bug.cgi?id=28264.
386     notImplemented();
387 }
388
389 void LayoutTestController::setMockGeolocationError(int, JSStringRef)
390 {
391     // FIXME: Implement for Geolocation layout tests.
392     // See https://bugs.webkit.org/show_bug.cgi?id=28264.
393     notImplemented();
394 }
395
396 void LayoutTestController::setGeolocationPermission(bool allow)
397 {
398     // FIXME: Implement for Geolocation layout tests.
399     setGeolocationPermissionCommon(allow);
400 }
401
402 int LayoutTestController::numberOfPendingGeolocationPermissionRequests()
403 {
404     // FIXME: Implement for Geolocation layout tests.
405     return -1;
406 }
407
408 void LayoutTestController::addMockSpeechInputResult(JSStringRef, double, JSStringRef)
409 {
410     // FIXME: Implement for speech input layout tests.
411     // See https://bugs.webkit.org/show_bug.cgi?id=39485.
412     notImplemented();
413 }
414
415 void LayoutTestController::setMockSpeechInputDumpRect(bool)
416 {
417     // FIXME: Implement for speech input layout tests.
418     // See https://bugs.webkit.org/show_bug.cgi?id=39485.
419     notImplemented();
420 }
421
422 void LayoutTestController::startSpeechInput(JSContextRef inputElement)
423 {
424     // FIXME: Implement for speech input layout tests.
425     // See https://bugs.webkit.org/show_bug.cgi?id=39485.
426     notImplemented();
427 }
428
429 void LayoutTestController::setIconDatabaseEnabled(bool enabled)
430 {
431     ewk_settings_icon_database_path_set(0);
432
433     if (!enabled)
434         return;
435
436     String databasePath;
437     const char* tempDir = getenv("TMPDIR");
438
439     if (tempDir)
440         databasePath = String::fromUTF8(tempDir);
441     else if (tempDir = getenv("TEMP"))
442         databasePath = String::fromUTF8(tempDir);
443     else
444         databasePath = String::fromUTF8("/tmp");
445
446     databasePath.append("/DumpRenderTree/IconDatabase");
447
448     if (ecore_file_mkpath(databasePath.utf8().data()))
449         ewk_settings_icon_database_path_set(databasePath.utf8().data());
450 }
451
452 void LayoutTestController::setJavaScriptProfilingEnabled(bool enabled)
453 {
454     if (enabled)
455         setDeveloperExtrasEnabled(enabled);
456
457     DumpRenderTreeSupportEfl::setJavaScriptProfilingEnabled(browser->mainView(), enabled);
458 }
459
460 void LayoutTestController::setSelectTrailingWhitespaceEnabled(bool flag)
461 {
462     DumpRenderTreeSupportEfl::setSelectTrailingWhitespaceEnabled(browser->mainView(), flag);
463 }
464
465 void LayoutTestController::setPopupBlockingEnabled(bool flag)
466 {
467     ewk_view_setting_scripts_can_open_windows_set(browser->mainView(), !flag);
468 }
469
470 void LayoutTestController::setPluginsEnabled(bool flag)
471 {
472     ewk_view_setting_enable_plugins_set(browser->mainView(), flag);
473 }
474
475 bool LayoutTestController::elementDoesAutoCompleteForElementWithId(JSStringRef id)
476 {
477     const String elementId(id->ustring().impl());
478     const Evas_Object* mainFrame = browser->mainFrame();
479     return DumpRenderTreeSupportEfl::elementDoesAutoCompleteForElementWithId(mainFrame, elementId);
480 }
481
482 void LayoutTestController::execCommand(JSStringRef name, JSStringRef value)
483 {
484     DumpRenderTreeSupportEfl::executeCoreCommandByName(browser->mainView(), name->ustring().utf8().data(), value->ustring().utf8().data());
485 }
486
487 bool LayoutTestController::findString(JSContextRef context, JSStringRef target, JSObjectRef optionsArray)
488 {
489     JSRetainPtr<JSStringRef> lengthPropertyName(Adopt, JSStringCreateWithUTF8CString("length"));
490     JSValueRef lengthValue = JSObjectGetProperty(context, optionsArray, lengthPropertyName.get(), 0);
491     if (!JSValueIsNumber(context, lengthValue))
492         return false;
493
494     WebCore::FindOptions options = 0;
495
496     const size_t length = static_cast<size_t>(JSValueToNumber(context, lengthValue, 0));
497     for (size_t i = 0; i < length; ++i) {
498         JSValueRef value = JSObjectGetPropertyAtIndex(context, optionsArray, i, 0);
499         if (!JSValueIsString(context, value))
500             continue;
501
502         JSRetainPtr<JSStringRef> optionName(Adopt, JSValueToStringCopy(context, value, 0));
503
504         if (equals(optionName, "CaseInsensitive"))
505             options |= WebCore::CaseInsensitive;
506         else if (equals(optionName, "AtWordStarts"))
507             options |= WebCore::AtWordStarts;
508         else if (equals(optionName, "TreatMedialCapitalAsWordStart"))
509             options |= WebCore::TreatMedialCapitalAsWordStart;
510         else if (equals(optionName, "Backwards"))
511             options |= WebCore::Backwards;
512         else if (equals(optionName, "WrapAround"))
513             options |= WebCore::WrapAround;
514         else if (equals(optionName, "StartInSelection"))
515             options |= WebCore::StartInSelection;
516     }
517
518     return DumpRenderTreeSupportEfl::findString(browser->mainView(), target->ustring().utf8().data(), options);
519 }
520
521 bool LayoutTestController::isCommandEnabled(JSStringRef name)
522 {
523     return DumpRenderTreeSupportEfl::isCommandEnabled(browser->mainView(), name->ustring().utf8().data());
524 }
525
526 void LayoutTestController::setCacheModel(int)
527 {
528     notImplemented();
529 }
530
531 void LayoutTestController::setPersistentUserStyleSheetLocation(JSStringRef)
532 {
533     notImplemented();
534 }
535
536 void LayoutTestController::clearPersistentUserStyleSheet()
537 {
538     notImplemented();
539 }
540
541 void LayoutTestController::clearAllApplicationCaches()
542 {
543     ewk_settings_application_cache_clear();
544 }
545
546 void LayoutTestController::setApplicationCacheOriginQuota(unsigned long long)
547 {
548     // FIXME: Implement to support application cache quotas.
549     notImplemented();
550 }
551
552 void LayoutTestController::clearApplicationCacheForOrigin(OpaqueJSString*)
553 {
554     // FIXME: Implement to support deleting all application caches for an origin.
555     notImplemented();
556 }
557
558 long long LayoutTestController::localStorageDiskUsageForOrigin(JSStringRef)
559 {
560     // FIXME: Implement to support getting disk usage in bytes for an origin.
561     notImplemented();
562     return 0;
563 }
564
565 JSValueRef LayoutTestController::originsWithApplicationCache(JSContextRef context)
566 {
567     // FIXME: Implement to get origins that contain application caches.
568     notImplemented();
569     return JSValueMakeUndefined(context);
570 }
571
572 long long LayoutTestController::applicationCacheDiskUsageForOrigin(JSStringRef)
573 {
574     notImplemented();
575     return 0;
576 }
577
578 void LayoutTestController::clearAllDatabases()
579 {
580     ewk_settings_web_database_clear();
581 }
582
583 void LayoutTestController::setDatabaseQuota(unsigned long long quota)
584 {
585     Ewk_Security_Origin* origin = ewk_frame_security_origin_get(browser->mainFrame());
586     ewk_security_origin_web_database_quota_set(origin, quota);
587     ewk_security_origin_free(origin);
588 }
589
590 JSValueRef LayoutTestController::originsWithLocalStorage(JSContextRef context)
591 {
592     notImplemented();
593     return JSValueMakeUndefined(context);
594 }
595
596 void LayoutTestController::deleteAllLocalStorage()
597 {
598     notImplemented();
599 }
600
601 void LayoutTestController::deleteLocalStorageForOrigin(JSStringRef)
602 {
603     notImplemented();
604 }
605
606 void LayoutTestController::observeStorageTrackerNotifications(unsigned)
607 {
608     notImplemented();
609 }
610
611 void LayoutTestController::syncLocalStorage()
612 {
613     notImplemented();
614 }
615
616 void LayoutTestController::setDomainRelaxationForbiddenForURLScheme(bool, JSStringRef)
617 {
618     notImplemented();
619 }
620
621 void LayoutTestController::goBack()
622 {
623     ewk_frame_back(browser->mainFrame());
624 }
625
626 void LayoutTestController::setDefersLoading(bool defers)
627 {
628     DumpRenderTreeSupportEfl::setDefersLoading(browser->mainView(), defers);
629 }
630
631 void LayoutTestController::setAppCacheMaximumSize(unsigned long long size)
632 {
633     ewk_settings_application_cache_max_quota_set(size);
634 }
635
636 bool LayoutTestController::pauseAnimationAtTimeOnElementWithId(JSStringRef animationName, double time, JSStringRef elementId)
637 {
638     return DumpRenderTreeSupportEfl::pauseAnimation(browser->mainFrame(), animationName->ustring().utf8().data(), elementId->ustring().utf8().data(), time);
639 }
640
641 bool LayoutTestController::pauseTransitionAtTimeOnElementWithId(JSStringRef propertyName, double time, JSStringRef elementId)
642 {
643     return DumpRenderTreeSupportEfl::pauseTransition(browser->mainFrame(), propertyName->ustring().utf8().data(), elementId->ustring().utf8().data(), time);
644 }
645
646 unsigned LayoutTestController::numberOfActiveAnimations() const
647 {
648     return DumpRenderTreeSupportEfl::activeAnimationsCount(browser->mainFrame());
649 }
650
651 void LayoutTestController::suspendAnimations() const
652 {
653     DumpRenderTreeSupportEfl::suspendAnimations(browser->mainFrame());
654 }
655
656 void LayoutTestController::resumeAnimations() const
657 {
658     DumpRenderTreeSupportEfl::resumeAnimations(browser->mainFrame());
659 }
660
661 static inline bool toBool(JSStringRef value)
662 {
663     return equals(value, "true") || equals(value, "1");
664 }
665
666 static inline int toInt(JSStringRef value)
667 {
668     return atoi(value->ustring().utf8().data());
669 }
670
671 void LayoutTestController::overridePreference(JSStringRef key, JSStringRef value)
672 {
673     if (equals(key, "WebKitJavaScriptEnabled"))
674         ewk_view_setting_enable_scripts_set(browser->mainView(), toBool(value));
675     else if (equals(key, "WebKitDefaultFontSize"))
676         ewk_view_setting_font_default_size_set(browser->mainView(), toInt(value));
677     else if (equals(key, "WebKitMinimumFontSize"))
678         ewk_view_setting_font_minimum_size_set(browser->mainView(), toInt(value));
679     else if (equals(key, "WebKitPluginsEnabled"))
680         ewk_view_setting_enable_plugins_set(browser->mainView(), toBool(value));
681     else if (equals(key, "WebKitWebGLEnabled"))
682         ewk_view_setting_enable_webgl_set(browser->mainView(), toBool(value));
683     else if (equals(key, "WebKitEnableCaretBrowsing"))
684         ewk_view_setting_caret_browsing_set(browser->mainView(), toBool(value));
685     else if (equals(key, "WebKitUsesPageCachePreferenceKey"))
686         ewk_view_setting_page_cache_set(browser->mainView(), toBool(value));
687     else if (equals(key, "WebKitHyperlinkAuditingEnabled"))
688         ewk_view_setting_enable_hyperlink_auditing_set(browser->mainView(), toBool(value));
689     else if (equals(key, "WebKitTabToLinksPreferenceKey"))
690         ewk_view_setting_include_links_in_focus_chain_set(browser->mainView(), toBool(value));
691     else if (equals(key, "WebKitLoadSiteIconsKey"))
692         DumpRenderTreeSupportEfl::setLoadsSiteIconsIgnoringImageLoadingSetting(browser->mainView(), toBool(value));
693     else
694         fprintf(stderr, "LayoutTestController::overridePreference tried to override unknown preference '%s'.\n", value->ustring().utf8().data());
695 }
696
697 void LayoutTestController::addUserScript(JSStringRef, bool, bool)
698 {
699     notImplemented();
700 }
701
702 void LayoutTestController::addUserStyleSheet(JSStringRef source, bool allFrames)
703 {
704     DumpRenderTreeSupportEfl::addUserStyleSheet(browser->mainView(), source->ustring().utf8().data(), allFrames);
705 }
706
707 void LayoutTestController::setDeveloperExtrasEnabled(bool enabled)
708 {
709     ewk_view_setting_enable_developer_extras_set(browser->mainView(), enabled);
710 }
711
712 void LayoutTestController::setAsynchronousSpellCheckingEnabled(bool)
713 {
714     notImplemented();
715 }
716
717 void LayoutTestController::showWebInspector()
718 {
719     notImplemented();
720 }
721
722 void LayoutTestController::closeWebInspector()
723 {
724     notImplemented();
725 }
726
727 void LayoutTestController::evaluateInWebInspector(long, JSStringRef)
728 {
729     notImplemented();
730 }
731
732 void LayoutTestController::evaluateScriptInIsolatedWorldAndReturnValue(unsigned, JSObjectRef, JSStringRef)
733 {
734     notImplemented();
735 }
736
737 void LayoutTestController::evaluateScriptInIsolatedWorld(unsigned, JSObjectRef, JSStringRef)
738 {
739     notImplemented();
740 }
741
742 void LayoutTestController::removeAllVisitedLinks()
743 {
744     notImplemented();
745 }
746
747 bool LayoutTestController::callShouldCloseOnWebView()
748 {
749     return DumpRenderTreeSupportEfl::callShouldCloseOnWebView(browser->mainFrame());
750 }
751
752 void LayoutTestController::apiTestNewWindowDataLoadBaseURL(JSStringRef, JSStringRef)
753 {
754     notImplemented();
755 }
756
757 void LayoutTestController::apiTestGoToCurrentBackForwardItem()
758 {
759     notImplemented();
760 }
761
762 void LayoutTestController::setWebViewEditable(bool)
763 {
764     ewk_frame_editable_set(browser->mainFrame(), EINA_TRUE);
765 }
766
767 JSRetainPtr<JSStringRef> LayoutTestController::markerTextForListItem(JSContextRef context, JSValueRef nodeObject) const
768 {
769     String markerTextChar = DumpRenderTreeSupportEfl::markerTextForListItem(context, nodeObject);
770     if (markerTextChar.isEmpty())
771         return 0;
772
773     JSRetainPtr<JSStringRef> markerText(Adopt, JSStringCreateWithUTF8CString(markerTextChar.utf8().data()));
774     return markerText;
775 }
776
777 void LayoutTestController::authenticateSession(JSStringRef, JSStringRef, JSStringRef)
778 {
779     notImplemented();
780 }
781
782 void LayoutTestController::setEditingBehavior(const char* editingBehavior)
783 {
784     DumpRenderTreeSupportEfl::setEditingBehavior(browser->mainView(), editingBehavior);
785 }
786
787 void LayoutTestController::abortModal()
788 {
789     notImplemented();
790 }
791
792 void LayoutTestController::dumpConfigurationForViewport(int deviceDPI, int deviceWidth, int deviceHeight, int availableWidth, int availableHeight)
793 {
794     DumpRenderTreeSupportEfl::dumpConfigurationForViewport(browser->mainView(),
795             deviceDPI,
796             WebCore::IntSize(deviceWidth, deviceHeight),
797             WebCore::IntSize(availableWidth, availableHeight));
798 }
799
800 void LayoutTestController::setSerializeHTTPLoads(bool)
801 {
802     // FIXME: Implement if needed for https://bugs.webkit.org/show_bug.cgi?id=50758.
803     notImplemented();
804 }
805
806 void LayoutTestController::setMinimumTimerInterval(double minimumTimerInterval)
807 {
808     ewk_view_setting_minimum_timer_interval_set(browser->mainView(), minimumTimerInterval);
809 }
810
811 void LayoutTestController::setTextDirection(JSStringRef)
812 {
813     notImplemented();
814 }
815
816 void LayoutTestController::allowRoundingHacks()
817 {
818     notImplemented();
819 }
820
821 void LayoutTestController::addChromeInputField()
822 {
823     notImplemented();
824 }
825
826 void LayoutTestController::removeChromeInputField()
827 {
828     notImplemented();
829 }
830
831 void LayoutTestController::focusWebView()
832 {
833     notImplemented();
834 }
835
836 void LayoutTestController::setBackingScaleFactor(double)
837 {
838     notImplemented();
839 }
840
841 void LayoutTestController::simulateDesktopNotificationClick(JSStringRef title)
842 {
843 }
844
845 void LayoutTestController::resetPageVisibility()
846 {
847     ewk_view_visibility_state_set(browser->mainView(), EWK_PAGE_VISIBILITY_STATE_VISIBLE, true);
848 }
849
850 void LayoutTestController::setPageVisibility(const char* visibility)
851 {
852     String newVisibility(visibility);
853     if (newVisibility == "visible")
854         ewk_view_visibility_state_set(browser->mainView(), EWK_PAGE_VISIBILITY_STATE_VISIBLE, false);
855     else if (newVisibility == "hidden")
856         ewk_view_visibility_state_set(browser->mainView(), EWK_PAGE_VISIBILITY_STATE_HIDDEN, false);
857     else if (newVisibility == "prerender")
858         ewk_view_visibility_state_set(browser->mainView(), EWK_PAGE_VISIBILITY_STATE_PRERENDER, false);
859 }