Title: [190407] trunk
Revision
190407
Author
wenson_hs...@apple.com
Date
2015-10-01 07:28:38 -0700 (Thu, 01 Oct 2015)

Log Message

Implement keyboard event sending for iOS in WebKitTestRunner
https://bugs.webkit.org/show_bug.cgi?id=149676

Reviewed by Simon Fraser.

Tools:

Adds support for generating and sending key events in WebKitTestRunner. This is accomplished in a similar
way as touch events, using IOHIDEvent machinery. Also adds callbacks to the UIScriptController JS API that
allows us to run code when the keyboard is shown or hidden.

* WebKitTestRunner/UIScriptContext/Bindings/UIScriptController.idl: Adds the typeCharacter JS interface.
* WebKitTestRunner/UIScriptContext/UIScriptController.cpp:
(WTR::UIScriptController::setDidShowKeyboardCallback):
(WTR::UIScriptController::didShowKeyboardCallback):
(WTR::UIScriptController::setDidHideKeyboardCallback):
(WTR::UIScriptController::didHideKeyboardCallback):
(WTR::UIScriptController::typeCharacterUsingHardwareKeyboard):
(WTR::UIScriptController::platformSetDidShowKeyboardCallback):
(WTR::UIScriptController::platformSetDidHideKeyboardCallback):
* WebKitTestRunner/UIScriptContext/UIScriptController.h:
* WebKitTestRunner/cocoa/TestRunnerWKWebView.h:
* WebKitTestRunner/cocoa/TestRunnerWKWebView.mm:
(-[TestRunnerWKWebView initWithFrame:configuration:]): Registers the TestRunnerWKWebView to listen to
        the notifications that the keyboard has been raised or lowered.
(-[TestRunnerWKWebView _keyboardDidShow:]):
(-[TestRunnerWKWebView _keyboardDidHide:]):
* WebKitTestRunner/ios/HIDEventGenerator.h:
* WebKitTestRunner/ios/HIDEventGenerator.m:
(-[HIDEventGenerator _sendIOHIDKeyboardEvent:usage:isKeyDown:]): Helper to send a HID keyboard event.
(shouldWrapWithShiftKeyEventForCharacter): Helper used to generate key events.
(hidUsageCodeForCharacter): Ditto.
(-[HIDEventGenerator keyDown:completionBlock:]): Synthesizes and sends HIDKeyboardEvents, triggering
        a keyDown event in WebKit.
* WebKitTestRunner/ios/IOKitSPI.h:
* WebKitTestRunner/ios/UIScriptControllerIOS.mm:

LayoutTests:

Adds a new basic test for the oninput event listener when typing in a text field.

* fast/events/ios/input-value-after-oninput-expected.txt: Added.
* fast/events/ios/input-value-after-oninput.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (190406 => 190407)


--- trunk/LayoutTests/ChangeLog	2015-10-01 13:38:46 UTC (rev 190406)
+++ trunk/LayoutTests/ChangeLog	2015-10-01 14:28:38 UTC (rev 190407)
@@ -1,3 +1,15 @@
+2015-10-01  Wenson Hsieh  <wenson_hs...@apple.com>
+
+        Implement keyboard event sending for iOS in WebKitTestRunner
+        https://bugs.webkit.org/show_bug.cgi?id=149676
+
+        Reviewed by Simon Fraser.
+
+        Adds a new basic test for the oninput event listener when typing in a text field.
+
+        * fast/events/ios/input-value-after-oninput-expected.txt: Added.
+        * fast/events/ios/input-value-after-oninput.html: Added.
+
 2015-10-01  Youenn Fablet  <youenn.fab...@crf.canon.fr>
 
         [Streams API] Add support for private WebCore JS builtins functions

Added: trunk/LayoutTests/fast/events/ios/input-value-after-oninput-expected.txt (0 => 190407)


