Title: [283870] trunk/Tools
Revision
283870
Author
[email protected]
Date
2021-10-09 14:35:21 -0700 (Sat, 09 Oct 2021)

Log Message

Pull modifier key extraction into TestRunnerShared
https://bugs.webkit.org/show_bug.cgi?id=231267

Reviewed by Tim Horton.

This patch pulls the code to extract modifier key information is pulled into a little class
called ModifierKeys in TestRunnerShared. That code is now shared between DRT and WKTR
for the existing implementations of keyDown.

* DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj:
* DumpRenderTree/mac/EventSendingController.mm:
(-[EventSendingController keyDown:withModifiers:withLocation:]):
* TestRunnerShared/cocoa/ModifierKeys.h: Added.
* TestRunnerShared/cocoa/ModifierKeys.mm: Added.
(-[ModifierKeys init]):
(-[ModifierKeys dealloc]):
(+[ModifierKeys modifierKeysWithKey:modifiers:keyLocation:]):
* WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj:
* WebKitTestRunner/mac/EventSenderProxy.mm:
(WTR::EventSenderProxy::keyDown):

Modified Paths

Added Paths

Diff

Modified: trunk/Tools/ChangeLog (283869 => 283870)


--- trunk/Tools/ChangeLog	2021-10-09 21:19:09 UTC (rev 283869)
+++ trunk/Tools/ChangeLog	2021-10-09 21:35:21 UTC (rev 283870)
@@ -1,3 +1,26 @@
+2021-10-09  Beth Dakin  <[email protected]>
+
+        Pull modifier key extraction into TestRunnerShared
+        https://bugs.webkit.org/show_bug.cgi?id=231267
+
+        Reviewed by Tim Horton.
+
+        This patch pulls the code to extract modifier key information is pulled into a little class 
+        called ModifierKeys in TestRunnerShared. That code is now shared between DRT and WKTR 
+        for the existing implementations of keyDown.
+
+        * DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj:
+        * DumpRenderTree/mac/EventSendingController.mm:
+        (-[EventSendingController keyDown:withModifiers:withLocation:]):
+        * TestRunnerShared/cocoa/ModifierKeys.h: Added.
+        * TestRunnerShared/cocoa/ModifierKeys.mm: Added.
+        (-[ModifierKeys init]):
+        (-[ModifierKeys dealloc]):
+        (+[ModifierKeys modifierKeysWithKey:modifiers:keyLocation:]):
+        * WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj:
+        * WebKitTestRunner/mac/EventSenderProxy.mm:
+        (WTR::EventSenderProxy::keyDown):
+
 2021-10-08  BJ Burg  <[email protected]>
 
         [Cocoa] Web Inspector: provide a way for _WKInspectorExtension clients to be notified when the inspected page navigates

Modified: trunk/Tools/DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj (283869 => 283870)


--- trunk/Tools/DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj	2021-10-09 21:19:09 UTC (rev 283869)
+++ trunk/Tools/DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj	2021-10-09 21:35:21 UTC (rev 283870)
@@ -114,6 +114,7 @@
 		7CFF9BC22533BC160008009F /* TestCommand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CFF9BC12533BC160008009F /* TestCommand.cpp */; };
 		80045AEE147718E7008290A8 /* AccessibilityNotificationHandler.mm in Sources */ = {isa = PBXBuildFile; fileRef = 80045AEC147718E7008290A8 /* AccessibilityNotificationHandler.mm */; };
 		8465E2C70FFA8DF2003B8342 /* PixelDumpSupport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8465E2C60FFA8DF2003B8342 /* PixelDumpSupport.cpp */; };
+		932BB9C3270E273C0094CC33 /* ModifierKeys.mm in Sources */ = {isa = PBXBuildFile; fileRef = 932BB9C2270E273C0094CC33 /* ModifierKeys.mm */; };
 		93C78826250C6D3A00C0AA24 /* ReftestFunctions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93C78824250C6D3900C0AA24 /* ReftestFunctions.cpp */; };
 		93C7882E250C717200C0AA24 /* JSBasics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93C78829250C713400C0AA24 /* JSBasics.cpp */; };
 		A1158D581892740C0088C17B /* DumpRenderTreeBrowserView.mm in Sources */ = {isa = PBXBuildFile; fileRef = A1158D56189273EB0088C17B /* DumpRenderTreeBrowserView.mm */; };
@@ -345,6 +346,8 @@
 		80045AEB147718E7008290A8 /* AccessibilityNotificationHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AccessibilityNotificationHandler.h; path = mac/AccessibilityNotificationHandler.h; sourceTree = "<group>"; };
 		80045AEC147718E7008290A8 /* AccessibilityNotificationHandler.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AccessibilityNotificationHandler.mm; path = mac/AccessibilityNotificationHandler.mm; sourceTree = "<group>"; };
 		8465E2C60FFA8DF2003B8342 /* PixelDumpSupport.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PixelDumpSupport.cpp; sourceTree = "<group>"; };
+		932BB9C1270E273C0094CC33 /* ModifierKeys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModifierKeys.h; sourceTree = "<group>"; };
+		932BB9C2270E273C0094CC33 /* ModifierKeys.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ModifierKeys.mm; sourceTree = "<group>"; };
 		9335435F03D75502008635CE /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = WebKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		9340995408540CAF007F3BC8 /* DumpRenderTree */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = DumpRenderTree; sourceTree = BUILT_PRODUCTS_DIR; };
 		93C78824250C6D3900C0AA24 /* ReftestFunctions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReftestFunctions.cpp; sourceTree = "<group>"; };
@@ -940,6 +943,8 @@
 				F44A531C21B89A4500DBB99C /* InstanceMethodSwizzler.mm */,
 				F4C3578920E8442700FA0748 /* LayoutTestSpellChecker.h */,
 				F4C3578820E8442700FA0748 /* LayoutTestSpellChecker.mm */,
