Changeset 264907 in webkit


Ignore:
Timestamp:
Jul 26, 2020, 12:25:28 PM (4 years ago)
Author:
Wenson Hsieh
Message:

REGRESSION (r264690): [ iOS wk2 ] editing/selection/shift-click-includes-existing-selection.html is a flaky failure
https://bugs.webkit.org/show_bug.cgi?id=214688
<rdar://problem/65993683>

Reviewed by Darin Adler.

Source/WebCore/PAL:

Remove logging added in r264882, r264890, r264892, and r264896.

  • pal/spi/ios/GraphicsServicesSPI.h:

Source/WebKit:

Remove logging added in r264882, r264890, r264892, and r264896.

  • Platform/spi/ios/UIKitSPI.h:
  • UIProcess/ios/WKContentViewInteraction.mm:

(-[WKContentView _singleTapIdentified:]):
(-[WKContentView _singleTapRecognized:]):

  • UIProcess/ios/WebPageProxyIOS.mm:

(WebKit::WebPageProxy::commitPotentialTap):

  • WebProcess/WebPage/ios/WebPageIOS.mm:

(WebKit::WebPage::handleSyntheticClick):

Tools:

Attempt another speculative fix for this flaky test, motivated by logging introduced in r264896. This recently
introduced telemetry would suggest that this test fails when the act of handling a synthetic modifier keydown
fails to update GSKeyboardRef's live modifier flags if the keyboard layout changes mid-event, forcing the
existing GSKeyboardRef to be destroyed and rebuilt.

In this case, the keyboard layout changes from "Hebrew" to "US" when this test fails. There is only one (sane)
explanation for this, which is that one of the editing/input/ios/rtl-keyboard-input-*.html tests switch to an
RTL keyboard ("he_IL" in both cases) by swizzling out -currentInputMode and -currentInputModeInPreference on
UIKeyboardInputModeController. While the swizzling is torn down in between test runs via logic in
TestController::platformResetStateToConsistentValues, it's possible that this change hasn't propagated to
the UIKit or GraphicsServices layers -- in other words, UIApplication's GSKeyboardRef remains stuck in the
Hebrew layout until the next time -GSKeyboardForHWLayout:forceRebuild:createIfNeeded: forces the keyboard to
be rebuilt, which (in this case) seems to happen while running shift-click-includes-existing-selection.html.

For reasons that are still unclear, this lazy regeneration of the GSKeyboardRef causes GraphicsServices' live
modifier state to not update when handling a shift key down HID event. However, we might be able to fix this by
forcing UIKit to sync the default (unswizzled) keyboard layout back to its GSKeyboardRef immediately when we
stop swizzling UIKeyboardInputModeController after running a test that attempts to simulate changing keyboard
input modes.

  • WebKitTestRunner/ios/TestControllerIOS.mm:

(WTR::TestController::platformResetStateToConsistentValues):

Call -prepareKeyboardInputModeFromPreferences: to force the UIApp to update its hardware keyboard state (i.e.
GSKeyboardRef).

  • WebKitTestRunner/ios/UIScriptControllerIOS.mm:

(WTR::UIScriptControllerIOS::singleTapAtPointWithModifiers):

Also, restore this method to how it was prior to r264890, as it doesn't seem like waiting for the HID marker
event after synthesizing a keydown had any effect.

  • WebKitTestRunner/ios/mainIOS.mm:

(-[WebKitTestRunnerApp handleKeyHIDEvent:]): Deleted.

WebKitLibraries:

Remove logging added in r264882, r264890, r264892, and r264896.

  • WebKitPrivateFrameworkStubs/appletvos/13/GraphicsServices.framework/GraphicsServices.tbd:
  • WebKitPrivateFrameworkStubs/appletvos/14/GraphicsServices.framework/GraphicsServices.tbd:
  • WebKitPrivateFrameworkStubs/iOS/13/GraphicsServices.framework/GraphicsServices.tbd:
  • WebKitPrivateFrameworkStubs/iOS/14/GraphicsServices.framework/GraphicsServices.tbd:
  • WebKitPrivateFrameworkStubs/watchos/6/GraphicsServices.framework/GraphicsServices.tbd:
  • WebKitPrivateFrameworkStubs/watchos/7/GraphicsServices.framework/GraphicsServices.tbd:

LayoutTests:

Remove the failing test expectation.

  • platform/ios-simulator-wk2/TestExpectations:
Location:
trunk
Files:
20 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r264905 r264907  
     12020-07-26  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        REGRESSION (r264690): [ iOS wk2 ] editing/selection/shift-click-includes-existing-selection.html is a flaky failure
     4        https://bugs.webkit.org/show_bug.cgi?id=214688
     5        <rdar://problem/65993683>
     6
     7        Reviewed by Darin Adler.
     8
     9        Remove the failing test expectation.
     10
     11        * platform/ios-simulator-wk2/TestExpectations:
     12
    1132020-07-23  Darin Adler  <darin@apple.com>
    214
  • trunk/LayoutTests/platform/ios-simulator-wk2/TestExpectations

    r264851 r264907  
    9393webkit.org/b/214422 imported/w3c/web-platform-tests/webaudio/the-audio-api/the-audiocontext-interface/suspend-after-construct.html [ Pass Failure ]
    9494
    95 webkit.org/b/214688 editing/selection/shift-click-includes-existing-selection.html [ Pass Failure ]
    96 
    9795webkit.org/b/214730 [ Debug ] imported/w3c/web-platform-tests/webrtc/RTCSctpTransport-constructor.html [ Skip ]
    9896webkit.org/b/214730 [ Debug ] webrtc/simulcast-h264.html [ Skip ]
  • trunk/Source/WebCore/PAL/ChangeLog

    r264896 r264907  
     12020-07-26  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        REGRESSION (r264690): [ iOS wk2 ] editing/selection/shift-click-includes-existing-selection.html is a flaky failure
     4        https://bugs.webkit.org/show_bug.cgi?id=214688
     5        <rdar://problem/65993683>
     6
     7        Reviewed by Darin Adler.
     8
     9        Remove logging added in r264882, r264890, r264892, and r264896.
     10
     11        * pal/spi/ios/GraphicsServicesSPI.h:
     12
    1132020-07-26  Wenson Hsieh  <wenson_hsieh@apple.com>
    214
  • trunk/Source/WebCore/PAL/pal/spi/ios/GraphicsServicesSPI.h

    r264896 r264907  
    4646typedef struct __GSKeyboard* GSKeyboardRef;
    4747uint32_t GSKeyboardGetModifierState(GSKeyboardRef);
    48 uint32_t GSKeyboardGetLiveModifierState(GSKeyboardRef);
    4948Boolean GSEventIsHardwareKeyboardAttached();
    5049void GSEventSetHardwareKeyboardAttached(Boolean attached, uint8_t country);
    51 CFStringRef GSKeyboardGetLayout(GSKeyboardRef);
    52 uint32_t GSKeyboardGetHWKeyboardType(GSKeyboardRef);
    5350
    5451extern const char *kGSEventHardwareKeyboardAvailabilityChangedNotification;
  • trunk/Source/WebKit/ChangeLog

    r264905 r264907  
     12020-07-26  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        REGRESSION (r264690): [ iOS wk2 ] editing/selection/shift-click-includes-existing-selection.html is a flaky failure
     4        https://bugs.webkit.org/show_bug.cgi?id=214688
     5        <rdar://problem/65993683>
     6
     7        Reviewed by Darin Adler.
     8
     9        Remove logging added in r264882, r264890, r264892, and r264896.
     10
     11        * Platform/spi/ios/UIKitSPI.h:
     12        * UIProcess/ios/WKContentViewInteraction.mm:
     13        (-[WKContentView _singleTapIdentified:]):
     14        (-[WKContentView _singleTapRecognized:]):
     15        * UIProcess/ios/WebPageProxyIOS.mm:
     16        (WebKit::WebPageProxy::commitPotentialTap):
     17        * WebProcess/WebPage/ios/WebPageIOS.mm:
     18        (WebKit::WebPage::handleSyntheticClick):
     19
    1202020-07-22  Darin Adler  <darin@apple.com>
    221
  • trunk/Source/WebKit/Platform/spi/ios/UIKitSPI.h

    r264899 r264907  
    195195- (void)_enqueueHIDEvent:(IOHIDEventRef)event;
    196196- (void)_handleHIDEvent:(IOHIDEventRef)event;
    197 - (void)handleKeyHIDEvent:(IOHIDEventRef)event;
    198197- (void)handleKeyUIEvent:(UIEvent *)event;
    199198- (BOOL)_appAdoptsUISceneLifecycle;
     
    13781377@end
    13791378
    1380 @interface UIApplication (IPI)
    1381 - (GSKeyboardRef)_hardwareKeyboard:(BOOL)createIfNeeded;
    1382 @end
    1383 
    13841379WTF_EXTERN_C_BEGIN
    13851380
  • trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm

    r264882 r264907  
    27372737        RELEASE_LOG(ViewGestures, "Single tap identified. Request details on potential zoom. (%p)", self);
    27382738
    2739     WTFLogAlways("%s - modifier flags: 0x%02x", __PRETTY_FUNCTION__, WebEvent.modifierFlags);
    27402739    _page->potentialTapAtPosition(gestureRecognizer.location, shouldRequestMagnificationInformation, ++_latestTapID);
    27412740    _potentialTapInProgress = YES;
     
    28302829        m_commitPotentialTapPointerId = pointerId;
    28312830    }
    2832     WTFLogAlways("%s - modifier flags: 0x%02x", __PRETTY_FUNCTION__, WebEvent.modifierFlags);
    28332831    _page->commitPotentialTap(WebKit::webEventModifierFlags(gestureRecognizerModifierFlags(gestureRecognizer)), _layerTreeTransactionIdAtLastInteractionStart, pointerId);
    28342832
  • trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm

    r264882 r264907  
    896896void WebPageProxy::commitPotentialTap(OptionSet<WebEvent::Modifier> modifiers, TransactionID layerTreeTransactionIdAtLastTouchStart, WebCore::PointerID pointerId)
    897897{
    898     WTFLogAlways("Committing potential tap with modifiers: 0x%02x", modifiers.toRaw());
    899898    send(Messages::WebPage::CommitPotentialTap(modifiers, layerTreeTransactionIdAtLastTouchStart, pointerId));
    900899}
  • trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm

    r264882 r264907  
    719719void WebPage::handleSyntheticClick(Node& nodeRespondingToClick, const WebCore::FloatPoint& location, OptionSet<WebEvent::Modifier> modifiers, WebCore::PointerID pointerId)
    720720{
    721     WTFLogAlways("Handling synthetic click at (%.0f, %.0f) with modifiers: 0x%02x", location.x(), location.y(), modifiers.toRaw());
    722721    auto& respondingDocument = nodeRespondingToClick.document();
    723722    auto isFirstSyntheticClickOnPage = !m_hasHandledSyntheticClick;
  • trunk/Tools/ChangeLog

    r264903 r264907  
     12020-07-26  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        REGRESSION (r264690): [ iOS wk2 ] editing/selection/shift-click-includes-existing-selection.html is a flaky failure
     4        https://bugs.webkit.org/show_bug.cgi?id=214688
     5        <rdar://problem/65993683>
     6
     7        Reviewed by Darin Adler.
     8
     9        Attempt another speculative fix for this flaky test, motivated by logging introduced in r264896. This recently
     10        introduced telemetry would suggest that this test fails when the act of handling a synthetic modifier keydown
     11        fails to update `GSKeyboardRef`'s live modifier flags if the keyboard layout changes mid-event, forcing the
     12        existing `GSKeyboardRef` to be destroyed and rebuilt.
     13
     14        In this case, the keyboard layout changes from "Hebrew" to "US" when this test fails. There is only one (sane)
     15        explanation for this, which is that one of the `editing/input/ios/rtl-keyboard-input-*.html` tests switch to an
     16        RTL keyboard ("he_IL" in both cases) by swizzling out `-currentInputMode` and `-currentInputModeInPreference` on
     17        `UIKeyboardInputModeController`. While the swizzling is torn down in between test runs via logic in
     18        `TestController::platformResetStateToConsistentValues`, it's possible that this change hasn't propagated to
     19        the UIKit or GraphicsServices layers -- in other words, `UIApplication`'s `GSKeyboardRef` remains stuck in the
     20        Hebrew layout until the next time `-GSKeyboardForHWLayout:forceRebuild:createIfNeeded:` forces the keyboard to
     21        be rebuilt, which (in this case) seems to happen while running `shift-click-includes-existing-selection.html`.
     22
     23        For reasons that are still unclear, this lazy regeneration of the `GSKeyboardRef` causes GraphicsServices' live
     24        modifier state to not update when handling a shift key down HID event. However, we might be able to fix this by
     25        forcing UIKit to sync the default (unswizzled) keyboard layout back to its `GSKeyboardRef` immediately when we
     26        stop swizzling `UIKeyboardInputModeController` after running a test that attempts to simulate changing keyboard
     27        input modes.
     28
     29        * WebKitTestRunner/ios/TestControllerIOS.mm:
     30        (WTR::TestController::platformResetStateToConsistentValues):
     31
     32        Call `-prepareKeyboardInputModeFromPreferences:` to force the UIApp to update its hardware keyboard state (i.e.
     33        `GSKeyboardRef`).
     34
     35        * WebKitTestRunner/ios/UIScriptControllerIOS.mm:
     36        (WTR::UIScriptControllerIOS::singleTapAtPointWithModifiers):
     37
     38        Also, restore this method to how it was prior to r264890, as it doesn't seem like waiting for the HID marker
     39        event after synthesizing a keydown had any effect.
     40
     41        * WebKitTestRunner/ios/mainIOS.mm:
     42        (-[WebKitTestRunnerApp handleKeyHIDEvent:]): Deleted.
     43
    1442020-07-26  Diego Pino Garcia  <dpino@igalia.com>
    245
  • trunk/Tools/WebKitTestRunner/ios/TestControllerIOS.mm

    r264834 r264907  
    183183#endif
    184184
    185     m_inputModeSwizzlers.clear();
    186     m_overriddenKeyboardInputMode = nil;
     185    if (m_overriddenKeyboardInputMode) {
     186        m_overriddenKeyboardInputMode = nil;
     187        m_inputModeSwizzlers.clear();
     188        [UIKeyboardImpl.sharedInstance prepareKeyboardInputModeFromPreferences:nil];
     189    }
    187190
    188191    m_presentPopoverSwizzlers.clear();
  • trunk/Tools/WebKitTestRunner/ios/UIScriptControllerIOS.mm

    r264890 r264907  
    301301    waitForSingleTapToReset();
    302302
    303     if (!modifierFlags.isEmpty())
    304         WTFLogAlways("Synthesizing modifier keydown events.");
    305 
    306303    for (auto& modifierFlag : modifierFlags)
    307304        [[HIDEventGenerator sharedHIDEventGenerator] keyDown:modifierFlag];
    308305
    309     auto dispatchTap = [this, protectedThis = makeRef(*this), modifierFlags = WTFMove(modifierFlags), block = WTFMove(block), location]() mutable {
    310         if (!modifierFlags.isEmpty())
    311             WTFLogAlways("Synthesizing tap.");
    312 
    313         [[HIDEventGenerator sharedHIDEventGenerator] tap:globalToContentCoordinates(webView(), location.x(), location.y()) completionBlock:[protectedThis, modifierFlags = WTFMove(modifierFlags), block = WTFMove(block)] () mutable {
    314             if (!protectedThis->m_context)
    315                 return;
    316 
    317             if (!modifierFlags.isEmpty())
    318                 WTFLogAlways("Synthesizing modifier keyup events.");
    319 
    320             for (size_t i = modifierFlags.size(); i; ) {
    321                 --i;
    322                 [[HIDEventGenerator sharedHIDEventGenerator] keyUp:modifierFlags[i]];
    323             }
    324             [[HIDEventGenerator sharedHIDEventGenerator] sendMarkerHIDEventWithCompletionBlock:block.get()];
    325         }];
    326     };
    327 
    328     if (modifierFlags.isEmpty())
    329         dispatchTap();
    330     else
    331         [[HIDEventGenerator sharedHIDEventGenerator] sendMarkerHIDEventWithCompletionBlock:dispatchTap];
     306    [[HIDEventGenerator sharedHIDEventGenerator] tap:globalToContentCoordinates(webView(), location.x(), location.y()) completionBlock:[this, protectedThis = makeRef(*this), modifierFlags = WTFMove(modifierFlags), block = WTFMove(block)] () mutable {
     307        if (!m_context)
     308            return;
     309
     310        for (size_t i = modifierFlags.size(); i; ) {
     311            --i;
     312            [[HIDEventGenerator sharedHIDEventGenerator] keyUp:modifierFlags[i]];
     313        }
     314        [[HIDEventGenerator sharedHIDEventGenerator] sendMarkerHIDEventWithCompletionBlock:block.get()];
     315    }];
    332316}
    333317
  • trunk/Tools/WebKitTestRunner/ios/mainIOS.mm

    r264899 r264907  
    2929#import "TestController.h"
    3030#import "UIKitSPI.h"
    31 #import <pal/spi/ios/GraphicsServicesSPI.h>
    3231
    3332static int _argc;
     
    5655}
    5756
    58 - (void)handleKeyHIDEvent:(IOHIDEventRef)event
    59 {
    60     {
    61         auto keyboard = [self _hardwareKeyboard:NO];
    62         WTFLogAlways("(Before): keyboard %p has modifier state: 0x%02x; layout:%@; type: %d", keyboard, GSKeyboardGetLiveModifierState(keyboard), (__bridge NSString *)GSKeyboardGetLayout(keyboard), GSKeyboardGetHWKeyboardType(keyboard));
    63     }
    64     [super handleKeyHIDEvent:event];
    65     {
    66         auto keyboard = [self _hardwareKeyboard:NO];
    67         WTFLogAlways("(After): keyboard %p has modifier state: 0x%02x; layout:%@; type: %d", keyboard, GSKeyboardGetLiveModifierState(keyboard), (__bridge NSString *)GSKeyboardGetLayout(keyboard), GSKeyboardGetHWKeyboardType(keyboard));
    68     }
    69 }
    70 
    7157- (void)_handleHIDEvent:(IOHIDEventRef)event
    7258{
  • trunk/WebKitLibraries/ChangeLog

    r264896 r264907  
     12020-07-26  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        REGRESSION (r264690): [ iOS wk2 ] editing/selection/shift-click-includes-existing-selection.html is a flaky failure
     4        https://bugs.webkit.org/show_bug.cgi?id=214688
     5        <rdar://problem/65993683>
     6
     7        Reviewed by Darin Adler.
     8
     9        Remove logging added in r264882, r264890, r264892, and r264896.
     10
     11        * WebKitPrivateFrameworkStubs/appletvos/13/GraphicsServices.framework/GraphicsServices.tbd:
     12        * WebKitPrivateFrameworkStubs/appletvos/14/GraphicsServices.framework/GraphicsServices.tbd:
     13        * WebKitPrivateFrameworkStubs/iOS/13/GraphicsServices.framework/GraphicsServices.tbd:
     14        * WebKitPrivateFrameworkStubs/iOS/14/GraphicsServices.framework/GraphicsServices.tbd:
     15        * WebKitPrivateFrameworkStubs/watchos/6/GraphicsServices.framework/GraphicsServices.tbd:
     16        * WebKitPrivateFrameworkStubs/watchos/7/GraphicsServices.framework/GraphicsServices.tbd:
     17
    1182020-07-26  Wenson Hsieh  <wenson_hsieh@apple.com>
    219
  • trunk/WebKitLibraries/WebKitPrivateFrameworkStubs/appletvos/13/GraphicsServices.framework/GraphicsServices.tbd

    r264896 r264907  
    99    symbols:         [ _GSCurrentEventTimestamp, _GSEventIsHardwareKeyboardAttached, _GSEventSetHardwareKeyboardAttached,
    1010                       _GSFontInitialize, _GSFontPurgeFontCache, _GSInitialize, _GSKeyboardGetModifierState,
    11                        _GSKeyboardGetLiveModifierState, _GSSystemRootDirectory, _kGSEventHardwareKeyboardAvailabilityChangedNotification,
    12                        _GSKeyboardGetLayout, _GSKeyboardGetHWKeyboardType ]
     11                       _GSSystemRootDirectory, _kGSEventHardwareKeyboardAvailabilityChangedNotification]
    1312...
  • trunk/WebKitLibraries/WebKitPrivateFrameworkStubs/appletvos/14/GraphicsServices.framework/GraphicsServices.tbd

    r264896 r264907  
    99    symbols:         [ _GSCurrentEventTimestamp, _GSEventIsHardwareKeyboardAttached, _GSEventSetHardwareKeyboardAttached,
    1010                       _GSFontInitialize, _GSFontPurgeFontCache, _GSInitialize, _GSKeyboardGetModifierState,
    11                        _GSKeyboardGetLiveModifierState, _GSSystemRootDirectory, _kGSEventHardwareKeyboardAvailabilityChangedNotification,
    12                        _GSKeyboardGetLayout, _GSKeyboardGetHWKeyboardType ]
     11                       _GSSystemRootDirectory, _kGSEventHardwareKeyboardAvailabilityChangedNotification]
    1312...
  • trunk/WebKitLibraries/WebKitPrivateFrameworkStubs/iOS/13/GraphicsServices.framework/GraphicsServices.tbd

    r264896 r264907  
    99    symbols:         [ _GSCurrentEventTimestamp, _GSEventIsHardwareKeyboardAttached, _GSEventSetHardwareKeyboardAttached,
    1010                       _GSFontInitialize, _GSFontPurgeFontCache, _GSInitialize, _GSKeyboardGetModifierState,
    11                        _GSKeyboardGetLiveModifierState, _GSSystemRootDirectory, _kGSEventHardwareKeyboardAvailabilityChangedNotification,
    12                        _GSKeyboardGetLayout, _GSKeyboardGetHWKeyboardType ]
     11                       _GSSystemRootDirectory, _kGSEventHardwareKeyboardAvailabilityChangedNotification]
    1312...
  • trunk/WebKitLibraries/WebKitPrivateFrameworkStubs/iOS/14/GraphicsServices.framework/GraphicsServices.tbd

    r264896 r264907  
    99    symbols:         [ _GSCurrentEventTimestamp, _GSEventIsHardwareKeyboardAttached, _GSEventSetHardwareKeyboardAttached,
    1010                       _GSFontInitialize, _GSFontPurgeFontCache, _GSInitialize, _GSKeyboardGetModifierState,
    11                        _GSKeyboardGetLiveModifierState, _GSSystemRootDirectory, _kGSEventHardwareKeyboardAvailabilityChangedNotification,
    12                        _GSKeyboardGetLayout, _GSKeyboardGetHWKeyboardType ]
     11                       _GSSystemRootDirectory, _kGSEventHardwareKeyboardAvailabilityChangedNotification]
    1312...
  • trunk/WebKitLibraries/WebKitPrivateFrameworkStubs/watchos/6/GraphicsServices.framework/GraphicsServices.tbd

    r264896 r264907  
    99    symbols:         [ _GSCurrentEventTimestamp, _GSEventIsHardwareKeyboardAttached, _GSEventSetHardwareKeyboardAttached,
    1010                       _GSFontInitialize, _GSFontPurgeFontCache, _GSInitialize, _GSKeyboardGetModifierState,
    11                        _GSKeyboardGetLiveModifierState, _GSSystemRootDirectory, _kGSEventHardwareKeyboardAvailabilityChangedNotification,
    12                        _GSKeyboardGetLayout, _GSKeyboardGetHWKeyboardType ]
     11                       _GSSystemRootDirectory, _kGSEventHardwareKeyboardAvailabilityChangedNotification]
    1312...
  • trunk/WebKitLibraries/WebKitPrivateFrameworkStubs/watchos/7/GraphicsServices.framework/GraphicsServices.tbd

    r264896 r264907  
    99    symbols:         [ _GSCurrentEventTimestamp, _GSEventIsHardwareKeyboardAttached, _GSEventSetHardwareKeyboardAttached,
    1010                       _GSFontInitialize, _GSFontPurgeFontCache, _GSInitialize, _GSKeyboardGetModifierState,
    11                        _GSKeyboardGetLiveModifierState, _GSSystemRootDirectory, _kGSEventHardwareKeyboardAvailabilityChangedNotification,
    12                        _GSKeyboardGetLayout, _GSKeyboardGetHWKeyboardType ]
     11                       _GSSystemRootDirectory, _kGSEventHardwareKeyboardAvailabilityChangedNotification]
    1312...
Note: See TracChangeset for help on using the changeset viewer.