--- trunk/LayoutTests/fast/events/ios/input-value-after-oninput-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/events/ios/input-value-after-oninput-expected.txt	2015-10-01 14:28:38 UTC (rev 190407)
@@ -0,0 +1,2 @@
+
+Successfully handled oninput, value is now "a"

Added: trunk/LayoutTests/fast/events/ios/input-value-after-oninput.html (0 => 190407)


--- trunk/LayoutTests/fast/events/ios/input-value-after-oninput.html	                        (rev 0)
+++ trunk/LayoutTests/fast/events/ios/input-value-after-oninput.html	2015-10-01 14:28:38 UTC (rev 190407)
@@ -0,0 +1,46 @@
+<html>
+
+<head>
+    <meta name="viewport" content="initial-scale=1.0">
+    <script id="ui-script" type="text/plain">
+        (function() {
+            uiController.singleTapAtPoint(50, 25, function() {
+                uiController.didShowKeyboardCallback = function() {
+                    uiController.typeCharacterUsingHardwareKeyboard("a", function() { });
+                }
+            });
+        })();
+    </script>
+
+    <script>
+        if (window.testRunner) {
+            testRunner.dumpAsText();
+            testRunner.waitUntilDone();
+        }
+
+        function getUIScript()
+        {
+            return document.getElementById("ui-script").text;
+        }
+
+        function handleValueChanged(value) {
+            document.getElementById("console").textContent = "Successfully handled oninput, value is now \"" + value + "\"";
+            testRunner.notifyDone();
+        }
+
+        function runTest()
+        {
+            if (!window.testRunner || !testRunner.runUIScript)
+                return;
+
+            testRunner.runUIScript(getUIScript(), function(result) { });
+        }
+    </script>
+</head>
+
+<body style="margin: 0;" _onload_="runTest()">
+    <input style="width: 100px; height: 50px;" id="test-input" _oninput_="handleValueChanged(this.value)">
+<div id="console">Failed to handle oninput<div>
+</body>
+
+</html>

Modified: trunk/Tools/ChangeLog (190406 => 190407)


--- trunk/Tools/ChangeLog	2015-10-01 13:38:46 UTC (rev 190406)
+++ trunk/Tools/ChangeLog	2015-10-01 14:28:38 UTC (rev 190407)
@@ -1,3 +1,40 @@
+2015-10-01  Wenson Hsieh  <wenson_hs...@apple.com>
+
+        Implement keyboard event sending for iOS in WebKitTestRunner
+        https://bugs.webkit.org/show_bug.cgi?id=149676
+
+        Reviewed by Simon Fraser.
+
+        Adds support for generating and sending key events in WebKitTestRunner. This is accomplished in a similar
+        way as touch events, using IOHIDEvent machinery. Also adds callbacks to the UIScriptController JS API that
+        allows us to run code when the keyboard is shown or hidden.
+
+        * WebKitTestRunner/UIScriptContext/Bindings/UIScriptController.idl: Adds the typeCharacter JS interface.
+        * WebKitTestRunner/UIScriptContext/UIScriptController.cpp:
+        (WTR::UIScriptController::setDidShowKeyboardCallback):
+        (WTR::UIScriptController::didShowKeyboardCallback):
+        (WTR::UIScriptController::setDidHideKeyboardCallback):
+        (WTR::UIScriptController::didHideKeyboardCallback):
+        (WTR::UIScriptController::typeCharacterUsingHardwareKeyboard):
+        (WTR::UIScriptController::platformSetDidShowKeyboardCallback):
+        (WTR::UIScriptController::platformSetDidHideKeyboardCallback):
+        * WebKitTestRunner/UIScriptContext/UIScriptController.h:
+        * WebKitTestRunner/cocoa/TestRunnerWKWebView.h:
+        * WebKitTestRunner/cocoa/TestRunnerWKWebView.mm:
+        (-[TestRunnerWKWebView initWithFrame:configuration:]): Registers the TestRunnerWKWebView to listen to
+                the notifications that the keyboard has been raised or lowered.
+        (-[TestRunnerWKWebView _keyboardDidShow:]):
+        (-[TestRunnerWKWebView _keyboardDidHide:]):
+        * WebKitTestRunner/ios/HIDEventGenerator.h:
+        * WebKitTestRunner/ios/HIDEventGenerator.m:
+        (-[HIDEventGenerator _sendIOHIDKeyboardEvent:usage:isKeyDown:]): Helper to send a HID keyboard event.
+        (shouldWrapWithShiftKeyEventForCharacter): Helper used to generate key events.
+        (hidUsageCodeForCharacter): Ditto.
+        (-[HIDEventGenerator keyDown:completionBlock:]): Synthesizes and sends HIDKeyboardEvents, triggering
+                a keyDown event in WebKit.
+        * WebKitTestRunner/ios/IOKitSPI.h:
+        * WebKitTestRunner/ios/UIScriptControllerIOS.mm:
+
 2015-10-01  Carlos Garcia Campos  <cgar...@igalia.com>
 
         Unreviewed, rolling out r190399.

