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];