+				932BB9C1270E273C0094CC33 /* ModifierKeys.h */,
+				932BB9C2270E273C0094CC33 /* ModifierKeys.mm */,
 				F4010B7A24DA200E00A876E2 /* PoseAsClass.h */,
 				F4010B7924DA200E00A876E2 /* PoseAsClass.mm */,
 			);
@@ -1284,6 +1289,7 @@
 				F4FED32023582158003C139C /* NSPasteboardAdditions.mm in Sources */,
 				BCA18B320C9B01B400114369 /* ObjCController.m in Sources */,
 				BCA18B7E0C9B08F100114369 /* ObjCPlugin.m in Sources */,
+				932BB9C3270E273C0094CC33 /* ModifierKeys.mm in Sources */,
 				BCA18B800C9B08F100114369 /* ObjCPluginFunction.m in Sources */,
 				8465E2C70FFA8DF2003B8342 /* PixelDumpSupport.cpp in Sources */,
 				BCB284CD0CFA83C8007E533E /* PixelDumpSupportCG.cpp in Sources */,

Modified: trunk/Tools/DumpRenderTree/mac/EventSendingController.mm (283869 => 283870)


--- trunk/Tools/DumpRenderTree/mac/EventSendingController.mm	2021-10-09 21:19:09 UTC (rev 283869)
+++ trunk/Tools/DumpRenderTree/mac/EventSendingController.mm	2021-10-09 21:35:21 UTC (rev 283870)
@@ -37,6 +37,7 @@
 #import "DumpRenderTreeDraggingInfo.h"
 #import "DumpRenderTreeFileDraggingSource.h"
 #import "DumpRenderTreePasteboard.h"
+#import "ModifierKeys.h"
 #import "WebCoreTestSupport.h"
 #import <WebKit/DOMPrivate.h>
 #import <WebKit/WebViewPrivate.h>
@@ -81,13 +82,6 @@
     NoMouseButton = -2
 };
 
-struct KeyMappingEntry {
-    int macKeyCode;
-    int macNumpadKeyCode;
-    unichar character;
-    NSString* characterName;
-};
-
 NSPoint lastMousePosition;
 NSPoint lastClickPosition;
 int lastClickButton = NoMouseButton;
