[EFL][DRT] Implement TextInputController.
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 9 May 2012 01:32:43 +0000 (01:32 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 9 May 2012 01:32:43 +0000 (01:32 +0000)
https://bugs.webkit.org/show_bug.cgi?id=78559

Patch by Kangil Han <kangil.han@samsung.com> on 2012-05-08
Reviewed by Martin Robinson.

TextInputController has been created for an input emulation purpose in DRT.
However, not like other ports, EFL doesn't have it.
Therefore, this patch will enable EFL port to have an input emulation in DRT.

Source/WebKit/efl:

* WebCoreSupport/DumpRenderTreeSupportEfl.cpp:
(DumpRenderTreeSupportEfl::setComposition):
(DumpRenderTreeSupportEfl::hasComposition):
(DumpRenderTreeSupportEfl::compositionRange):
(DumpRenderTreeSupportEfl::confirmComposition):
(DumpRenderTreeSupportEfl::firstRectForCharacterRange):
(DumpRenderTreeSupportEfl::selectedRange):
* WebCoreSupport/DumpRenderTreeSupportEfl.h:

Tools:

* DumpRenderTree/efl/CMakeLists.txt:
* DumpRenderTree/efl/DumpRenderTreeChrome.cpp:
(DumpRenderTreeChrome::onWindowObjectCleared):
* DumpRenderTree/efl/TextInputController.cpp: Added.
(setMarkedTextCallback):
(hasMarkedTextCallback):
(markedRangeCallback):
(insertTextCallback):
(unmarkTextCallback):
(firstRectForCharacterRangeCallback):
(selectedRangeCallback):
(makeTextInputController):
* DumpRenderTree/efl/TextInputController.h: Added.

LayoutTests:

* platform/efl/Skipped:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@116475 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/platform/efl/Skipped
Source/WebKit/efl/ChangeLog
Source/WebKit/efl/WebCoreSupport/DumpRenderTreeSupportEfl.cpp
Source/WebKit/efl/WebCoreSupport/DumpRenderTreeSupportEfl.h
Tools/ChangeLog
Tools/DumpRenderTree/efl/CMakeLists.txt
Tools/DumpRenderTree/efl/DumpRenderTreeChrome.cpp
Tools/DumpRenderTree/efl/TextInputController.cpp [new file with mode: 0644]
Tools/DumpRenderTree/efl/TextInputController.h [new file with mode: 0644]

index 0876121..f8cd223 100644 (file)
@@ -1,3 +1,16 @@
+2012-05-08  Kangil Han  <kangil.han@samsung.com>
+
+        [EFL][DRT] Implement TextInputController.
+        https://bugs.webkit.org/show_bug.cgi?id=78559
+
+        Reviewed by Martin Robinson.
+
+        TextInputController has been created for an input emulation purpose in DRT.
+        However, not like other ports, EFL doesn't have it.
+        Therefore, this patch will enable EFL port to have an input emulation in DRT.
+
+        * platform/efl/Skipped:
+
 2012-05-08  Jon Lee  <jonlee@apple.com>
 
         Safari warns that it needs to resend the form in an iFrame when going back
index 1e54431..0f5897c 100644 (file)
@@ -209,26 +209,18 @@ fast/loader/form-submission-after-beforeunload-cancel.html
 # EFL's DRT needs a PlainTextController implementation
 editing/text-iterator/basic-iteration.html
 
-# EFL's DRT needs a TextInputController
-editing/input/ime-composition-clearpreedit.html
+# EFL's DRT key down bug
+# https://bugs.webkit.org/show_bug.cgi?id=84710
 editing/input/password-echo-passnode.html
 editing/input/password-echo-passnode2.html
-editing/input/password-echo-passnode3.html
-editing/input/password-echo-textnode.html
+
+# EFL's editor doesn't cancel composition as change of value
+# https://bugs.webkit.org/show_bug.cgi?id=85122
 editing/input/setting-input-value-cancel-ime-composition.html
-editing/inserting/caret-position.html
-editing/inserting/insert-composition-whitespace.html
-editing/selection/5825350-1.html
-editing/selection/5825350-2.html
-editing/selection/mixed-editability-10.html
-editing/selection/move-left-right.html
-fast/dom/tab-in-right-alignment.html
-fast/events/ime-composition-events-001.html
+
+# EFL's textarea and textfield doesn't handle whitespace style
+# https://bugs.webkit.org/show_bug.cgi?id=85123
 fast/forms/cursor-at-editable-content-boundary.html
-fast/forms/input-maxlength-ime-completed.html
-fast/forms/input-maxlength-ime-preedit.html
-fast/text/international/thai-cursor-position.html
-svg/text/caret-in-svg-text.xhtml
 
 # EFL's LayoutTestController does not implement setMediaType
 fast/media/print-restores-previous-mediatype.html
@@ -1794,6 +1786,8 @@ transitions/default-timing-function.html
 transitions/move-after-transition.html
 transitions/svg-text-shadow-transition.html
 transitions/svg-transitions.html
+fast/dom/Window/window-properties.html
+fast/dom/prototype-inheritance-2.html
 
 # EFL DRT doesn't fully support http tests yet. These tests make timeout error.
 editing/input/reveal-contenteditable-on-input-vertically.html
index 71acbc6..776715b 100644 (file)
@@ -1,3 +1,23 @@
+2012-05-08  Kangil Han  <kangil.han@samsung.com>
+
+        [EFL][DRT] Implement TextInputController.
+        https://bugs.webkit.org/show_bug.cgi?id=78559
+
+        Reviewed by Martin Robinson.
+
+        TextInputController has been created for an input emulation purpose in DRT.
+        However, not like other ports, EFL doesn't have it.
+        Therefore, this patch will enable EFL port to have an input emulation in DRT.
+
+        * WebCoreSupport/DumpRenderTreeSupportEfl.cpp:
+        (DumpRenderTreeSupportEfl::setComposition):
+        (DumpRenderTreeSupportEfl::hasComposition):
+        (DumpRenderTreeSupportEfl::compositionRange):
+        (DumpRenderTreeSupportEfl::confirmComposition):
+        (DumpRenderTreeSupportEfl::firstRectForCharacterRange):
+        (DumpRenderTreeSupportEfl::selectedRange):
+        * WebCoreSupport/DumpRenderTreeSupportEfl.h:
+
 2012-04-23  Raphael Kubo da Costa  <rakuco@webkit.org>
 
         [EFL] Pass a WTF::String directly from DRT to ewebkit when possible
index 967c2bb..6b166dc 100644 (file)
@@ -43,6 +43,7 @@
 #include <PrintContext.h>
 #include <RenderTreeAsText.h>
 #include <Settings.h>
+#include <TextIterator.h>
 #include <WebKitMutationObserver.h>
 #include <bindings/js/GCController.h>
 #include <history/HistoryItem.h>
@@ -615,3 +616,117 @@ void DumpRenderTreeSupportEfl::setAuthorAndUserStylesEnabled(Evas_Object* ewkVie
 
     corePage->settings()->setAuthorAndUserStylesEnabled(enabled);
 }
+
+void DumpRenderTreeSupportEfl::setComposition(Evas_Object* ewkView, const char* text, int start, int length)
+{
+    WebCore::Page* page = EWKPrivate::corePage(ewkView);
+    if (!page || !page->focusController() || !page->focusController()->focusedOrMainFrame())
+        return;
+
+    WebCore::Editor* editor = page->focusController()->focusedOrMainFrame()->editor();
+    if (!editor || (!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)
+{
+    const WebCore::Page* page = EWKPrivate::corePage(ewkView);
+    if (!page || !page->focusController() || !page->focusController()->focusedOrMainFrame())
+        return false;
+
+    const WebCore::Editor* editor = page->focusController()->focusedOrMainFrame()->editor();
+    if (!editor)
+        return false;
+
+    return editor->hasComposition();
+}
+
+bool DumpRenderTreeSupportEfl::compositionRange(Evas_Object* ewkView, int* start, int* length)
+{
+    *start = *length = 0;
+
+    WebCore::Page* page = EWKPrivate::corePage(ewkView);
+    if (!page || !page->focusController() || !page->focusController()->focusedOrMainFrame())
+        return false;
+
+    WebCore::Editor* editor = page->focusController()->focusedOrMainFrame()->editor();
+    if (!editor || !editor->hasComposition())
+        return false;
+
+    *start = editor->compositionStart();
+    *length = editor->compositionEnd() - *start;
+    return true;
+}
+
+void DumpRenderTreeSupportEfl::confirmComposition(Evas_Object* ewkView, const char* text)
+{
+    WebCore::Page* page = EWKPrivate::corePage(ewkView);
+    if (!page || !page->focusController() || !page->focusController()->focusedOrMainFrame())
+        return;
+
+    WebCore::Editor* editor = page->focusController()->focusedOrMainFrame()->editor();
+    if (!editor)
+        return;
+
+    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)
+{
+    WebCore::Page* page = EWKPrivate::corePage(ewkView);
+    if (!page || !page->focusController() || !page->focusController()->focusedOrMainFrame() || !page->focusController()->focusedOrMainFrame()->editor())
+        return WebCore::IntRect();
+
+    if ((location + length < location) && (location + length))
+        length = 0;
+
+    WebCore::Frame* frame = page->focusController()->focusedOrMainFrame();
+    WebCore::Editor* editor = frame->editor();
+
+    RefPtr<WebCore::Range> range = WebCore::TextIterator::rangeFromLocationAndLength(frame->selection()->rootEditableElementOrDocumentElement(), location, length);
+    if (!range)
+        return WebCore::IntRect();
+
+    return editor->firstRectForRange(range.get());
+}
+
+bool DumpRenderTreeSupportEfl::selectedRange(Evas_Object* ewkView, int* start, int* length)
+{
+    if (!(start && length))
+        return false;
+
+    WebCore::Page* page = EWKPrivate::corePage(ewkView);
+    if (!page || !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;
+}
index ef6ce79..89751f1 100644 (file)
@@ -98,6 +98,14 @@ public:
     static void setInteractiveFormValidationEnabled(Evas_Object* ewkView, bool enabled);
     static JSValueRef computedStyleIncludingVisitedInfo(JSContextRef, JSValueRef);
     static void setAuthorAndUserStylesEnabled(Evas_Object* ewkView, bool);
+
+    // TextInputController
+    static void setComposition(Evas_Object*, const char*, int, int);
+    static bool hasComposition(const Evas_Object*);
+    static bool compositionRange(Evas_Object*, int*, int*);
+    static void confirmComposition(Evas_Object*, const char*);
+    static WebCore::IntRect firstRectForCharacterRange(Evas_Object*, int, int);
+    static bool selectedRange(Evas_Object*, int*, int*);
 };
 
 #endif // DumpRenderTreeSupportEfl_h
index 52d9fab..ae5fbf9 100644 (file)
@@ -1,3 +1,28 @@
+2012-05-08  Kangil Han  <kangil.han@samsung.com>
+
+        [EFL][DRT] Implement TextInputController.
+        https://bugs.webkit.org/show_bug.cgi?id=78559
+
+        Reviewed by Martin Robinson.
+
+        TextInputController has been created for an input emulation purpose in DRT.
+        However, not like other ports, EFL doesn't have it.
+        Therefore, this patch will enable EFL port to have an input emulation in DRT.
+
+        * DumpRenderTree/efl/CMakeLists.txt:
+        * DumpRenderTree/efl/DumpRenderTreeChrome.cpp:
+        (DumpRenderTreeChrome::onWindowObjectCleared):
+        * DumpRenderTree/efl/TextInputController.cpp: Added.
+        (setMarkedTextCallback):
+        (hasMarkedTextCallback):
+        (markedRangeCallback):
+        (insertTextCallback):
+        (unmarkTextCallback):
+        (firstRectForCharacterRangeCallback):
+        (selectedRangeCallback):
+        (makeTextInputController):
+        * DumpRenderTree/efl/TextInputController.h: Added.
+
 2012-04-23  Raphael Kubo da Costa  <rakuco@webkit.org>
 
         [EFL] Pass a WTF::String directly from DRT to ewebkit when possible
index ad0ae2d..0416e01 100644 (file)
@@ -15,6 +15,7 @@ SET(DumpRenderTree_SOURCES
     ${TOOLS_DIR}/DumpRenderTree/efl/JSStringUtils.cpp
     ${TOOLS_DIR}/DumpRenderTree/efl/LayoutTestControllerEfl.cpp
     ${TOOLS_DIR}/DumpRenderTree/efl/PixelDumpSupportEfl.cpp
+    ${TOOLS_DIR}/DumpRenderTree/efl/TextInputController.cpp
     ${TOOLS_DIR}/DumpRenderTree/efl/WorkQueueItemEfl.cpp
 )
 
index 440c9aa..bfaef5e 100644 (file)
@@ -33,6 +33,7 @@
 #include "GCController.h"
 #include "LayoutTestController.h"
 #include "NotImplemented.h"
+#include "TextInputController.h"
 #include "WebCoreSupport/DumpRenderTreeSupportEfl.h"
 #include "WebCoreTestSupport.h"
 #include "WorkQueue.h"
@@ -368,6 +369,12 @@ void DumpRenderTreeChrome::onWindowObjectCleared(void* userData, Evas_Object*, v
                         makeEventSender(objectClearedInfo->context, !DumpRenderTreeSupportEfl::frameParent(objectClearedInfo->frame)),
                         kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, 0);
 
+    JSRetainPtr<JSStringRef> textInputControllerName(JSStringCreateWithUTF8CString("textInputController"));
+    JSObjectSetProperty(objectClearedInfo->context, objectClearedInfo->windowObject,
+                        textInputControllerName.get(),
+                        makeTextInputController(objectClearedInfo->context),
+                        kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, 0);
+
     WebCoreTestSupport::injectInternalsObject(objectClearedInfo->context);
 }
 
diff --git a/Tools/DumpRenderTree/efl/TextInputController.cpp b/Tools/DumpRenderTree/efl/TextInputController.cpp
new file mode 100644 (file)
index 0000000..62b6d6b
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ * Copyright (C) 2011 Igalia S.L.
+ * Copyright (C) 2012 Samsung Electronics
+ *
+ * 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 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
+ * OWNER OR 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 "TextInputController.h"
+
+#include "DumpRenderTree.h"
+#include "DumpRenderTreeChrome.h"
+#include "WebCoreSupport/DumpRenderTreeSupportEfl.h"
+#include <JavaScriptCore/JSObjectRef.h>
+#include <JavaScriptCore/JSRetainPtr.h>
+#include <JavaScriptCore/JSStringRef.h>
+#include <JavaScriptCore/OpaqueJSString.h>
+
+static JSValueRef setMarkedTextCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+{
+    if (!browser->mainView() || argumentCount < 3)
+        return JSValueMakeUndefined(context);
+
+    JSStringRef string = JSValueToStringCopy(context, arguments[0], exception);
+
+    size_t bufferSize = JSStringGetMaximumUTF8CStringSize(string);
+    char* text = new char[bufferSize];
+    JSStringGetUTF8CString(string, text, bufferSize);
+    JSStringRelease(string);
+
+    int start = static_cast<int>(JSValueToNumber(context, arguments[1], exception));
+    int length = static_cast<int>(JSValueToNumber(context, arguments[2], exception));
+
+    DumpRenderTreeSupportEfl::setComposition(browser->mainView(), text, start, length);
+
+    delete[] text;
+    return JSValueMakeUndefined(context);
+}
+
+static JSValueRef hasMarkedTextCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+{
+    if (!browser->mainView())
+        return JSValueMakeUndefined(context);
+
+    return JSValueMakeBoolean(context, DumpRenderTreeSupportEfl::hasComposition(browser->mainView()));
+}
+
+static JSValueRef markedRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+{
+    if (!browser->mainView())
+        return JSValueMakeUndefined(context);
+
+    int start, length;
+    if (!DumpRenderTreeSupportEfl::compositionRange(browser->mainView(), &start, &length))
+        return JSValueMakeUndefined(context);
+
+    JSValueRef arrayValues[2];
+    arrayValues[0] = JSValueMakeNumber(context, start);
+    arrayValues[1] = JSValueMakeNumber(context, length);
+    JSObjectRef arrayObject = JSObjectMakeArray(context, 2, arrayValues, exception);
+    return arrayObject;
+}
+
+static JSValueRef insertTextCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+{
+    if (!browser->mainView() || argumentCount < 1)
+        return JSValueMakeUndefined(context);
+
+    JSStringRef string = JSValueToStringCopy(context, arguments[0], exception);
+
+    size_t bufferSize = JSStringGetMaximumUTF8CStringSize(string);
+    char* text = new char[bufferSize];
+    JSStringGetUTF8CString(string, text, bufferSize);
+    JSStringRelease(string);
+
+    DumpRenderTreeSupportEfl::confirmComposition(browser->mainView(), text);
+
+    delete[] text;
+    return JSValueMakeUndefined(context);
+}
+
+static JSValueRef unmarkTextCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+{
+    if (!browser->mainView())
+        return JSValueMakeUndefined(context);
+
+    DumpRenderTreeSupportEfl::confirmComposition(browser->mainView(), 0);
+    return JSValueMakeUndefined(context);
+}
+
+static JSValueRef firstRectForCharacterRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+{
+    if (!browser->mainView() || argumentCount < 2)
+        return JSValueMakeUndefined(context);
+
+    int location = static_cast<int>(JSValueToNumber(context, arguments[0], exception));
+    int length = static_cast<int>(JSValueToNumber(context, arguments[1], exception));
+
+    WebCore::IntRect rect = DumpRenderTreeSupportEfl::firstRectForCharacterRange(browser->mainView(), location, length);
+
+    JSValueRef arrayValues[4];
+    arrayValues[0] = JSValueMakeNumber(context, rect.x());
+    arrayValues[1] = JSValueMakeNumber(context, rect.y());
+    arrayValues[2] = JSValueMakeNumber(context, rect.width());
+    arrayValues[3] = JSValueMakeNumber(context, rect.height());
+    JSObjectRef arrayObject = JSObjectMakeArray(context, 4, arrayValues, exception);
+    return arrayObject;
+}
+
+static JSValueRef selectedRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+{
+    if (!browser->mainView())
+        return JSValueMakeUndefined(context);
+
+    int start, length;
+    if (!DumpRenderTreeSupportEfl::selectedRange(browser->mainView(), &start, &length))
+        return JSValueMakeUndefined(context);
+
+    JSValueRef arrayValues[2];
+    arrayValues[0] = JSValueMakeNumber(context, start);
+    arrayValues[1] = JSValueMakeNumber(context, length);
+    JSObjectRef arrayObject = JSObjectMakeArray(context, 2, arrayValues, exception);
+    return arrayObject;
+}
+
+static JSStaticFunction staticFunctions[] = {
+    { "setMarkedText", setMarkedTextCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+    { "hasMarkedText", hasMarkedTextCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+    { "markedRange", markedRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+    { "insertText", insertTextCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+    { "unmarkText", unmarkTextCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+    { "firstRectForCharacterRange", firstRectForCharacterRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+    { "selectedRange", selectedRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+    { 0, 0, 0 }
+};
+
+static JSClassRef getClass(JSContextRef context)
+{
+    static JSClassRef textInputControllerClass = 0;
+
+    if (!textInputControllerClass) {
+        JSClassDefinition classDefinition = {
+                0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+        classDefinition.staticFunctions = staticFunctions;
+
+        textInputControllerClass = JSClassCreate(&classDefinition);
+    }
+
+    return textInputControllerClass;
+}
+
+JSObjectRef makeTextInputController(JSContextRef context)
+{
+    return JSObjectMake(context, getClass(context), 0);
+}
+
diff --git a/Tools/DumpRenderTree/efl/TextInputController.h b/Tools/DumpRenderTree/efl/TextInputController.h
new file mode 100644 (file)
index 0000000..5ee2719
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ * Copyright (C) 2011 Igalia S.L.
+ * Copyright (C) 2012 Samsung Electronics
+ *
+ * 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 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
+ * OWNER OR 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.
+ */
+
+#ifndef TextInputController_h
+#define TextInputController_h
+
+typedef const struct OpaqueJSContext* JSContextRef;
+typedef struct OpaqueJSValue* JSObjectRef;
+
+JSObjectRef makeTextInputController(JSContextRef);
+
+#endif