Modified: trunk/Tools/WebKitTestRunner/UIScriptContext/Bindings/UIScriptController.idl (190406 => 190407)


--- trunk/Tools/WebKitTestRunner/UIScriptContext/Bindings/UIScriptController.idl	2015-10-01 13:38:46 UTC (rev 190406)
+++ trunk/Tools/WebKitTestRunner/UIScriptContext/Bindings/UIScriptController.idl	2015-10-01 14:28:38 UTC (rev 190407)
@@ -35,6 +35,11 @@
     void singleTapAtPoint(long x, long y, object callback);
     void doubleTapAtPoint(long x, long y, object callback);
 
+    void typeCharacterUsingHardwareKeyboard(DOMString character, object callback);
+
+    attribute object didShowKeyboardCallback;
+    attribute object didHideKeyboardCallback;
+
     attribute object willBeginZoomingCallback;
     attribute object didEndZoomingCallback;
 

Modified: trunk/Tools/WebKitTestRunner/UIScriptContext/UIScriptController.cpp (190406 => 190407)


--- trunk/Tools/WebKitTestRunner/UIScriptContext/UIScriptController.cpp	2015-10-01 13:38:46 UTC (rev 190406)
+++ trunk/Tools/WebKitTestRunner/UIScriptContext/UIScriptController.cpp	2015-10-01 14:28:38 UTC (rev 190407)
@@ -75,6 +75,28 @@
     return m_context.callbackWithID(m_didEndZoomingCallback);
 }
 