@@ -972,204 +966,23 @@
 
 - (void)keyDown:(NSString *)character withModifiers:(WebScriptObject *)modifiers withLocation:(unsigned long)location
 {
-    NSString *eventCharacter = character;
-    unsigned short keyCode = 0;
-    if ([character isEqualToString:@"leftArrow"]) {
-        const unichar ch = NSLeftArrowFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x7B;
-    } else if ([character isEqualToString:@"rightArrow"]) {
-        const unichar ch = NSRightArrowFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x7C;
-    } else if ([character isEqualToString:@"upArrow"]) {
-        const unichar ch = NSUpArrowFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x7E;
-    } else if ([character isEqualToString:@"downArrow"]) {
-        const unichar ch = NSDownArrowFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x7D;
-    } else if ([character isEqualToString:@"pageUp"]) {
-        const unichar ch = NSPageUpFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x74;
-    } else if ([character isEqualToString:@"pageDown"]) {
-        const unichar ch = NSPageDownFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x79;
-    } else if ([character isEqualToString:@"home"]) {
-        const unichar ch = NSHomeFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x73;
-    } else if ([character isEqualToString:@"end"]) {
-        const unichar ch = NSEndFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x77;
-    } else if ([character isEqualToString:@"insert"]) {
-        const unichar ch = NSInsertFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x72;
-    } else if ([character isEqualToString:@"delete"]) {
-        const unichar ch = NSDeleteFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x75;
-    } else if ([character isEqualToString:@"escape"]) {
-        const unichar ch = 0x1B;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x35;
-    } else if ([character isEqualToString:@"printScreen"]) {
-        const unichar ch = NSPrintScreenFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x0; // There is no known virtual key code for PrintScreen.
-    } else if ([character isEqualToString:@"cyrillicSmallLetterA"]) {
-        const unichar ch = 0x0430;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x3; // Shares key with "F" on Russian layout.
-    } else if ([character isEqualToString:@"leftControl"]) {
-        const unichar ch = 0xFFE3;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x3B;
-    } else if ([character isEqualToString:@"leftShift"]) {
-        const unichar ch = 0xFFE1;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x38;
-    } else if ([character isEqualToString:@"leftAlt"]) {
-        const unichar ch = 0xFFE7;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x3A;
-    } else if ([character isEqualToString:@"rightControl"]) {
-        const unichar ch = 0xFFE4;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x3E;
-    } else if ([character isEqualToString:@"rightShift"]) {
-        const unichar ch = 0xFFE2;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x3C;
-    } else if ([character isEqualToString:@"rightAlt"]) {
-        const unichar ch = 0xFFE8;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x3D;
-    }
+    RetainPtr<ModifierKeys> modifierKeys = [ModifierKeys modifierKeysWithKey:character modifiers:buildModifierFlags(modifiers) keyLocation:location];
 
-    // Compare the input string with the function-key names defined by the DOM spec (i.e. "F1",...,"F24").
-    // If the input string is a function-key name, set its key code.
-    for (unsigned i = 1; i <= 24; i++) {
-        if ([character isEqualToString:[NSString stringWithFormat:@"F%u", i]]) {
-            const unichar ch = NSF1FunctionKey + (i - 1);
-            eventCharacter = [NSString stringWithCharacters:&ch length:1];
-            switch (i) {
-                case 1: keyCode = 0x7A; break;
-                case 2: keyCode = 0x78; break;
-                case 3: keyCode = 0x63; break;
-                case 4: keyCode = 0x76; break;
-                case 5: keyCode = 0x60; break;
-                case 6: keyCode = 0x61; break;
-                case 7: keyCode = 0x62; break;
-                case 8: keyCode = 0x64; break;
-                case 9: keyCode = 0x65; break;
-                case 10: keyCode = 0x6D; break;
-                case 11: keyCode = 0x67; break;
-                case 12: keyCode = 0x6F; break;
-                case 13: keyCode = 0x69; break;
-                case 14: keyCode = 0x6B; break;
-                case 15: keyCode = 0x71; break;
-                case 16: keyCode = 0x6A; break;
-                case 17: keyCode = 0x40; break;
-                case 18: keyCode = 0x4F; break;
-                case 19: keyCode = 0x50; break;
-                case 20: keyCode = 0x5A; break;
-            }
-        }
-    }
-
-    // FIXME: No keyCode is set for most keys.
-    if ([character isEqualToString:@"\t"])
-        keyCode = 0x30;
-    else if ([character isEqualToString:@" "])
-        keyCode = 0x31;
-    else if ([character isEqualToString:@"\r"])
-        keyCode = 0x24;
-    else if ([character isEqualToString:@"\n"])
-        keyCode = 0x4C;
-    else if ([character isEqualToString:@"\x8"])
-        keyCode = 0x33;
-    else if ([character isEqualToString:@"a"])
-        keyCode = 0x00;
-    else if ([character isEqualToString:@"b"])
-        keyCode = 0x0B;
-    else if ([character isEqualToString:@"d"])
-        keyCode = 0x02;
-    else if ([character isEqualToString:@"e"])
-        keyCode = 0x0E;
-    else if ([character isEqualToString:@"\x1b"])
-        keyCode = 0x1B;
-
-    KeyMappingEntry table[] = {
-        {0x2F, 0x41, '.', nil},
-        {0,    0x43, '*', nil},
-        {0,    0x45, '+', nil},
-        {0,    0x47, NSClearLineFunctionKey, @"clear"},
-        {0x2C, 0x4B, '/', nil},
-        {0,    0x4C, 3, @"enter" },
-        {0x1B, 0x4E, '-', nil},
-        {0x18, 0x51, '=', nil},
-        {0x1D, 0x52, '0', nil},
-        {0x12, 0x53, '1', nil},
-        {0x13, 0x54, '2', nil},
-        {0x14, 0x55, '3', nil},
-        {0x15, 0x56, '4', nil},
-        {0x17, 0x57, '5', nil},
-        {0x16, 0x58, '6', nil},
-        {0x1A, 0x59, '7', nil},
-        {0x1C, 0x5B, '8', nil},
-        {0x19, 0x5C, '9', nil},
-    };
-    for (unsigned i = 0; i < WTF_ARRAY_LENGTH(table); ++i) {
-        NSString* currentCharacterString = [NSString stringWithCharacters:&table[i].character length:1];
-        if ([character isEqualToString:currentCharacterString] || [character isEqualToString:table[i].characterName]) {
-            if (location == DOM_KEY_LOCATION_NUMPAD)
-                keyCode = table[i].macNumpadKeyCode;
-            else
-                keyCode = table[i].macKeyCode;
-            eventCharacter = currentCharacterString;
-            break;
-        }
-    }
-
-    NSString *charactersIgnoringModifiers = eventCharacter;
-
-    int modifierFlags = 0;
-
-    if ([character length] == 1 && [character characterAtIndex:0] >= 'A' && [character characterAtIndex:0] <= 'Z') {
-#if !PLATFORM(IOS_FAMILY)
-        modifierFlags |= NSEventModifierFlagShift;
-#else
-        modifierFlags |= WebEventFlagMaskLeftShiftKey;
-#endif
-        charactersIgnoringModifiers = [character lowercaseString];
-    }
-
-    modifierFlags |= buildModifierFlags(modifiers);
-
-    if (location == DOM_KEY_LOCATION_NUMPAD)
-        modifierFlags |= NSEventModifierFlagNumericPad;
-
     [[[mainFrame frameView] documentView] layout];
 
 #if !PLATFORM(IOS_FAMILY)
     auto event = retainPtr([NSEvent keyEventWithType:NSEventTypeKeyDown
                         location:NSMakePoint(5, 5)
-                        modifierFlags:modifierFlags
+                        modifierFlags:modifierKeys->modifierFlags
                         timestamp:[self currentEventTime]
                         windowNumber:[[[mainFrame webView] window] windowNumber]
                         context:[NSGraphicsContext currentContext]
-                        characters:eventCharacter
-                        charactersIgnoringModifiers:charactersIgnoringModifiers
+                        characters:modifierKeys->eventCharacter.get()
+                        charactersIgnoringModifiers:modifierKeys->charactersIgnoringModifiers.get()
                         isARepeat:NO
-                        keyCode:keyCode]);
+                        keyCode:modifierKeys->keyCode]);
 #else
-    auto event = adoptNS([[WebEvent alloc] initWithKeyEventType:WebEventKeyDown timeStamp:[self currentEventTime] characters:eventCharacter charactersIgnoringModifiers:charactersIgnoringModifiers modifiers:(WebEventFlags)modifierFlags isRepeating:NO withFlags:0 withInputManagerHint:nil keyCode:[character characterAtIndex:0] isTabKey:([character characterAtIndex:0] == '\t')]);
+    auto event = adoptNS([[WebEvent alloc] initWithKeyEventType:WebEventKeyDown timeStamp:[self currentEventTime] characters:modifierKeys->eventCharacter.get() charactersIgnoringModifiers:modifierKeys->charactersIgnoringModifiers.get() modifiers:(WebEventFlags)modifierKeys->modifierFlags isRepeating:NO withFlags:0 withInputManagerHint:nil keyCode:[character characterAtIndex:0] isTabKey:([character characterAtIndex:0] == '\t')]);
 #endif
 
 #if !PLATFORM(IOS_FAMILY)
