Source/WebCore: Add API functions to enable starting and stopping speech input,
[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 "JSStringUtils.h"
41 #include "NotImplemented.h"
42 #include "OwnFastMallocPtr.h"
43 #include "WorkQueue.h"
44 #include "WorkQueueItem.h"
45 #include "ewk_private.h"
46 #include <EWebKit.h>
47 #include <JavaScriptCore/JSRetainPtr.h>
48 #include <JavaScriptCore/JSStringRef.h>
49 #include <JavaScriptCore/OpaqueJSString.h>
50 #include <JavaScriptCore/wtf/text/WTFString.h>
51 #include <stdio.h>
52
53 LayoutTestController::~LayoutTestController()
54 {
55 }
56
57 void LayoutTestController::addDisallowedURL(JSStringRef)
58 {
59     notImplemented();
60 }
61
62 void LayoutTestController::clearBackForwardList()
63 {
64     notImplemented();
65 }
66
67 JSStringRef LayoutTestController::copyDecodedHostName(JSStringRef)
68 {
69     notImplemented();
70     return 0;
71 }
72
73 JSStringRef LayoutTestController::copyEncodedHostName(JSStringRef)
74 {
75     notImplemented();
76     return 0;
77 }
78
79 void LayoutTestController::dispatchPendingLoadRequests()
80 {
81     // FIXME: Implement for testing fix for 6727495
82     notImplemented();
83 }
84
85 void LayoutTestController::display()
86 {
87     displayWebView();
88 }
89
90 JSRetainPtr<JSStringRef> LayoutTestController::counterValueForElementById(JSStringRef id)
91 {
92     OwnFastMallocPtr<char> counterValue(ewk_frame_counter_value_by_element_id_get(mainFrame, id->ustring().utf8().data()));
93     return JSRetainPtr<JSStringRef>(Adopt, JSStringCreateWithUTF8CString(counterValue.get()));
94 }
95
96 void LayoutTestController::keepWebHistory()
97 {
98     notImplemented();
99 }
100
101 JSValueRef LayoutTestController::computedStyleIncludingVisitedInfo(JSContextRef context, JSValueRef)
102 {
103     notImplemented();
104     return JSValueMakeUndefined(context);
105 }
106
107 JSValueRef LayoutTestController::nodesFromRect(JSContextRef context, JSValueRef, int, int, unsigned, unsigned, unsigned, unsigned, bool)
108 {
109     notImplemented();
110     return JSValueMakeUndefined(context);
111 }
112
113 JSRetainPtr<JSStringRef> LayoutTestController::layerTreeAsText() const
114 {
115     notImplemented();
116     return JSRetainPtr<JSStringRef>(Adopt, JSStringCreateWithUTF8CString(""));
117 }
118
119 int LayoutTestController::pageNumberForElementById(JSStringRef id, float pageWidth, float pageHeight)
120 {
121     return ewk_frame_page_number_by_element_id_get(mainFrame, id->ustring().utf8().data(), pageWidth, pageHeight);
122 }
123
124 int LayoutTestController::numberOfPages(float pageWidth, float pageHeight)
125 {
126     return ewk_frame_page_number_get(mainFrame, pageWidth, pageHeight);
127 }
128
129 JSRetainPtr<JSStringRef> LayoutTestController::pageProperty(const char*, int) const
130 {
131     notImplemented();
132     return 0;
133 }
134
135 bool LayoutTestController::isPageBoxVisible(int) const
136 {
137     notImplemented();
138     return false;
139 }
140
141 JSRetainPtr<JSStringRef> LayoutTestController::pageSizeAndMarginsInPixels(int, int, int, int, int, int, int) const
142 {
143     notImplemented();
144     return 0;
145 }
146
147 size_t LayoutTestController::webHistoryItemCount()
148 {
149     const Ewk_History* history = ewk_view_history_get(browser);
150     if (!history)
151         return -1;
152
153     return ewk_history_back_list_length(history) + ewk_history_forward_list_length(history);
154 }
155
156 unsigned LayoutTestController::workerThreadCount() const
157 {
158     return ewk_util_worker_thread_count();
159 }
160
161 void LayoutTestController::notifyDone()
162 {
163     if (m_waitToDump && !topLoadingFrame && !WorkQueue::shared()->count())
164         dump();
165     m_waitToDump = false;
166     waitForPolicy = false;
167 }
168
169 JSStringRef LayoutTestController::pathToLocalResource(JSContextRef context, JSStringRef url)
170 {
171     // Function introduced in r28690. This may need special-casing on Windows.
172     return JSStringRetain(url); // Do nothing on Unix.
173 }
174
175 void LayoutTestController::queueLoad(JSStringRef url, JSStringRef target)
176 {
177     String absoluteUrl = String::fromUTF8(ewk_frame_uri_get(mainFrame));
178     absoluteUrl.append(url->characters(), url->length());
179
180     JSRetainPtr<JSStringRef> jsAbsoluteURL(
181         Adopt, JSStringCreateWithUTF8CString(absoluteUrl.utf8().data()));
182
183     WorkQueue::shared()->queue(new LoadItem(jsAbsoluteURL.get(), target));
184 }
185
186 void LayoutTestController::setAcceptsEditing(bool acceptsEditing)
187 {
188     ewk_view_editable_set(browser, acceptsEditing);
189 }
190
191 void LayoutTestController::setAlwaysAcceptCookies(bool alwaysAcceptCookies)
192 {
193     ewk_cookies_policy_set(alwaysAcceptCookies ? EWK_COOKIE_JAR_ACCEPT_ALWAYS : EWK_COOKIE_JAR_ACCEPT_NEVER);
194 }
195
196 void LayoutTestController::setCustomPolicyDelegate(bool, bool)
197 {
198     notImplemented();
199 }
200
201 void LayoutTestController::waitForPolicyDelegate()
202 {
203     waitForPolicy = true;
204     setWaitToDump(true);
205 }
206
207 void LayoutTestController::setScrollbarPolicy(JSStringRef, JSStringRef)
208 {
209     notImplemented();
210 }
211
212 void LayoutTestController::addOriginAccessWhitelistEntry(JSStringRef, JSStringRef, JSStringRef, bool)
213 {
214     notImplemented();
215 }
216
217 void LayoutTestController::removeOriginAccessWhitelistEntry(JSStringRef, JSStringRef, JSStringRef, bool)
218 {
219     notImplemented();
220 }
221
222 void LayoutTestController::setMainFrameIsFirstResponder(bool)
223 {
224     notImplemented();
225 }
226
227 void LayoutTestController::setTabKeyCyclesThroughElements(bool)
228 {
229     notImplemented();
230 }
231
232 void LayoutTestController::setUseDashboardCompatibilityMode(bool)
233 {
234     notImplemented();
235 }
236
237 static CString gUserStyleSheet;
238 static bool gUserStyleSheetEnabled = true;
239
240 void LayoutTestController::setUserStyleSheetEnabled(bool flag)
241 {
242     gUserStyleSheetEnabled = flag;
243     ewk_view_setting_user_stylesheet_set(browser, flag ? gUserStyleSheet.data() : 0);
244 }
245
246 void LayoutTestController::setUserStyleSheetLocation(JSStringRef path)
247 {
248     gUserStyleSheet = path->ustring().utf8();
249
250     if (gUserStyleSheetEnabled)
251         setUserStyleSheetEnabled(true);
252 }
253
254 void LayoutTestController::setValueForUser(JSContextRef, JSValueRef, JSStringRef)
255 {
256     notImplemented();
257 }
258
259 void LayoutTestController::setViewModeMediaFeature(JSStringRef)
260 {
261     notImplemented();
262 }
263
264 void LayoutTestController::setWindowIsKey(bool)
265 {
266     notImplemented();
267 }
268
269 void LayoutTestController::setSmartInsertDeleteEnabled(bool)
270 {
271     notImplemented();
272 }
273
274 static Eina_Bool waitToDumpWatchdogFired(void*)
275 {
276     waitToDumpWatchdog = 0;
277     gLayoutTestController->waitToDumpWatchdogTimerFired();
278     return ECORE_CALLBACK_CANCEL;
279 }
280
281 void LayoutTestController::setWaitToDump(bool waitUntilDone)
282 {
283     static const double timeoutSeconds = 30;
284
285     m_waitToDump = waitUntilDone;
286     if (m_waitToDump && !waitToDumpWatchdog)
287         waitToDumpWatchdog = ecore_timer_add(timeoutSeconds, waitToDumpWatchdogFired, 0);
288 }
289
290 int LayoutTestController::windowCount()
291 {
292     return 1;
293 }
294
295 void LayoutTestController::setPrivateBrowsingEnabled(bool flag)
296 {
297     ewk_view_setting_private_browsing_set(browser, flag);
298 }
299
300 void LayoutTestController::setJavaScriptCanAccessClipboard(bool)
301 {
302     notImplemented();
303 }
304
305 void LayoutTestController::setXSSAuditorEnabled(bool)
306 {
307     notImplemented();
308 }
309
310 void LayoutTestController::setFrameFlatteningEnabled(bool flag)
311 {
312     ewk_view_setting_enable_frame_flattening_set(browser, flag);
313 }
314
315 void LayoutTestController::setSpatialNavigationEnabled(bool flag)
316 {
317     ewk_view_setting_spatial_navigation_set(browser, flag);
318 }
319
320 void LayoutTestController::setAllowUniversalAccessFromFileURLs(bool)
321 {
322     notImplemented();
323 }
324
325 void LayoutTestController::setAllowFileAccessFromFileURLs(bool)
326 {
327     notImplemented();
328 }
329
330 void LayoutTestController::setAuthorAndUserStylesEnabled(bool)
331 {
332     notImplemented();
333 }
334
335 void LayoutTestController::setAutofilled(JSContextRef, JSValueRef, bool)
336 {
337     notImplemented();
338 }
339
340 void LayoutTestController::disableImageLoading()
341 {
342     // FIXME: Implement for testing fix for https://bugs.webkit.org/show_bug.cgi?id=27896
343     // Also need to make sure image loading is re-enabled for each new test.
344     notImplemented();
345 }
346
347 void LayoutTestController::setMockDeviceOrientation(bool, double, bool, double, bool, double)
348 {
349     // FIXME: Implement for DeviceOrientation layout tests.
350     // See https://bugs.webkit.org/show_bug.cgi?id=30335.
351     notImplemented();
352 }
353
354 void LayoutTestController::setMockGeolocationPosition(double, double, double)
355 {
356     // FIXME: Implement for Geolocation layout tests.
357     // See https://bugs.webkit.org/show_bug.cgi?id=28264.
358     notImplemented();
359 }
360
361 void LayoutTestController::setMockGeolocationError(int, JSStringRef)
362 {
363     // FIXME: Implement for Geolocation layout tests.
364     // See https://bugs.webkit.org/show_bug.cgi?id=28264.
365     notImplemented();
366 }
367
368 void LayoutTestController::setGeolocationPermission(bool allow)
369 {
370     // FIXME: Implement for Geolocation layout tests.
371     setGeolocationPermissionCommon(allow);
372 }
373
374 int LayoutTestController::numberOfPendingGeolocationPermissionRequests()
375 {
376     // FIXME: Implement for Geolocation layout tests.
377     return -1;
378 }
379
380 void LayoutTestController::addMockSpeechInputResult(JSStringRef, double, JSStringRef)
381 {
382     // FIXME: Implement for speech input layout tests.
383     // See https://bugs.webkit.org/show_bug.cgi?id=39485.
384     notImplemented();
385 }
386
387 void LayoutTestController::startSpeechInput(JSContextRef inputElement)
388 {
389     // FIXME: Implement for speech input layout tests.
390     // See https://bugs.webkit.org/show_bug.cgi?id=39485.
391     notImplemented();
392 }
393
394 void LayoutTestController::setIconDatabaseEnabled(bool enabled)
395 {
396     if (!enabled) {
397         ewk_settings_icon_database_path_set(0);
398         return;
399     }
400
401     String databasePath;
402
403     if (getenv("TMPDIR"))
404         databasePath = String::fromUTF8(getenv("TMPDIR"));
405     else if (getenv("TEMP"))
406         databasePath = String::fromUTF8(getenv("TEMP"));
407     else
408         databasePath = String::fromUTF8("/tmp");
409
410     databasePath.append("/DumpRenderTree/IconDatabase");
411
412     ewk_settings_icon_database_path_set(databasePath.utf8().data());
413 }
414
415 void LayoutTestController::setJavaScriptProfilingEnabled(bool)
416 {
417     notImplemented();
418 }
419
420 void LayoutTestController::setSelectTrailingWhitespaceEnabled(bool)
421 {
422     notImplemented();
423 }
424
425 void LayoutTestController::setPopupBlockingEnabled(bool)
426 {
427     notImplemented();
428 }
429
430 void LayoutTestController::setPluginsEnabled(bool flag)
431 {
432     ewk_view_setting_enable_plugins_set(browser, flag);
433 }
434
435 bool LayoutTestController::elementDoesAutoCompleteForElementWithId(JSStringRef)
436 {
437     notImplemented();
438     return false;
439 }
440
441 void LayoutTestController::execCommand(JSStringRef, JSStringRef)
442 {
443     notImplemented();
444 }
445
446 bool LayoutTestController::findString(JSContextRef context, JSStringRef target, JSObjectRef optionsArray)
447 {
448     JSRetainPtr<JSStringRef> lengthPropertyName(Adopt, JSStringCreateWithUTF8CString("length"));
449     JSValueRef lengthValue = JSObjectGetProperty(context, optionsArray, lengthPropertyName.get(), 0);
450     if (!JSValueIsNumber(context, lengthValue))
451         return false;
452
453     bool caseSensitive = true;
454     bool forward = true;
455     bool wrap = false;
456     size_t length = static_cast<size_t>(JSValueToNumber(context, lengthValue, 0));
457     for (size_t i = 0; i < length; ++i) {
458         JSValueRef value = JSObjectGetPropertyAtIndex(context, optionsArray, i, 0);
459         if (!JSValueIsString(context, value))
460             continue;
461
462         JSRetainPtr<JSStringRef> optionName(Adopt, JSValueToStringCopy(context, value, 0));
463
464         if (equals(optionName, "CaseInsensitive"))
465             caseSensitive = false;
466         else if (equals(optionName, "Backwards"))
467             forward = false;
468         else if (equals(optionName, "WrapAround"))
469             wrap = true;
470     }
471
472     return !!ewk_view_text_search(browser, target->ustring().utf8().data(), caseSensitive, forward, wrap);
473 }
474
475 bool LayoutTestController::isCommandEnabled(JSStringRef name)
476 {
477     return false;
478 }
479
480 void LayoutTestController::setCacheModel(int)
481 {
482     notImplemented();
483 }
484
485 void LayoutTestController::setPersistentUserStyleSheetLocation(JSStringRef)
486 {
487     notImplemented();
488 }
489
490 void LayoutTestController::clearPersistentUserStyleSheet()
491 {
492     notImplemented();
493 }
494
495 void LayoutTestController::clearAllApplicationCaches()
496 {
497     // FIXME: Implement to support application cache quotas.
498     notImplemented();
499 }
500
501 void LayoutTestController::setApplicationCacheOriginQuota(unsigned long long)
502 {
503     // FIXME: Implement to support application cache quotas.
504     notImplemented();
505 }
506
507 void LayoutTestController::clearApplicationCacheForOrigin(OpaqueJSString*)
508 {
509     // FIXME: Implement to support deleting all application caches for an origin.
510     notImplemented();
511 }
512
513 long long LayoutTestController::localStorageDiskUsageForOrigin(JSStringRef)
514 {
515     // FIXME: Implement to support getting disk usage in bytes for an origin.
516     notImplemented();
517     return 0;
518 }
519
520 JSValueRef LayoutTestController::originsWithApplicationCache(JSContextRef context)
521 {
522     // FIXME: Implement to get origins that contain application caches.
523     notImplemented();
524     return JSValueMakeUndefined(context);
525 }
526
527 long long LayoutTestController::applicationCacheDiskUsageForOrigin(JSStringRef)
528 {
529     notImplemented();
530     return 0;
531 }
532
533 void LayoutTestController::clearAllDatabases()
534 {
535     notImplemented();
536 }
537
538 void LayoutTestController::setDatabaseQuota(unsigned long long)
539 {
540     notImplemented();
541 }
542
543 JSValueRef LayoutTestController::originsWithLocalStorage(JSContextRef context)
544 {
545     notImplemented();
546     return JSValueMakeUndefined(context);
547 }
548
549 void LayoutTestController::deleteAllLocalStorage()
550 {
551     notImplemented();
552 }
553
554 void LayoutTestController::deleteLocalStorageForOrigin(JSStringRef)
555 {
556     notImplemented();
557 }
558
559 void LayoutTestController::observeStorageTrackerNotifications(unsigned)
560 {
561     notImplemented();
562 }
563
564 void LayoutTestController::syncLocalStorage()
565 {
566     notImplemented();
567 }
568
569 void LayoutTestController::setDomainRelaxationForbiddenForURLScheme(bool, JSStringRef)
570 {
571     notImplemented();
572 }
573
574 void LayoutTestController::goBack()
575 {
576     // FIXME: implement to enable loader/navigation-while-deferring-loads.html
577     notImplemented();
578 }
579
580 void LayoutTestController::setDefersLoading(bool)
581 {
582     // FIXME: implement to enable loader/navigation-while-deferring-loads.html
583     notImplemented();
584 }
585
586 void LayoutTestController::setAppCacheMaximumSize(unsigned long long size)
587 {
588     ewk_settings_cache_capacity_set(size);
589 }
590
591 bool LayoutTestController::pauseAnimationAtTimeOnElementWithId(JSStringRef animationName, double time, JSStringRef elementId)
592 {
593     return ewk_frame_animation_pause(mainFrame, animationName->ustring().utf8().data(), elementId->ustring().utf8().data(), time);
594 }
595
596 bool LayoutTestController::pauseTransitionAtTimeOnElementWithId(JSStringRef propertyName, double time, JSStringRef elementId)
597 {
598     return ewk_frame_transition_pause(mainFrame, propertyName->ustring().utf8().data(), elementId->ustring().utf8().data(), time);
599 }
600
601 bool LayoutTestController::sampleSVGAnimationForElementAtTime(JSStringRef animationId, double time, JSStringRef elementId)
602 {
603     return ewk_frame_svg_animation_pause(mainFrame, animationId->ustring().utf8().data(), elementId->ustring().utf8().data(), time);
604 }
605
606 unsigned LayoutTestController::numberOfActiveAnimations() const
607 {
608     return ewk_frame_animation_active_number_get(mainFrame);
609 }
610
611 void LayoutTestController::suspendAnimations() const
612 {
613     ewk_frame_animation_suspend(mainFrame);
614 }
615
616 void LayoutTestController::resumeAnimations() const
617 {
618     ewk_frame_animation_resume(mainFrame);
619 }
620
621 void LayoutTestController::overridePreference(JSStringRef, JSStringRef)
622 {
623     notImplemented();
624 }
625
626 void LayoutTestController::addUserScript(JSStringRef, bool, bool)
627 {
628     notImplemented();
629 }
630
631 void LayoutTestController::addUserStyleSheet(JSStringRef, bool)
632 {
633     // FIXME: needs more investigation why userscripts/user-style-top-frame-only.html fails when allFrames is false.
634     notImplemented();
635 }
636
637 void LayoutTestController::setDeveloperExtrasEnabled(bool enabled)
638 {
639     ewk_view_setting_enable_developer_extras_set(browser, enabled);
640 }
641
642 void LayoutTestController::setAsynchronousSpellCheckingEnabled(bool)
643 {
644     notImplemented();
645 }
646
647 void LayoutTestController::showWebInspector()
648 {
649     notImplemented();
650 }
651
652 void LayoutTestController::closeWebInspector()
653 {
654     notImplemented();
655 }
656
657 void LayoutTestController::evaluateInWebInspector(long, JSStringRef)
658 {
659     notImplemented();
660 }
661
662 void LayoutTestController::evaluateScriptInIsolatedWorld(unsigned, JSObjectRef, JSStringRef)
663 {
664     notImplemented();
665 }
666
667 void LayoutTestController::removeAllVisitedLinks()
668 {
669     notImplemented();
670 }
671
672 bool LayoutTestController::callShouldCloseOnWebView()
673 {
674     notImplemented();
675     return false;
676 }
677
678 void LayoutTestController::apiTestNewWindowDataLoadBaseURL(JSStringRef, JSStringRef)
679 {
680     notImplemented();
681 }
682
683 void LayoutTestController::apiTestGoToCurrentBackForwardItem()
684 {
685     notImplemented();
686 }
687
688 void LayoutTestController::setWebViewEditable(bool)
689 {
690     ewk_frame_editable_set(mainFrame, EINA_TRUE);
691 }
692
693 JSRetainPtr<JSStringRef> LayoutTestController::markerTextForListItem(JSContextRef, JSValueRef) const
694 {
695     notImplemented();
696     return 0;
697 }
698
699 void LayoutTestController::authenticateSession(JSStringRef, JSStringRef, JSStringRef)
700 {
701     notImplemented();
702 }
703
704 void LayoutTestController::setEditingBehavior(const char*)
705 {
706     notImplemented();
707 }
708
709 void LayoutTestController::abortModal()
710 {
711     notImplemented();
712 }
713
714 bool LayoutTestController::hasSpellingMarker(int, int)
715 {
716     notImplemented();
717     return false;
718 }
719
720 bool LayoutTestController::hasGrammarMarker(int, int)
721 {
722     notImplemented();
723     return false;
724 }
725
726 void LayoutTestController::dumpConfigurationForViewport(int, int, int, int, int)
727 {
728     notImplemented();
729 }
730
731 void LayoutTestController::setSerializeHTTPLoads(bool)
732 {
733     // FIXME: Implement if needed for https://bugs.webkit.org/show_bug.cgi?id=50758.
734     notImplemented();
735 }
736
737 void LayoutTestController::setMinimumTimerInterval(double)
738 {
739     notImplemented();
740 }
741
742 void LayoutTestController::setTextDirection(JSStringRef)
743 {
744     notImplemented();
745 }
746
747 void LayoutTestController::allowRoundingHacks()
748 {
749     notImplemented();
750 }