+void UIScriptController::setDidShowKeyboardCallback(JSValueRef callback)
+{
+    m_didShowKeyboardCallback = m_context.registerCallback(callback);
+    platformSetDidShowKeyboardCallback();
+}
+
+JSValueRef UIScriptController::didShowKeyboardCallback() const
+{
+    return m_context.callbackWithID(m_didShowKeyboardCallback);
+}
+
+void UIScriptController::setDidHideKeyboardCallback(JSValueRef callback)
+{
+    m_didHideKeyboardCallback = m_context.registerCallback(callback);
+    platformSetDidHideKeyboardCallback();
+}
+
+JSValueRef UIScriptController::didHideKeyboardCallback() const
+{
+    return m_context.callbackWithID(m_didHideKeyboardCallback);
+}
+
 #if !PLATFORM(IOS)
 void UIScriptController::zoomToScale(double, JSValueRef)
 {
@@ -88,6 +110,10 @@
 {
 }
 
+void UIScriptController::typeCharacterUsingHardwareKeyboard(JSStringRef, JSValueRef)
+{
+}
+
 double UIScriptController::zoomScale() const
 {
     return 1;
@@ -115,6 +141,14 @@
 void UIScriptController::platformSetDidEndZoomingCallback()
 {
 }
+
+void UIScriptController::platformSetDidShowKeyboardCallback()
+{
+}
+
+void UIScriptController::platformSetDidHideKeyboardCallback()
+{
+}
 #endif
 
 void UIScriptController::uiScriptComplete(JSStringRef result)

Modified: trunk/Tools/WebKitTestRunner/UIScriptContext/UIScriptController.h (190406 => 190407)


--- trunk/Tools/WebKitTestRunner/UIScriptContext/UIScriptController.h	2015-10-01 13:38:46 UTC (rev 190406)
+++ trunk/Tools/WebKitTestRunner/UIScriptContext/UIScriptController.h	2015-10-01 14:28:38 UTC (rev 190407)
@@ -48,12 +48,20 @@
     void singleTapAtPoint(long x, long y, JSValueRef callback);
     void doubleTapAtPoint(long x, long y, JSValueRef callback);
     
+    void typeCharacterUsingHardwareKeyboard(JSStringRef character, JSValueRef callback);
+
     void setWillBeginZoomingCallback(JSValueRef);
     JSValueRef willBeginZoomingCallback() const;
 
     void setDidEndZoomingCallback(JSValueRef);
     JSValueRef didEndZoomingCallback() const;
 
+    void setDidShowKeyboardCallback(JSValueRef);
+    JSValueRef didShowKeyboardCallback() const;
+
+    void setDidHideKeyboardCallback(JSValueRef);
+    JSValueRef didHideKeyboardCallback() const;
+
     double zoomScale() const;
     double minimumZoomScale() const;
     double maximumZoomScale() const;
@@ -67,6 +75,8 @@
     
     void platformSetWillBeginZoomingCallback();
     void platformSetDidEndZoomingCallback();
+    void platformSetDidShowKeyboardCallback();
+    void platformSetDidHideKeyboardCallback();
 
     virtual JSClassRef wrapperClass() override;
 
@@ -76,6 +86,8 @@
 
     unsigned m_willBeginZoomingCallback { 0 };
     unsigned m_didEndZoomingCallback { 0 };
+    unsigned m_didShowKeyboardCallback { 0 };
+    unsigned m_didHideKeyboardCallback { 0 };
 };
 
 }

Modified: trunk/Tools/WebKitTestRunner/cocoa/TestRunnerWKWebView.h (190406 => 190407)


--- trunk/Tools/WebKitTestRunner/cocoa/TestRunnerWKWebView.h	2015-10-01 13:38:46 UTC (rev 190406)
+++ trunk/Tools/WebKitTestRunner/cocoa/TestRunnerWKWebView.h	2015-10-01 14:28:38 UTC (rev 190407)
@@ -33,9 +33,13 @@
 
 @property (nonatomic, copy) void (^willBeginZoomingCallback)(void);
 @property (nonatomic, copy) void (^didEndZoomingCallback)(void);
+@property (nonatomic, copy) void (^didShowKeyboardCallback)(void);
+@property (nonatomic, copy) void (^didHideKeyboardCallback)(void);
 
+- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration;
+- (void)dealloc;
+
 - (void)zoomToScale:(double)scale animated:(BOOL)animated completionHandler:(void (^)(void))completionHandler;
-
 #endif
 
 @end

Modified: trunk/Tools/WebKitTestRunner/cocoa/TestRunnerWKWebView.mm (190406 => 190407)


--- trunk/Tools/WebKitTestRunner/cocoa/TestRunnerWKWebView.mm	2015-10-01 13:38:46 UTC (rev 190406)
+++ trunk/Tools/WebKitTestRunner/cocoa/TestRunnerWKWebView.mm	2015-10-01 14:28:38 UTC (rev 190407)
@@ -44,6 +44,7 @@
 
 @interface TestRunnerWKWebView ()
 @property (nonatomic, copy) void (^zoomToScaleCompletionHandler)(void);