@@ -1183,16 +996,16 @@
 #if !PLATFORM(IOS_FAMILY)
     event = retainPtr([NSEvent keyEventWithType:NSEventTypeKeyUp
                         location:NSMakePoint(5, 5)
-                        modifierFlags:modifierFlags
+                        modifierFlags:modifierKeys->modifierFlags
                         timestamp:[self currentEventTime]
                         windowNumber:[[[mainFrame webView] window] windowNumber]
                         context:[NSGraphicsContext currentContext]
-                        characters:eventCharacter
-                        charactersIgnoringModifiers:charactersIgnoringModifiers
+                        characters:modifierKeys->eventCharacter.get()
+                        charactersIgnoringModifiers:modifierKeys->charactersIgnoringModifiers.get()
                         isARepeat:NO
-                        keyCode:keyCode]);
+                        keyCode:modifierKeys->keyCode]);
 #else
-    event = adoptNS([[WebEvent alloc] initWithKeyEventType:WebEventKeyUp timeStamp:[self currentEventTime] characters:eventCharacter charactersIgnoringModifiers:charactersIgnoringModifiers modifiers:(WebEventFlags)modifierFlags isRepeating:NO withFlags:0 withInputManagerHint:nil keyCode:[character characterAtIndex:0] isTabKey:([character characterAtIndex:0] == '\t')]);
+    event = adoptNS([[WebEvent alloc] initWithKeyEventType:WebEventKeyUp timeStamp:[self currentEventTime] characters:modifierKeys->eventCharacter.get() charactersIgnoringModifiers:modifierKeys->charactersIgnoringModifiers.get() modifiers:(WebEventFlags)modifierKeys->modifierFlags isRepeating:NO withFlags:0 withInputManagerHint:nil keyCode:[character characterAtIndex:0] isTabKey:([character characterAtIndex:0] == '\t')]);
 #endif
 
 #if !PLATFORM(IOS_FAMILY)

Added: trunk/Tools/TestRunnerShared/cocoa/ModifierKeys.h (0 => 283870)


--- trunk/Tools/TestRunnerShared/cocoa/ModifierKeys.h	                        (rev 0)
+++ trunk/Tools/TestRunnerShared/cocoa/ModifierKeys.h	2021-10-09 21:35:21 UTC (rev 283870)
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * 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 APPLE INC. AND ITS 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 APPLE INC. OR ITS 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.
+ */
+
+#pragma once
+
+#import <wtf/RetainPtr.h>
+
+@interface ModifierKeys : NSObject {
+@public
+    RetainPtr<NSString> eventCharacter;
+    unsigned short keyCode;
+    RetainPtr<NSString> charactersIgnoringModifiers;
+    int modifierFlags;
+}
+
++ (ModifierKeys *)modifierKeysWithKey:(NSString *)key modifiers:(int)modifiers keyLocation:(unsigned)keyLocation;
+
+@end

Added: trunk/Tools/TestRunnerShared/cocoa/ModifierKeys.mm (0 => 283870)