+@property (nonatomic, copy) void (^showKeyboardCompletionHandler)(void);
 @end
 
 @implementation TestRunnerWKWebView
@@ -57,6 +58,22 @@
 #endif
 
 #if PLATFORM(IOS)
+- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration
+{
+    if (self = [super initWithFrame:frame configuration:configuration]) {
+        NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
+        [center addObserver:self selector:@selector(_keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
+        [center addObserver:self selector:@selector(_keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
+    }
+    return self;
+}
+
+- (void)dealloc
+{
+    [super dealloc];
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
 - (void)zoomToScale:(double)scale animated:(BOOL)animated completionHandler:(void (^)(void))completionHandler
 {
     ASSERT(!self.zoomToScaleCompletionHandler);
@@ -65,6 +82,18 @@
     [self.scrollView setZoomScale:scale animated:animated];
 }
 
+- (void)_keyboardDidShow:(NSNotification *)notification
+{
+    if (self.didShowKeyboardCallback)
+        self.didShowKeyboardCallback();
+}
+
+- (void)_keyboardDidHide:(NSNotification *)notification
+{
+    if (self.didHideKeyboardCallback)
+        self.didHideKeyboardCallback();
+}
+
 - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view
 {
     [super scrollViewWillBeginZooming:scrollView withView:view];

Modified: trunk/Tools/WebKitTestRunner/ios/HIDEventGenerator.h (190406 => 190407)


--- trunk/Tools/WebKitTestRunner/ios/HIDEventGenerator.h	2015-10-01 13:38:46 UTC (rev 190406)
+++ trunk/Tools/WebKitTestRunner/ios/HIDEventGenerator.h	2015-10-01 14:28:38 UTC (rev 190407)
@@ -50,4 +50,7 @@
 
 - (void)markerEventReceived:(IOHIDEventRef)event;
 
+// Keyboard
+- (void)keyDown:(NSString *)character completionBlock:(void (^)(void))completionBlock;
+
 @end

Modified: trunk/Tools/WebKitTestRunner/ios/HIDEventGenerator.mm (190406 => 190407)


--- trunk/Tools/WebKitTestRunner/ios/HIDEventGenerator.mm	2015-10-01 13:38:46 UTC (rev 190406)
+++ trunk/Tools/WebKitTestRunner/ios/HIDEventGenerator.mm	2015-10-01 14:28:38 UTC (rev 190407)
@@ -129,6 +129,17 @@
     return self;
 }
 
+- (void)_sendIOHIDKeyboardEvent:(uint64_t)timestamp usage:(uint32_t)usage isKeyDown:(bool)isKeyDown
+{
+    RetainPtr<IOHIDEventRef> eventRef = adoptCF(IOHIDEventCreateKeyboardEvent(kCFAllocatorDefault,
+        timestamp,
+        kHIDPage_KeyboardOrKeypad,
+        usage,
+        isKeyDown,
+        kIOHIDEventOptionNone));
+    [self _sendHIDEvent:eventRef.get()];
+}
+
 - (IOHIDEventRef)_createIOHIDEventType:(HandEventType)eventType
 {
     BOOL isTouching = (eventType == HandEventTouched || eventType == HandEventMoved || eventType == HandEventChordChanged);
@@ -428,4 +439,169 @@
     }
 }
 
+static inline bool shouldWrapWithShiftKeyEventForCharacter(NSString *key)
+{
+    if (key.length != 1)
+        return false;
+    int keyCode = [key characterAtIndex:0];
+    if (65 <= keyCode && keyCode <= 90)
+        return true;
+    switch (keyCode) {
+    case '`':
+    case '!':
+    case '@':
+    case '#':
+    case '$':
+    case '%':
+    case '^':
+    case '&':
+    case '*':
+    case '(':
+    case ')':
+    case '_':
+    case '+':
+    case '{':
+    case '}':
+    case '|':
+    case ':':
+    case '"':
+    case '<':
+    case '>':
+    case '?':
+    case '~':
+        return true;
+    }
+    return false;
+}
+
+static inline uint32_t hidUsageCodeForCharacter(NSString *key)
+{
+    const int uppercaseAlphabeticOffset = 'A' - kHIDUsage_KeyboardA;
+    const int lowercaseAlphabeticOffset = 'a' - kHIDUsage_KeyboardA;
+    const int numericNonZeroOffset = '1' - kHIDUsage_Keyboard1;
+    if (key.length == 1) {
+        // Handle alphanumeric characters and basic symbols.
+        int keyCode = [key characterAtIndex:0];
+        if (97 <= keyCode && keyCode <= 122) // Handle a-z.
+            return keyCode - lowercaseAlphabeticOffset;
+
+        if (65 <= keyCode && keyCode <= 90) // Handle A-Z.
+            return keyCode - uppercaseAlphabeticOffset;
+
+        if (49 <= keyCode && keyCode <= 57) // Handle 1-9.
+            return keyCode - numericNonZeroOffset;
+
+        // Handle all other cases.
+        switch (keyCode) {
+        case '`':
+        case '~':
+            return kHIDUsage_KeyboardGraveAccentAndTilde;
+        case '!':
+            return kHIDUsage_Keyboard1;
+        case '@':
+            return kHIDUsage_Keyboard2;
+        case '#':
+            return kHIDUsage_Keyboard3;
+        case '$':
+            return kHIDUsage_Keyboard4;
+        case '%':
+            return kHIDUsage_Keyboard5;
+        case '^':
+            return kHIDUsage_Keyboard6;
+        case '&':
+            return kHIDUsage_Keyboard7;
+        case '*':
+            return kHIDUsage_Keyboard8;
+        case '(':
+            return kHIDUsage_Keyboard9;
+        case ')':
+        case '0':
+            return kHIDUsage_Keyboard0;
+        case '-':
+        case '_':
+            return kHIDUsage_KeyboardHyphen;
+        case '=':
+        case '+':
+            return kHIDUsage_KeyboardEqualSign;
+        case '\t':
+            return kHIDUsage_KeyboardTab;
+        case '[':
+        case '{':
+            return kHIDUsage_KeyboardOpenBracket;
+        case ']':
+        case '}':
+            return kHIDUsage_KeyboardCloseBracket;
+        case '\\':
+        case '|':
+            return kHIDUsage_KeyboardBackslash;
+        case ';':
+        case ':':
+            return kHIDUsage_KeyboardSemicolon;
+        case '\'':
+        case '"':
+            return kHIDUsage_KeyboardQuote;
+        case '\r':
+        case '\n':
+            return kHIDUsage_KeyboardReturnOrEnter;
+        case ',':
+        case '<':
+            return kHIDUsage_KeyboardComma;
+        case '.':
+        case '>':
+            return kHIDUsage_KeyboardPeriod;
+        case '/':
+        case '?':
+            return kHIDUsage_KeyboardSlash;
+        case ' ':
+            return kHIDUsage_KeyboardSpacebar;
+        }
+    }
+    const int functionKeyOffset = kHIDUsage_KeyboardF1;
+    for (int functionKeyIndex = 1; functionKeyIndex <= 12; ++functionKeyIndex) {
+        if ([key isEqualToString:[NSString stringWithFormat:@"F%d", functionKeyIndex]])
+            return functionKeyOffset + functionKeyIndex - 1;
+    }
+    if ([key isEqualToString:@"escape"])
+        return kHIDUsage_KeyboardEscape;
+    if ([key isEqualToString:@"return"] || [key isEqualToString:@"enter"])
+        return kHIDUsage_KeyboardReturnOrEnter;
+    if ([key isEqualToString:@"leftArrow"])
+        return kHIDUsage_KeyboardLeftArrow;
+    if ([key isEqualToString:@"rightArrow"])
+        return kHIDUsage_KeyboardRightArrow;
+    if ([key isEqualToString:@"upArrow"])
+        return kHIDUsage_KeyboardUpArrow;
+    if ([key isEqualToString:@"downArrow"])
+        return kHIDUsage_KeyboardDownArrow;
+    if ([key isEqualToString:@"delete"])
+        return kHIDUsage_KeyboardDeleteOrBackspace;
+    // The simulator keyboard interprets both left and right modifier keys using the left version of the usage code.
+    if ([key isEqualToString:@"leftControl"] || [key isEqualToString:@"rightControl"])
+        return kHIDUsage_KeyboardLeftControl;
+    if ([key isEqualToString:@"leftShift"] || [key isEqualToString:@"rightShift"])
+        return kHIDUsage_KeyboardLeftShift;
+    if ([key isEqualToString:@"leftAlt"] || [key isEqualToString:@"rightAlt"])
+        return kHIDUsage_KeyboardLeftAlt;
+
+    return 0;
+}
+
+- (void)keyDown:(NSString *)character completionBlock:(void (^)(void))completionBlock
+{
+    bool shouldWrapWithShift = shouldWrapWithShiftKeyEventForCharacter(character);
+    uint32_t usage = hidUsageCodeForCharacter(character);
+    uint64_t absoluteMachTime = mach_absolute_time();
+
+    if (shouldWrapWithShift)
+        [self _sendIOHIDKeyboardEvent:absoluteMachTime usage:kHIDUsage_KeyboardLeftShift isKeyDown:true];
+
+    [self _sendIOHIDKeyboardEvent:absoluteMachTime usage:usage isKeyDown:true];
+    [self _sendIOHIDKeyboardEvent:absoluteMachTime usage:usage isKeyDown:false];
+
+    if (shouldWrapWithShift)
+        [self _sendIOHIDKeyboardEvent:absoluteMachTime usage:kHIDUsage_KeyboardLeftShift isKeyDown:false];
+
+    [self _sendMarkerHIDEventWithCompletionBlock:completionBlock];
+}
+
 @end

Modified: trunk/Tools/WebKitTestRunner/ios/IOKitSPI.h (190406 => 190407)


--- trunk/Tools/WebKitTestRunner/ios/IOKitSPI.h	2015-10-01 13:38:46 UTC (rev 190406)
+++ trunk/Tools/WebKitTestRunner/ios/IOKitSPI.h	2015-10-01 14:28:38 UTC (rev 190407)
@@ -60,6 +60,7 @@
 #define IOHIDEventFieldBase(type) (type << 16)
 
 enum {
+    kHIDPage_KeyboardOrKeypad       = 0x07
     kHIDPage_VendorDefinedStart     = 0xFF00
 };
 
@@ -127,6 +128,47 @@
 #define kGSEventPathInfoInRange (1 << 0)
 #define kGSEventPathInfoInTouch (1 << 1)
 
+enum {
+    kHIDUsage_KeyboardA = 0x04,
+    kHIDUsage_Keyboard1 = 0x1E,
+    kHIDUsage_Keyboard2 = 0x1F,
+    kHIDUsage_Keyboard3 = 0x20,
+    kHIDUsage_Keyboard4 = 0x21,
+    kHIDUsage_Keyboard5 = 0x22,
+    kHIDUsage_Keyboard6 = 0x23,
+    kHIDUsage_Keyboard7 = 0x24,
+    kHIDUsage_Keyboard8 = 0x25,
+    kHIDUsage_Keyboard9 = 0x26,
+    kHIDUsage_Keyboard0 = 0x27,
+    kHIDUsage_KeyboardReturnOrEnter = 0x28,
+    kHIDUsage_KeyboardEscape = 0x29,
+    kHIDUsage_KeyboardDeleteOrBackspace = 0x2A,
+    kHIDUsage_KeyboardTab = 0x2B,
+    kHIDUsage_KeyboardSpacebar = 0x2C,
+    kHIDUsage_KeyboardHyphen = 0x2D,
+    kHIDUsage_KeyboardEqualSign = 0x2E,
+    kHIDUsage_KeyboardOpenBracket = 0x2F,
+    kHIDUsage_KeyboardCloseBracket = 0x30,
+    kHIDUsage_KeyboardBackslash = 0x31,
+    kHIDUsage_KeyboardSemicolon = 0x33,
+    kHIDUsage_KeyboardQuote = 0x34,
+    kHIDUsage_KeyboardGraveAccentAndTilde = 0x35,
+    kHIDUsage_KeyboardComma = 0x36,
+    kHIDUsage_KeyboardPeriod = 0x37,
+    kHIDUsage_KeyboardSlash = 0x38,
+    kHIDUsage_KeyboardF1 = 0x3A,
+    kHIDUsage_KeyboardHome = 0x4A,
+    kHIDUsage_KeyboardPageUp = 0x4B,
+    kHIDUsage_KeyboardEnd = 0x4D,
+    kHIDUsage_KeyboardRightArrow = 0x4F,
+    kHIDUsage_KeyboardLeftArrow = 0x50,
+    kHIDUsage_KeyboardDownArrow = 0x51,
+    kHIDUsage_KeyboardUpArrow = 0x52,
+    kHIDUsage_KeyboardLeftControl = 0xE0,
+    kHIDUsage_KeyboardLeftShift = 0xE1,
+    kHIDUsage_KeyboardLeftAlt = 0xE2
+};
+
 WTF_EXTERN_C_END
 
 #endif // USE(APPLE_INTERNAL_SDK)

Modified: trunk/Tools/WebKitTestRunner/ios/UIScriptControllerIOS.mm (190406 => 190407)


--- trunk/Tools/WebKitTestRunner/ios/UIScriptControllerIOS.mm	2015-10-01 13:38:46 UTC (rev 190406)
+++ trunk/Tools/WebKitTestRunner/ios/UIScriptControllerIOS.mm	2015-10-01 14:28:38 UTC (rev 190407)
@@ -30,6 +30,7 @@
 
 #import "HIDEventGenerator.h"
 #import "PlatformWebView.h"
+#import "StringFunctions.h"
 #import "TestController.h"
 #import "TestRunnerWKWebView.h"
 #import "UIScriptContext.h"
@@ -92,6 +93,16 @@
     }];
 }
 
+void UIScriptController::typeCharacterUsingHardwareKeyboard(JSStringRef character, JSValueRef callback)
+{
+    unsigned callbackID = m_context.prepareForAsyncTask(callback);
+
+    // Assumes that the keyboard is already shown.
+    [[HIDEventGenerator sharedHIDEventGenerator] keyDown:toWTFString(toWK(character)) completionBlock:^{
+        m_context.asyncTaskComplete(callbackID);
+    }];
+}
+
 double UIScriptController::minimumZoomScale() const
 {
     TestRunnerWKWebView *webView = TestController::singleton().mainWebView()->platformView();
@@ -130,6 +141,22 @@
     };
 }
 
+void UIScriptController::platformSetDidShowKeyboardCallback()
+{
+    TestRunnerWKWebView *webView = TestController::singleton().mainWebView()->platformView();
+    webView.didShowKeyboardCallback = ^{
+        m_context.fireCallback(m_didShowKeyboardCallback);
+    };
 }
 
+void UIScriptController::platformSetDidHideKeyboardCallback()
+{
+    TestRunnerWKWebView *webView = TestController::singleton().mainWebView()->platformView();
+    webView.didHideKeyboardCallback = ^{
+        m_context.fireCallback(m_didHideKeyboardCallback);
+    };
+}
+
+}
+
 #endif // PLATFORM(IOS)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to