--- trunk/Tools/TestRunnerShared/cocoa/ModifierKeys.mm	                        (rev 0)
+++ trunk/Tools/TestRunnerShared/cocoa/ModifierKeys.mm	2021-10-09 21:35:21 UTC (rev 283870)
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * 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 APPLE INC. AND ITS 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 APPLE INC. OR ITS 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.
+ */
+
+#import "config.h"
+#import "ModifierKeys.h"
+
+#import <WebKit/WebKitLegacy.h>
+#import <wtf/Vector.h>
+
+#if PLATFORM(IOS_FAMILY)
+#import <WebKit/KeyEventCodesIOS.h>
+#import <WebKit/WebEvent.h>
+#endif
+
+struct KeyMappingEntry {
+    int macKeyCode;
+    int macNumpadKeyCode;
+    unichar character;
+    NSString *characterName;
+};
+
+@implementation ModifierKeys
+
+- (instancetype)init
+{
+    self = [super init];
+    if (!self)
+        return nil;
+
+    return self;
+}
+
+- (void)dealloc
+{
+    [super dealloc];
+}
+
++ (ModifierKeys *)modifierKeysWithKey:(NSString *)character modifiers:(int)modifiers keyLocation:(unsigned)keyLocation
+{
+    ModifierKeys *modiferKeys = [[[ModifierKeys alloc] init] autorelease];
+
+    modiferKeys->eventCharacter = adoptNS([[NSString alloc] initWithString:character]);
+    modiferKeys->keyCode = 0;
+    if ([character isEqualToString:@"leftArrow"]) {
+        const unichar ch = NSLeftArrowFunctionKey;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x7B;
+    } else if ([character isEqualToString:@"rightArrow"]) {
+        const unichar ch = NSRightArrowFunctionKey;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x7C;
+    } else if ([character isEqualToString:@"upArrow"]) {
+        const unichar ch = NSUpArrowFunctionKey;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x7E;
+    } else if ([character isEqualToString:@"downArrow"]) {
+        const unichar ch = NSDownArrowFunctionKey;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x7D;
+    } else if ([character isEqualToString:@"pageUp"]) {
+        const unichar ch = NSPageUpFunctionKey;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x74;
+    } else if ([character isEqualToString:@"pageDown"]) {
+        const unichar ch = NSPageDownFunctionKey;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x79;
+    } else if ([character isEqualToString:@"home"]) {
+        const unichar ch = NSHomeFunctionKey;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x73;
+    } else if ([character isEqualToString:@"end"]) {
+        const unichar ch = NSEndFunctionKey;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x77;
+    } else if ([character isEqualToString:@"insert"]) {
+        const unichar ch = NSInsertFunctionKey;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x72;
+    } else if ([character isEqualToString:@"delete"]) {
+        const unichar ch = NSDeleteFunctionKey;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x75;
+    } else if ([character isEqualToString:@"printScreen"]) {
+        const unichar ch = NSPrintScreenFunctionKey;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x0; // There is no known virtual key code for PrintScreen.
+    } else if ([character isEqualToString:@"cyrillicSmallLetterA"]) {
+        const unichar ch = 0x0430;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x3; // Shares key with "F" on Russian layout.
+    } else if ([character isEqualToString:@"leftControl"]) {
+        const unichar ch = 0xFFE3;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x3B;
+    } else if ([character isEqualToString:@"leftShift"]) {
+        const unichar ch = 0xFFE1;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x38;
+    } else if ([character isEqualToString:@"leftAlt"]) {
+        const unichar ch = 0xFFE7;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x3A;
+    } else if ([character isEqualToString:@"rightControl"]) {
+        const unichar ch = 0xFFE4;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x3E;
+    } else if ([character isEqualToString:@"rightShift"]) {
+        const unichar ch = 0xFFE2;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x3C;
+    } else if ([character isEqualToString:@"rightAlt"]) {
+        const unichar ch = 0xFFE8;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x3D;
+    } else if ([character isEqualToString:@"escape"]) {
+        const unichar ch = 0x1B;
+        modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+        modiferKeys->keyCode = 0x35;
+    }
+
+    // Compare the input string with the function-key names defined by the DOM spec (i.e. "F1",...,"F24").
+    // If the input string is a function-key name, set its key code.
+    for (unsigned i = 1; i <= 24; i++) {
+        if ([character isEqualToString:[NSString stringWithFormat:@"F%u", i]]) {
+            const unichar ch = NSF1FunctionKey + (i - 1);
+            modiferKeys->eventCharacter = [NSString stringWithCharacters:&ch length:1];
+            switch (i) {
+            case 1: modiferKeys->keyCode = 0x7A; break;
+            case 2: modiferKeys->keyCode = 0x78; break;
+            case 3: modiferKeys->keyCode = 0x63; break;
+            case 4: modiferKeys->keyCode = 0x76; break;
+            case 5: modiferKeys->keyCode = 0x60; break;
+            case 6: modiferKeys->keyCode = 0x61; break;
+            case 7: modiferKeys->keyCode = 0x62; break;
+            case 8: modiferKeys->keyCode = 0x64; break;
+            case 9: modiferKeys->keyCode = 0x65; break;
+            case 10: modiferKeys->keyCode = 0x6D; break;
+            case 11: modiferKeys->keyCode = 0x67; break;
+            case 12: modiferKeys->keyCode = 0x6F; break;
+            case 13: modiferKeys->keyCode = 0x69; break;
+            case 14: modiferKeys->keyCode = 0x6B; break;
+            case 15: modiferKeys->keyCode = 0x71; break;
+            case 16: modiferKeys->keyCode = 0x6A; break;
+            case 17: modiferKeys->keyCode = 0x40; break;
+            case 18: modiferKeys->keyCode = 0x4F; break;
+            case 19: modiferKeys->keyCode = 0x50; break;
+            case 20: modiferKeys->keyCode = 0x5A; break;
+            }
+        }
+    }
+
+    // FIXME: No keyCode is set for most keys.
+    if ([character isEqualToString:@"\t"])
+        modiferKeys->keyCode = 0x30;
+    else if ([character isEqualToString:@" "])
+        modiferKeys->keyCode = 0x31;
+    else if ([character isEqualToString:@"\r"])
+        modiferKeys->keyCode = 0x24;
+    else if ([character isEqualToString:@"\n"])
+        modiferKeys->keyCode = 0x4C;
+    else if ([character isEqualToString:@"\x8"])
+        modiferKeys->keyCode = 0x33;
+    else if ([character isEqualToString:@"a"])
+        modiferKeys->keyCode = 0x00;
+    else if ([character isEqualToString:@"b"])
+        modiferKeys->keyCode = 0x0B;
+    else if ([character isEqualToString:@"d"])
+        modiferKeys->keyCode = 0x02;
+    else if ([character isEqualToString:@"e"])
+        modiferKeys->keyCode = 0x0E;
+    else if ([character isEqualToString:@"\x1b"])
+        modiferKeys->keyCode = 0x1B;
+    else if ([character isEqualToString:@":"])
+        modiferKeys->keyCode = 0x29;
+    else if ([character isEqualToString:@";"])
+        modiferKeys->keyCode = 0x29;
+    else if ([character isEqualToString:@","])
+        modiferKeys->keyCode = 0x2B;
+
+    KeyMappingEntry table[] = {
+        { 0x2F, 0x41, '.', nil },
+        { 0,    0x43, '*', nil },
+        { 0,    0x45, '+', nil },
+        { 0,    0x47, NSClearLineFunctionKey, @"clear" },
+        { 0x2C, 0x4B, '/', nil },
+        { 0,    0x4C, 3, @"enter" },
+        { 0x1B, 0x4E, '-', nil },
+        { 0x18, 0x51, '=', nil },
+        { 0x1D, 0x52, '0', nil },
+        { 0x12, 0x53, '1', nil },
+        { 0x13, 0x54, '2', nil },
+        { 0x14, 0x55, '3', nil },
+        { 0x15, 0x56, '4', nil },
+        { 0x17, 0x57, '5', nil },
+        { 0x16, 0x58, '6', nil },
+        { 0x1A, 0x59, '7', nil },
+        { 0x1C, 0x5B, '8', nil },
+        { 0x19, 0x5C, '9', nil },
+    };
+    for (unsigned i = 0; i < WTF_ARRAY_LENGTH(table); ++i) {
+        NSString* currentCharacterString = [NSString stringWithCharacters:&table[i].character length:1];
+        if ([character isEqualToString:currentCharacterString] || [character isEqualToString:table[i].characterName]) {
+            if (keyLocation == 0x03 /*DOM_KEY_LOCATION_NUMPAD*/)
+                modiferKeys->keyCode = table[i].macNumpadKeyCode;
+            else
+                modiferKeys->keyCode = table[i].macKeyCode;
+            modiferKeys->eventCharacter = currentCharacterString;
+            break;
+        }
+    }
+
+    modiferKeys->charactersIgnoringModifiers = adoptNS([[NSString alloc] initWithString:modiferKeys->eventCharacter.get()]);
+
+    modiferKeys->modifierFlags = 0;
+
+    if ([character length] == 1 && [character characterAtIndex:0] >= 'A' && [character characterAtIndex:0] <= 'Z') {
+#if !PLATFORM(IOS_FAMILY)
+        modiferKeys->modifierFlags |= NSEventModifierFlagShift;
+#else
+        modiferKeys->modifierFlags |= WebEventFlagMaskLeftShiftKey;
+#endif
+        modiferKeys->charactersIgnoringModifiers = [character lowercaseString];
+    }
+
+    modiferKeys->modifierFlags |= modifiers;
+
+    if (keyLocation == 0x03 /*DOM_KEY_LOCATION_NUMPAD*/)
+        modiferKeys->modifierFlags |= NSEventModifierFlagNumericPad;
+    
+    return modiferKeys;
+}
+
+@end

Modified: trunk/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj (283869 => 283870)


--- trunk/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj	2021-10-09 21:19:09 UTC (rev 283869)
+++ trunk/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj	2021-10-09 21:35:21 UTC (rev 283870)
@@ -125,6 +125,7 @@
 		7CFF9BCB2534AF1D0008009F /* TestCommand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CFF9BC72534AF1D0008009F /* TestCommand.cpp */; };
 		8034C6621487636400AC32E9 /* AccessibilityControllerMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8034C6611487636400AC32E9 /* AccessibilityControllerMac.mm */; };
 		8097338A14874A5A008156D9 /* AccessibilityNotificationHandler.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8097338914874A5A008156D9 /* AccessibilityNotificationHandler.mm */; };
+		932BB9C0270E27000094CC33 /* ModifierKeys.mm in Sources */ = {isa = PBXBuildFile; fileRef = 932BB9BE270E27000094CC33 /* ModifierKeys.mm */; };
 		9376417A210D737200A3DAAE /* WebKitTestRunnerWindow.mm in Sources */ = {isa = PBXBuildFile; fileRef = 93764176210D736000A3DAAE /* WebKitTestRunnerWindow.mm */; };
 		93C78823250C6C2E00C0AA24 /* ReftestFunctions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93C7881F250C69E400C0AA24 /* ReftestFunctions.cpp */; };
 		93C78831250C719F00C0AA24 /* JSBasics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93C78830250C719900C0AA24 /* JSBasics.cpp */; };
@@ -367,6 +368,8 @@
 		841CC00D181185BF0042E9B6 /* Options.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Options.cpp; sourceTree = "<group>"; };
 		841CC00E181185BF0042E9B6 /* Options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Options.h; sourceTree = "<group>"; };
 		8DD76FA10486AA7600D96B5E /* WebKitTestRunner */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = WebKitTestRunner; sourceTree = BUILT_PRODUCTS_DIR; };
+		932BB9BD270E27000094CC33 /* ModifierKeys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ModifierKeys.h; path = ../TestRunnerShared/cocoa/ModifierKeys.h; sourceTree = "<group>"; };
+		932BB9BE270E27000094CC33 /* ModifierKeys.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ModifierKeys.mm; path = ../TestRunnerShared/cocoa/ModifierKeys.mm; sourceTree = "<group>"; };
 		9338D1BE250BD9DD00E827F6 /* DictionaryFunctions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DictionaryFunctions.h; sourceTree = "<group>"; };
 		93764176210D736000A3DAAE /* WebKitTestRunnerWindow.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebKitTestRunnerWindow.mm; sourceTree = "<group>"; };
 		93764177210D736100A3DAAE /* WebKitTestRunnerWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebKitTestRunnerWindow.h; sourceTree = "<group>"; };
@@ -955,6 +958,8 @@
 				F44A531621B899DA00DBB99C /* InstanceMethodSwizzler.mm */,
 				F4C3578B20E8444000FA0748 /* LayoutTestSpellChecker.h */,
 				F4C3578A20E8444000FA0748 /* LayoutTestSpellChecker.mm */,
+				932BB9BD270E27000094CC33 /* ModifierKeys.h */,
+				932BB9BE270E27000094CC33 /* ModifierKeys.mm */,
 				2E2A765B2370C8A0008F9FFE /* PlatformViewHelpers.h */,
 				2E2A765C2370C8A0008F9FFE /* PlatformViewHelpers.mm */,
 				F4010B7D24DA204800A876E2 /* PoseAsClass.h */,
@@ -1246,6 +1251,7 @@
 				A185103F1B9AE12900744AEB /* GeolocationProviderMock.cpp in Sources */,
 				F44A531821B899E500DBB99C /* InstanceMethodSwizzler.mm in Sources */,
 				31DA8A3D1E7205CC00E1DF2F /* IOSLayoutTestCommunication.cpp in Sources */,
+				932BB9C0270E27000094CC33 /* ModifierKeys.mm in Sources */,
 				93C78832250C71B700C0AA24 /* JSBasics.cpp in Sources */,
 				0F73B5511BA78968004B3EF4 /* JSUIScriptController.cpp in Sources */,
 				0F18E7181D6BC4560027E547 /* JSWrapper.cpp in Sources */,

Modified: trunk/Tools/WebKitTestRunner/mac/EventSenderProxy.mm (283869 => 283870)


--- trunk/Tools/WebKitTestRunner/mac/EventSenderProxy.mm	2021-10-09 21:19:09 UTC (rev 283869)
+++ trunk/Tools/WebKitTestRunner/mac/EventSenderProxy.mm	2021-10-09 21:35:21 UTC (rev 283870)
@@ -28,6 +28,7 @@
 #import "EventSenderProxy.h"
 
 #import "CoreGraphicsTestSPI.h"
+#import "ModifierKeys.h"
 #import "PlatformWebView.h"
 #import "StringFunctions.h"
 #import "TestController.h"
@@ -238,13 +239,6 @@
     NoMouseButton = -2
 };
 
-struct KeyMappingEntry {
-    int macKeyCode;
-    int macNumpadKeyCode;
-    unichar character;
-    NSString* characterName;
-};
-
 static NSEventType eventTypeForMouseButtonAndAction(int button, MouseAction action)
 {
     switch (button) {
@@ -632,203 +626,18 @@
 
 void EventSenderProxy::keyDown(WKStringRef key, WKEventModifiers modifiers, unsigned keyLocation)
 {
-    NSString* character = toWTFString(key);
+    RetainPtr<ModifierKeys> modifierKeys = [ModifierKeys modifierKeysWithKey:toWTFString(key) modifiers:buildModifierFlags(modifiers) keyLocation:keyLocation];
 
-    NSString *eventCharacter = character;
-    unsigned short keyCode = 0;
-    if ([character isEqualToString:@"leftArrow"]) {
-        const unichar ch = NSLeftArrowFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x7B;
-    } else if ([character isEqualToString:@"rightArrow"]) {
-        const unichar ch = NSRightArrowFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x7C;
-    } else if ([character isEqualToString:@"upArrow"]) {
-        const unichar ch = NSUpArrowFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x7E;
-    } else if ([character isEqualToString:@"downArrow"]) {
-        const unichar ch = NSDownArrowFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x7D;
-    } else if ([character isEqualToString:@"pageUp"]) {
-        const unichar ch = NSPageUpFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x74;
-    } else if ([character isEqualToString:@"pageDown"]) {
-        const unichar ch = NSPageDownFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x79;
-    } else if ([character isEqualToString:@"home"]) {
-        const unichar ch = NSHomeFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x73;
-    } else if ([character isEqualToString:@"end"]) {
-        const unichar ch = NSEndFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x77;
-    } else if ([character isEqualToString:@"insert"]) {
-        const unichar ch = NSInsertFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x72;
-    } else if ([character isEqualToString:@"delete"]) {
-        const unichar ch = NSDeleteFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x75;
-    } else if ([character isEqualToString:@"printScreen"]) {
-        const unichar ch = NSPrintScreenFunctionKey;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x0; // There is no known virtual key code for PrintScreen.
-    } else if ([character isEqualToString:@"cyrillicSmallLetterA"]) {
-        const unichar ch = 0x0430;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x3; // Shares key with "F" on Russian layout.
-    } else if ([character isEqualToString:@"leftControl"]) {
-        const unichar ch = 0xFFE3;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x3B;
-    } else if ([character isEqualToString:@"leftShift"]) {
-        const unichar ch = 0xFFE1;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x38;
-    } else if ([character isEqualToString:@"leftAlt"]) {
-        const unichar ch = 0xFFE7;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x3A;
-    } else if ([character isEqualToString:@"rightControl"]) {
-        const unichar ch = 0xFFE4;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x3E;
-    } else if ([character isEqualToString:@"rightShift"]) {
-        const unichar ch = 0xFFE2;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x3C;
-    } else if ([character isEqualToString:@"rightAlt"]) {
-        const unichar ch = 0xFFE8;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x3D;
-    } else if ([character isEqualToString:@"escape"]) {
-        const unichar ch = 0x1B;
-        eventCharacter = [NSString stringWithCharacters:&ch length:1];
-        keyCode = 0x35;
-    }
-
-    // Compare the input string with the function-key names defined by the DOM spec (i.e. "F1",...,"F24").
-    // If the input string is a function-key name, set its key code.
-    for (unsigned i = 1; i <= 24; i++) {
-        if ([character isEqualToString:[NSString stringWithFormat:@"F%u", i]]) {
-            const unichar ch = NSF1FunctionKey + (i - 1);
-            eventCharacter = [NSString stringWithCharacters:&ch length:1];
-            switch (i) {
-                case 1: keyCode = 0x7A; break;
-                case 2: keyCode = 0x78; break;
-                case 3: keyCode = 0x63; break;
-                case 4: keyCode = 0x76; break;
-                case 5: keyCode = 0x60; break;
-                case 6: keyCode = 0x61; break;
-                case 7: keyCode = 0x62; break;
-                case 8: keyCode = 0x64; break;
-                case 9: keyCode = 0x65; break;
-                case 10: keyCode = 0x6D; break;
-                case 11: keyCode = 0x67; break;
-                case 12: keyCode = 0x6F; break;
-                case 13: keyCode = 0x69; break;
-                case 14: keyCode = 0x6B; break;
-                case 15: keyCode = 0x71; break;
-                case 16: keyCode = 0x6A; break;
-                case 17: keyCode = 0x40; break;
-                case 18: keyCode = 0x4F; break;
-                case 19: keyCode = 0x50; break;
-                case 20: keyCode = 0x5A; break;
-            }
-        }
-    }
-
-    // FIXME: No keyCode is set for most keys.
-    if ([character isEqualToString:@"\t"])
-        keyCode = 0x30;
-    else if ([character isEqualToString:@" "])
-        keyCode = 0x31;
-    else if ([character isEqualToString:@"\r"])
-        keyCode = 0x24;
-    else if ([character isEqualToString:@"\n"])
-        keyCode = 0x4C;
-    else if ([character isEqualToString:@"\x8"])
-        keyCode = 0x33;
-    else if ([character isEqualToString:@"a"])
-        keyCode = 0x00;
-    else if ([character isEqualToString:@"b"])
-        keyCode = 0x0B;
-    else if ([character isEqualToString:@"d"])
-        keyCode = 0x02;
-    else if ([character isEqualToString:@"e"])
-        keyCode = 0x0E;
-    else if ([character isEqualToString:@"\x1b"])
-        keyCode = 0x1B;
-    else if ([character isEqualToString:@":"])
-        keyCode = 0x29;
-    else if ([character isEqualToString:@";"])
-        keyCode = 0x29;
-    else if ([character isEqualToString:@","])
-        keyCode = 0x2B;
-
-    KeyMappingEntry table[] = {
-        {0x2F, 0x41, '.', nil},
-        {0,    0x43, '*', nil},
-        {0,    0x45, '+', nil},
-        {0,    0x47, NSClearLineFunctionKey, @"clear"},
-        {0x2C, 0x4B, '/', nil},
-        {0,    0x4C, 3, @"enter" },
-        {0x1B, 0x4E, '-', nil},
-        {0x18, 0x51, '=', nil},
-        {0x1D, 0x52, '0', nil},
-        {0x12, 0x53, '1', nil},
-        {0x13, 0x54, '2', nil},
-        {0x14, 0x55, '3', nil},
-        {0x15, 0x56, '4', nil},
-        {0x17, 0x57, '5', nil},
-        {0x16, 0x58, '6', nil},
-        {0x1A, 0x59, '7', nil},
-        {0x1C, 0x5B, '8', nil},
-        {0x19, 0x5C, '9', nil},
-    };
-    for (unsigned i = 0; i < WTF_ARRAY_LENGTH(table); ++i) {
-        NSString* currentCharacterString = [NSString stringWithCharacters:&table[i].character length:1];
-        if ([character isEqualToString:currentCharacterString] || [character isEqualToString:table[i].characterName]) {
-            if (keyLocation == 0x03 /*DOM_KEY_LOCATION_NUMPAD*/)
-                keyCode = table[i].macNumpadKeyCode;
-            else
-                keyCode = table[i].macKeyCode;
-            eventCharacter = currentCharacterString;
-            break;
-        }
-    }
-
-    NSString *charactersIgnoringModifiers = eventCharacter;
-
-    int modifierFlags = 0;
-
-    if ([character length] == 1 && [character characterAtIndex:0] >= 'A' && [character characterAtIndex:0] <= 'Z') {
-        modifierFlags |= NSEventModifierFlagShift;
-        charactersIgnoringModifiers = [character lowercaseString];
-    }
-
-    modifierFlags |= buildModifierFlags(modifiers);
-
-    if (keyLocation == 0x03 /*DOM_KEY_LOCATION_NUMPAD*/)
-        modifierFlags |= NSEventModifierFlagNumericPad;
-
     NSEvent *event = [NSEvent keyEventWithType:NSEventTypeKeyDown
-                        location:NSMakePoint(5, 5)
-                        modifierFlags:modifierFlags
-                        timestamp:absoluteTimeForEventTime(currentEventTime())
-                        windowNumber:[m_testController->mainWebView()->platformWindow() windowNumber]
-                        context:[NSGraphicsContext currentContext]
-                        characters:eventCharacter
-                        charactersIgnoringModifiers:charactersIgnoringModifiers
-                        isARepeat:NO
-                        keyCode:keyCode];
+        location:NSMakePoint(5, 5)
+        modifierFlags:modifierKeys->modifierFlags
+        timestamp:absoluteTimeForEventTime(currentEventTime())
+        windowNumber:[m_testController->mainWebView()->platformWindow() windowNumber]
+        context:[NSGraphicsContext currentContext]
+        characters:modifierKeys->eventCharacter.get()
+        charactersIgnoringModifiers:modifierKeys->charactersIgnoringModifiers.get()
+        isARepeat:NO
+        keyCode:modifierKeys->keyCode];
 
     [NSApp _setCurrentEvent:event];
     [[m_testController->mainWebView()->platformWindow() firstResponder] keyDown:event];
@@ -836,14 +645,14 @@
 
     event = [NSEvent keyEventWithType:NSEventTypeKeyUp
                         location:NSMakePoint(5, 5)
-                        modifierFlags:modifierFlags
+                        modifierFlags:modifierKeys->modifierFlags
                         timestamp:absoluteTimeForEventTime(currentEventTime())
                         windowNumber:[m_testController->mainWebView()->platformWindow() windowNumber]
                         context:[NSGraphicsContext currentContext]
-                        characters:eventCharacter
-                        charactersIgnoringModifiers:charactersIgnoringModifiers
+                        characters:modifierKeys->eventCharacter.get()
+                        charactersIgnoringModifiers:modifierKeys->charactersIgnoringModifiers.get()
                         isARepeat:NO
-                        keyCode:keyCode];
+                        keyCode:modifierKeys->keyCode];
 
     [NSApp _setCurrentEvent:event];
     [[m_testController->mainWebView()->platformWindow() firstResponder] keyUp:event];
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to