Title: [238047] trunk
Revision
238047
Author
dba...@webkit.org
Date
2018-11-09 11:10:27 -0800 (Fri, 09 Nov 2018)

Log Message

[iOS] Draw caps lock indicator in password fields
https://bugs.webkit.org/show_bug.cgi?id=190565
<rdar://problem/45262343>

Reviewed by Dean Jackson.

Source/WebCore:

Draw the caps lock indicator in a focused password field on iOS. This makes the behavior of password
fields on iOS more closely match the behavior of password fields on Mac. For now, we only draw the
indicator when caps locks is enabled via the hardware keyboard. We will look to support the software
keyboard in a subsequent commit (see <https://bugs.webkit.org/show_bug.cgi?id=191475>).

The majority of this patch is implementing PlatformKeyboardEvent::currentCapsLockState() for iOS.
In Legacy WebKit, the implementation boils down to calling call -[::WebEvent modifierFlags]. In
Modern WebKit the UIProcess is responsible for -[::WebEvent modifierFlags] and passing it the
WebProcess to store such that invocations of PlatformKeyboardEvent::currentCapsLockState() consult
the store in the WebProcess. A smaller part of this patch is having both the legacy and modern
web views listen for keyboard availability changes so as to update the the caps lock state when
a hardware keyboard is detached or attached.

* WebCore.xcodeproj/project.pbxproj:
* page/EventHandler.cpp:
(WebCore::EventHandler::capsLockStateMayHaveChanged const): Extracted from EventHandler::internalKeyEvent()
so that it can shared between WebCore, Modern WebKit, and Legacy WebKit code.
(WebCore::EventHandler::internalKeyEvent): Modified to call capsLockStateMayHaveChanged().
* page/EventHandler.h:
* platform/cocoa/KeyEventCocoa.mm:
(WebCore::PlatformKeyboardEvent::currentCapsLockState): Moved from KeyEventMac.mm.
(WebCore::PlatformKeyboardEvent::getCurrentModifierState): Moved from KeyEventMac.mm.
* platform/ios/KeyEventIOS.mm:
(WebCore::PlatformKeyboardEvent::currentStateOfModifierKeys): Fetch the current modifier state.
(WebCore::PlatformKeyboardEvent::currentCapsLockState): Deleted; we now use the Cocoa implementation.
(WebCore::PlatformKeyboardEvent::getCurrentModifierState): Deleted; we now use the Cocoa implementation.
* platform/ios/WebEvent.h:
* platform/ios/WebEvent.mm:
(+[WebEvent modifierFlags]): Added.
* platform/mac/KeyEventMac.mm:
(WebCore::PlatformKeyboardEvent::currentCapsLockState): Deleted; moved to KeyEventCocoa.mm to be shared
by both Mac and iOS.
(WebCore::PlatformKeyboardEvent::getCurrentModifierState): Deleted; moved to KeyEventCocoa.mm to be shared
by both Mac and iOS.
* rendering/RenderThemeCocoa.h:
* rendering/RenderThemeCocoa.mm:
(WebCore::RenderThemeCocoa::shouldHaveCapsLockIndicator const): Moved from RenderThemeMac.mm.
* rendering/RenderThemeIOS.h:
* rendering/RenderThemeIOS.mm:
(WebCore::RenderThemeIOS::shouldHaveCapsLockIndicator const): Deleted.
* rendering/RenderThemeMac.h:
* rendering/RenderThemeMac.mm:
(WebCore::RenderThemeMac::shouldHaveCapsLockIndicator const): Deleted; moved to RenderThemeCocoa.mm to be
shared by both Mac and iOS.

Source/WebCore/PAL:

Forward declare some more SPI.

* pal/spi/ios/GraphicsServicesSPI.h:
* pal/spi/ios/UIKitSPI.h:

Source/WebKit:

Notify the WebContent process with the current modifer state on window activation changes. Notify
the WebContent process when hardware keyboard availability changes (e.g. a keyboard is attached).

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _initializeWithConfiguration:]): Register for hardware keyboard availability changed notifications.
(-[WKWebView dealloc]): Unregister from hardware availability changed notifications.
(hardwareKeyboardAvailabilityChangedCallback): Added.
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::updateCurrentModifierState): Compile this code when building for iOS.
* UIProcess/WebPageProxy.h:
* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView _handleKeyUIEvent:]): Update the current modifier state if this event is a hardware
keyboard flags changed event.
* UIProcess/ios/WebPageProxyIOS.mm:
(WebKit::WebPageProxy::hardwareKeyboardAvailabilityChanged): Added.

* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:
* WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::hardwareKeyboardAvailabilityChanged):
Added new message HardwareKeyboardAvailabilityChanged. Notify the focused HTML input element (if we have
one) that the caps lock state may have changed when we receive message HardwareKeyboardAvailabilityChanged
so that we toggle visibility of the caps lock indicator.

Source/WebKitLegacy/mac:

Update the caps lock state when a hardware keyboard is attached or detached.

* WebView/WebHTMLView.mm:
(hardwareKeyboardAvailabilityChangedCallback): Added.
(-[WebHTMLView initWithFrame:]): Register for hardware keyboard availability changed notifications.
(-[WebHTMLView dealloc]): Unregister from hardware keyboard availability changed notifications.

WebKitLibraries:

Expose some more symbols.

* WebKitPrivateFrameworkStubs/iOS/12/GraphicsServices.framework/GraphicsServices.tbd:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (238046 => 238047)


--- trunk/Source/WebCore/ChangeLog	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebCore/ChangeLog	2018-11-09 19:10:27 UTC (rev 238047)
@@ -1,3 +1,56 @@
+2018-11-09  Daniel Bates  <daba...@apple.com>
+
+        [iOS] Draw caps lock indicator in password fields
+        https://bugs.webkit.org/show_bug.cgi?id=190565
+        <rdar://problem/45262343>
+
+        Reviewed by Dean Jackson.
+
+        Draw the caps lock indicator in a focused password field on iOS. This makes the behavior of password
+        fields on iOS more closely match the behavior of password fields on Mac. For now, we only draw the
+        indicator when caps locks is enabled via the hardware keyboard. We will look to support the software
+        keyboard in a subsequent commit (see <https://bugs.webkit.org/show_bug.cgi?id=191475>).
+
+        The majority of this patch is implementing PlatformKeyboardEvent::currentCapsLockState() for iOS.
+        In Legacy WebKit, the implementation boils down to calling call -[::WebEvent modifierFlags]. In
+        Modern WebKit the UIProcess is responsible for -[::WebEvent modifierFlags] and passing it the
+        WebProcess to store such that invocations of PlatformKeyboardEvent::currentCapsLockState() consult
+        the store in the WebProcess. A smaller part of this patch is having both the legacy and modern
+        web views listen for keyboard availability changes so as to update the the caps lock state when
+        a hardware keyboard is detached or attached.
+
+        * WebCore.xcodeproj/project.pbxproj:
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::capsLockStateMayHaveChanged const): Extracted from EventHandler::internalKeyEvent()
+        so that it can shared between WebCore, Modern WebKit, and Legacy WebKit code.
+        (WebCore::EventHandler::internalKeyEvent): Modified to call capsLockStateMayHaveChanged().
+        * page/EventHandler.h:
+        * platform/cocoa/KeyEventCocoa.mm:
+        (WebCore::PlatformKeyboardEvent::currentCapsLockState): Moved from KeyEventMac.mm.
+        (WebCore::PlatformKeyboardEvent::getCurrentModifierState): Moved from KeyEventMac.mm.
+        * platform/ios/KeyEventIOS.mm:
+        (WebCore::PlatformKeyboardEvent::currentStateOfModifierKeys): Fetch the current modifier state.
+        (WebCore::PlatformKeyboardEvent::currentCapsLockState): Deleted; we now use the Cocoa implementation.
+        (WebCore::PlatformKeyboardEvent::getCurrentModifierState): Deleted; we now use the Cocoa implementation.
+        * platform/ios/WebEvent.h:
+        * platform/ios/WebEvent.mm:
+        (+[WebEvent modifierFlags]): Added.
+        * platform/mac/KeyEventMac.mm:
+        (WebCore::PlatformKeyboardEvent::currentCapsLockState): Deleted; moved to KeyEventCocoa.mm to be shared
+        by both Mac and iOS.
+        (WebCore::PlatformKeyboardEvent::getCurrentModifierState): Deleted; moved to KeyEventCocoa.mm to be shared
+        by both Mac and iOS.
+        * rendering/RenderThemeCocoa.h:
+        * rendering/RenderThemeCocoa.mm:
+        (WebCore::RenderThemeCocoa::shouldHaveCapsLockIndicator const): Moved from RenderThemeMac.mm.
+        * rendering/RenderThemeIOS.h:
+        * rendering/RenderThemeIOS.mm:
+        (WebCore::RenderThemeIOS::shouldHaveCapsLockIndicator const): Deleted.
+        * rendering/RenderThemeMac.h:
+        * rendering/RenderThemeMac.mm:
+        (WebCore::RenderThemeMac::shouldHaveCapsLockIndicator const): Deleted; moved to RenderThemeCocoa.mm to be
+        shared by both Mac and iOS.
+
 2018-11-09  Chris Dumez  <cdu...@apple.com>
 
         Unreviewed attempt to fix WinCairo build after r238039.

Modified: trunk/Source/WebCore/PAL/ChangeLog (238046 => 238047)


--- trunk/Source/WebCore/PAL/ChangeLog	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebCore/PAL/ChangeLog	2018-11-09 19:10:27 UTC (rev 238047)
@@ -1,3 +1,16 @@
+2018-11-09  Daniel Bates  <daba...@apple.com>
+
+        [iOS] Draw caps lock indicator in password fields
+        https://bugs.webkit.org/show_bug.cgi?id=190565
+        <rdar://problem/45262343>
+
+        Reviewed by Dean Jackson.
+
+        Forward declare some more SPI.
+
+        * pal/spi/ios/GraphicsServicesSPI.h:
+        * pal/spi/ios/UIKitSPI.h:
+
 2018-11-08  Megan Gardner  <megan_gard...@apple.com>
 
         Adopt Reveal Framework to replace Lookup

Modified: trunk/Source/WebCore/PAL/pal/spi/ios/GraphicsServicesSPI.h (238046 => 238047)


--- trunk/Source/WebCore/PAL/pal/spi/ios/GraphicsServicesSPI.h	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebCore/PAL/pal/spi/ios/GraphicsServicesSPI.h	2018-11-09 19:10:27 UTC (rev 238047)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2014-2018 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -43,6 +43,12 @@
 void GSFontInitialize(void);
 void GSFontPurgeFontCache(void);
 
+typedef struct __GSKeyboard* GSKeyboardRef;
+uint32_t GSKeyboardGetModifierState(GSKeyboardRef);
+Boolean GSEventIsHardwareKeyboardAttached();
+
+extern const char *kGSEventHardwareKeyboardAvailabilityChangedNotification;
+
 WTF_EXTERN_C_END
 
 #endif

Modified: trunk/Source/WebCore/PAL/pal/spi/ios/UIKitSPI.h (238046 => 238047)


--- trunk/Source/WebCore/PAL/pal/spi/ios/UIKitSPI.h	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebCore/PAL/pal/spi/ios/UIKitSPI.h	2018-11-09 19:10:27 UTC (rev 238047)
@@ -23,6 +23,10 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+WTF_EXTERN_C_BEGIN
+typedef struct __GSKeyboard* GSKeyboardRef;
+WTF_EXTERN_C_END
+
 #if USE(APPLE_INTERNAL_SDK)
 
 #import <UIKit/NSParagraphStyle_Private.h>
@@ -44,6 +48,7 @@
 
 @interface UIApplication ()
 + (UIApplicationSceneClassicMode)_classicMode;
+- (GSKeyboardRef)_hardwareKeyboard;
 @end
 
 #else
@@ -75,10 +80,9 @@
 @end
 
 @interface UIApplication ()
-
 - (BOOL)_isClassic;
 + (UIApplicationSceneClassicMode)_classicMode;
-
+- (GSKeyboardRef)_hardwareKeyboard;
 @end
 
 @interface UIColor ()

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (238046 => 238047)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2018-11-09 19:10:27 UTC (rev 238047)
@@ -13687,6 +13687,7 @@
 		CE2849881CA3614600B4A57F /* ContentSecurityPolicyDirectiveNames.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ContentSecurityPolicyDirectiveNames.cpp; path = csp/ContentSecurityPolicyDirectiveNames.cpp; sourceTree = "<group>"; };
 		CE5CB1B314EDAB6F00BB2795 /* EventSender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventSender.h; sourceTree = "<group>"; };
 		CE5FA253209E48C50051D700 /* ContentSecurityPolicyClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ContentSecurityPolicyClient.h; path = csp/ContentSecurityPolicyClient.h; sourceTree = "<group>"; };
+		CE68C8FF21924EE5001230B3 /* PlatformKeyboardEvent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = PlatformKeyboardEvent.cpp; sourceTree = "<group>"; };
 		CE6D89294C7AACE0AD89B3DD /* MathMLMencloseElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MathMLMencloseElement.h; sourceTree = "<group>"; };
 		CE6DADF71C591E6A003F6A88 /* ContentSecurityPolicyResponseHeaders.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ContentSecurityPolicyResponseHeaders.cpp; path = csp/ContentSecurityPolicyResponseHeaders.cpp; sourceTree = "<group>"; };
 		CE6DADF81C591E6A003F6A88 /* ContentSecurityPolicyResponseHeaders.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ContentSecurityPolicyResponseHeaders.h; path = csp/ContentSecurityPolicyResponseHeaders.h; sourceTree = "<group>"; };
@@ -25089,6 +25090,7 @@
 				A14978701ABAF3A500CEF7E4 /* PlatformContentFilter.h */,
 				BC5C76291497FE1400BC4775 /* PlatformEvent.h */,
 				A723F77A1484CA4C008C6DBE /* PlatformExportMacros.h */,
+				CE68C8FF21924EE5001230B3 /* PlatformKeyboardEvent.cpp */,
 				935C476609AC4D4300A6AAB4 /* PlatformKeyboardEvent.h */,
 				935C476709AC4D4300A6AAB4 /* PlatformMouseEvent.h */,
 				C5BAC16F14E30E4700008837 /* PlatformPasteboard.h */,

Modified: trunk/Source/WebCore/page/EventHandler.cpp (238046 => 238047)


--- trunk/Source/WebCore/page/EventHandler.cpp	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebCore/page/EventHandler.cpp	2018-11-09 19:10:27 UTC (rev 238047)
@@ -3162,6 +3162,14 @@
     return wasHandled;
 }
 
+void EventHandler::capsLockStateMayHaveChanged() const
+{
+    auto* focusedElement = m_frame.document()->focusedElement();
+    if (!is<HTMLInputElement>(focusedElement))
+        return;
+    downcast<HTMLInputElement>(*focusedElement).capsLockStateMayHaveChanged();
+}
+
 bool EventHandler::internalKeyEvent(const PlatformKeyboardEvent& initialKeyEvent)
 {
     Ref<Frame> protectedFrame(m_frame);
@@ -3194,12 +3202,8 @@
     }
 #endif
 
-    if (initialKeyEvent.windowsVirtualKeyCode() == VK_CAPITAL) {
-        if (auto* element = m_frame.document()->focusedElement()) {
-            if (is<HTMLInputElement>(*element))
-                downcast<HTMLInputElement>(*element).capsLockStateMayHaveChanged();
-        }
-    }
+    if (initialKeyEvent.windowsVirtualKeyCode() == VK_CAPITAL)
+        capsLockStateMayHaveChanged();
 
 #if ENABLE(PAN_SCROLLING)
     if (m_frame.mainFrame().eventHandler().panScrollInProgress()) {

Modified: trunk/Source/WebCore/page/EventHandler.h (238046 => 238047)


--- trunk/Source/WebCore/page/EventHandler.h	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebCore/page/EventHandler.h	2018-11-09 19:10:27 UTC (rev 238047)
@@ -256,6 +256,7 @@
     WEBCORE_EXPORT bool handleAccessKey(const PlatformKeyboardEvent&);
     WEBCORE_EXPORT bool keyEvent(const PlatformKeyboardEvent&);
     void defaultKeyboardEventHandler(KeyboardEvent&);
+    WEBCORE_EXPORT void capsLockStateMayHaveChanged() const;
 
     bool accessibilityPreventsEventPropagation(KeyboardEvent&);
     WEBCORE_EXPORT void handleKeyboardSelectionMovementForAccessibility(KeyboardEvent&);

Modified: trunk/Source/WebCore/platform/cocoa/KeyEventCocoa.mm (238046 => 238047)


--- trunk/Source/WebCore/platform/cocoa/KeyEventCocoa.mm	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebCore/platform/cocoa/KeyEventCocoa.mm	2018-11-09 19:10:27 UTC (rev 238047)
@@ -27,6 +27,7 @@
 #import "KeyEventCocoa.h"
 
 #import "Logging.h"
+#import "PlatformKeyboardEvent.h"
 #import "WindowsKeyboardCodes.h"
 #import <wtf/ASCIICType.h>
 #import <wtf/text/WTFString.h>
@@ -39,6 +40,20 @@
 
 namespace WebCore {
 
+bool PlatformKeyboardEvent::currentCapsLockState()
+{
+    return currentStateOfModifierKeys().contains(PlatformEvent::Modifier::CapsLockKey);
+}
+
+void PlatformKeyboardEvent::getCurrentModifierState(bool& shiftKey, bool& ctrlKey, bool& altKey, bool& metaKey)
+{
+    auto currentModifiers = currentStateOfModifierKeys();
+    shiftKey = currentModifiers.contains(PlatformEvent::Modifier::ShiftKey);
+    ctrlKey = currentModifiers.contains(PlatformEvent::Modifier::CtrlKey);
+    altKey = currentModifiers.contains(PlatformEvent::Modifier::AltKey);
+    metaKey = currentModifiers.contains(PlatformEvent::Modifier::MetaKey);
+}
+
 // https://w3c.github.io/uievents-key/
 String keyForCharCode(unichar charCode)
 {

Modified: trunk/Source/WebCore/platform/ios/KeyEventIOS.mm (238046 => 238047)


--- trunk/Source/WebCore/platform/ios/KeyEventIOS.mm	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebCore/platform/ios/KeyEventIOS.mm	2018-11-09 19:10:27 UTC (rev 238047)
@@ -31,8 +31,10 @@
 #import "KeyEventCocoa.h"
 #import "KeyEventCodesIOS.h"
 #import "NotImplemented.h"
+#import "WebEvent.h"
 #import "WindowsKeyboardCodes.h"
 #import <pal/spi/cocoa/IOKitSPI.h>
+#import <wtf/MainThread.h>
 
 using namespace WTF;
 
@@ -312,19 +314,29 @@
     }
 }
 
-bool PlatformKeyboardEvent::currentCapsLockState()
+OptionSet<PlatformEvent::Modifier> PlatformKeyboardEvent::currentStateOfModifierKeys()
 {
-    notImplemented();
-    return false;
-}
+    // s_currentModifiers is only set in the WebContent process, not in the UI process.
+    if (s_currentModifiers) {
+        ASSERT(isMainThread());
+        return *s_currentModifiers;
+    }
 
-void PlatformKeyboardEvent::getCurrentModifierState(bool& shiftKey, bool& ctrlKey, bool& altKey, bool& metaKey)
-{
-    notImplemented();
-    shiftKey = false;
-    ctrlKey = false;
-    altKey = false;
-    metaKey = false;
+    ::WebEventFlags currentModifiers = [::WebEvent modifierFlags];
+
+    OptionSet<PlatformEvent::Modifier> modifiers;
+    if (currentModifiers & ::WebEventFlagMaskShiftKey)
+        modifiers.add(PlatformEvent::Modifier::ShiftKey);
+    if (currentModifiers & ::WebEventFlagMaskControlKey)
+        modifiers.add(PlatformEvent::Modifier::CtrlKey);
+    if (currentModifiers & ::WebEventFlagMaskOptionKey)
+        modifiers.add(PlatformEvent::Modifier::AltKey);
+    if (currentModifiers & ::WebEventFlagMaskCommandKey)
+        modifiers.add(PlatformEvent::Modifier::MetaKey);
+    if (currentModifiers & ::WebEventFlagMaskLeftCapsLockKey)
+        modifiers.add(PlatformEvent::Modifier::CapsLockKey);
+
+    return modifiers;
 }
 
 }

Modified: trunk/Source/WebCore/platform/ios/WebEvent.h (238046 => 238047)


--- trunk/Source/WebCore/platform/ios/WebEvent.h	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebCore/platform/ios/WebEvent.h	2018-11-09 19:10:27 UTC (rev 238047)
@@ -216,6 +216,8 @@
 
 @property(nonatomic) BOOL wasHandled;
 
+@property (class, readonly) WebEventFlags modifierFlags;
+
 @end
 
 #endif // TARGET_OS_IPHONE

Modified: trunk/Source/WebCore/platform/ios/WebEvent.mm (238046 => 238047)


--- trunk/Source/WebCore/platform/ios/WebEvent.mm	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebCore/platform/ios/WebEvent.mm	2018-11-09 19:10:27 UTC (rev 238047)
@@ -36,7 +36,15 @@
 #import "KeyEventCodesIOS.h"
 #import "WAKAppKitStubs.h"
 #import <pal/spi/cocoa/IOKitSPI.h>
+#import <pal/spi/ios/GraphicsServicesSPI.h>
+#import <pal/spi/ios/UIKitSPI.h>
+#import <wtf/SoftLinking.h>
 
+SOFT_LINK_FRAMEWORK(UIKit)
+SOFT_LINK_CLASS(UIKit, UIApplication);
+
+#define UIApplication getUIApplicationClass()
+
 using WebCore::windowsKeyCodeForKeyCode;
 using WebCore::windowsKeyCodeForCharCode;
 
@@ -491,6 +499,11 @@
     return _gestureRotation;
 }
 
++ (WebEventFlags)modifierFlags
+{
+    return GSEventIsHardwareKeyboardAttached() ? GSKeyboardGetModifierState([UIApplication sharedApplication]._hardwareKeyboard) : 0;
+}
+
 @end
 
 #endif // PLATFORM(IOS_FAMILY)

Modified: trunk/Source/WebCore/platform/mac/KeyEventMac.mm (238046 => 238047)


--- trunk/Source/WebCore/platform/mac/KeyEventMac.mm	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebCore/platform/mac/KeyEventMac.mm	2018-11-09 19:10:27 UTC (rev 238047)
@@ -258,21 +258,6 @@
     }
 }
 
-bool PlatformKeyboardEvent::currentCapsLockState()
-{
-    auto currentModifiers = currentStateOfModifierKeys();
-    return currentModifiers.contains(PlatformEvent::Modifier::CapsLockKey);
-}
-
-void PlatformKeyboardEvent::getCurrentModifierState(bool& shiftKey, bool& ctrlKey, bool& altKey, bool& metaKey)
-{
-    auto currentModifiers = currentStateOfModifierKeys();
-    shiftKey = currentModifiers.contains(PlatformEvent::Modifier::ShiftKey);
-    ctrlKey = currentModifiers.contains(PlatformEvent::Modifier::CtrlKey);
-    altKey = currentModifiers.contains(PlatformEvent::Modifier::AltKey);
-    metaKey = currentModifiers.contains(PlatformEvent::Modifier::MetaKey);
-}
-
 OptionSet<PlatformEvent::Modifier> PlatformKeyboardEvent::currentStateOfModifierKeys()
 {
 #if ENABLE(WEBPROCESS_WINDOWSERVER_BLOCKING)

Modified: trunk/Source/WebCore/rendering/RenderThemeCocoa.h (238046 => 238047)


--- trunk/Source/WebCore/rendering/RenderThemeCocoa.h	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebCore/rendering/RenderThemeCocoa.h	2018-11-09 19:10:27 UTC (rev 238047)
@@ -36,6 +36,8 @@
 
 class RenderThemeCocoa : public RenderTheme {
 private:
+    bool shouldHaveCapsLockIndicator(const HTMLInputElement&) const final;
+
 #if ENABLE(APPLE_PAY)
     void adjustApplePayButtonStyle(StyleResolver&, RenderStyle&, const Element*) const override;
     bool paintApplePayButton(const RenderObject&, const PaintInfo&, const IntRect&) override;

Modified: trunk/Source/WebCore/rendering/RenderThemeCocoa.mm (238046 => 238047)


--- trunk/Source/WebCore/rendering/RenderThemeCocoa.mm	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebCore/rendering/RenderThemeCocoa.mm	2018-11-09 19:10:27 UTC (rev 238047)
@@ -27,6 +27,7 @@
 #import "RenderThemeCocoa.h"
 
 #import "GraphicsContextCG.h"
+#import "HTMLInputElement.h"
 #import "RenderText.h"
 
 #if ENABLE(APPLE_PAY)
@@ -51,6 +52,11 @@
 
 namespace WebCore {
 
+bool RenderThemeCocoa::shouldHaveCapsLockIndicator(const HTMLInputElement& element) const
+{
+    return element.isPasswordField();
+}
+
 #if ENABLE(APPLE_PAY)
 
 static const auto applePayButtonMinimumWidth = 140;

Modified: trunk/Source/WebCore/rendering/RenderThemeIOS.h (238046 => 238047)


--- trunk/Source/WebCore/rendering/RenderThemeIOS.h	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebCore/rendering/RenderThemeIOS.h	2018-11-09 19:10:27 UTC (rev 238047)
@@ -117,7 +117,6 @@
 #endif
 
     bool shouldHaveSpinButton(const HTMLInputElement&) const override;
-    bool shouldHaveCapsLockIndicator(const HTMLInputElement&) const override;
 
 #if ENABLE(VIDEO)
     String mediaControlsStyleSheet() override;

Modified: trunk/Source/WebCore/rendering/RenderThemeIOS.mm (238046 => 238047)


--- trunk/Source/WebCore/rendering/RenderThemeIOS.mm	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebCore/rendering/RenderThemeIOS.mm	2018-11-09 19:10:27 UTC (rev 238047)
@@ -1135,11 +1135,6 @@
     return false;
 }
 
-bool RenderThemeIOS::shouldHaveCapsLockIndicator(const HTMLInputElement&) const
-{
-    return false;
-}
-
 FontCascadeDescription& RenderThemeIOS::cachedSystemFontDescription(CSSValueID valueID) const
 {
     static NeverDestroyed<FontCascadeDescription> systemFont;

Modified: trunk/Source/WebCore/rendering/RenderThemeMac.h (238046 => 238047)


--- trunk/Source/WebCore/rendering/RenderThemeMac.h	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebCore/rendering/RenderThemeMac.h	2018-11-09 19:10:27 UTC (rev 238047)
@@ -164,8 +164,6 @@
     bool supportsClosedCaptioning() const final { return true; }
 #endif
 
-    bool shouldHaveCapsLockIndicator(const HTMLInputElement&) const final;
-
     bool paintSnapshottedPluginOverlay(const RenderObject&, const PaintInfo&, const IntRect&) final;
 
 #if ENABLE(ATTACHMENT_ELEMENT)

Modified: trunk/Source/WebCore/rendering/RenderThemeMac.mm (238046 => 238047)


--- trunk/Source/WebCore/rendering/RenderThemeMac.mm	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebCore/rendering/RenderThemeMac.mm	2018-11-09 19:10:27 UTC (rev 238047)
@@ -2342,11 +2342,6 @@
     }
 }
 
-bool RenderThemeMac::shouldHaveCapsLockIndicator(const HTMLInputElement& element) const
-{
-    return element.isPasswordField();
-}
-
 NSPopUpButtonCell* RenderThemeMac::popupButton() const
 {
     if (!m_popupButton) {

Modified: trunk/Source/WebKit/ChangeLog (238046 => 238047)


--- trunk/Source/WebKit/ChangeLog	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebKit/ChangeLog	2018-11-09 19:10:27 UTC (rev 238047)
@@ -1,3 +1,35 @@
+2018-11-09  Daniel Bates  <daba...@apple.com>
+
+        [iOS] Draw caps lock indicator in password fields
+        https://bugs.webkit.org/show_bug.cgi?id=190565
+        <rdar://problem/45262343>
+
+        Reviewed by Dean Jackson.
+
+        Notify the WebContent process with the current modifer state on window activation changes. Notify
+        the WebContent process when hardware keyboard availability changes (e.g. a keyboard is attached).
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _initializeWithConfiguration:]): Register for hardware keyboard availability changed notifications.
+        (-[WKWebView dealloc]): Unregister from hardware availability changed notifications.
+        (hardwareKeyboardAvailabilityChangedCallback): Added.
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::updateCurrentModifierState): Compile this code when building for iOS.
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/ios/WKContentViewInteraction.mm:
+        (-[WKContentView _handleKeyUIEvent:]): Update the current modifier state if this event is a hardware
+        keyboard flags changed event.
+        * UIProcess/ios/WebPageProxyIOS.mm:
+        (WebKit::WebPageProxy::hardwareKeyboardAvailabilityChanged): Added.
+
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+        * WebProcess/WebPage/ios/WebPageIOS.mm:
+        (WebKit::WebPage::hardwareKeyboardAvailabilityChanged):
+        Added new message HardwareKeyboardAvailabilityChanged. Notify the focused HTML input element (if we have
+        one) that the caps lock state may have changed when we receive message HardwareKeyboardAvailabilityChanged
+        so that we toggle visibility of the caps lock indicator.
+
 2018-11-09  Tim Horton  <timothy_hor...@apple.com>
 
         Make use of _UIRemoteView instead of CALayerHost if possible for WKRemoteView

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (238046 => 238047)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2018-11-09 19:10:27 UTC (rev 238047)
@@ -153,6 +153,7 @@
 #import <WebCore/WebSQLiteDatabaseTrackerClient.h>
 #import <pal/spi/cg/CoreGraphicsSPI.h>
 #import <pal/spi/cocoa/QuartzCoreSPI.h>
+#import <pal/spi/ios/GraphicsServicesSPI.h>
 #import <wtf/cocoa/Entitlements.h>
 
 #define RELEASE_LOG_IF_ALLOWED(...) RELEASE_LOG_IF(_page && _page->isAlwaysOnLoggingAllowed(), ViewState, __VA_ARGS__)
@@ -705,6 +706,8 @@
 
     [[_configuration _contentProviderRegistry] addPage:*_page];
     _page->setForceAlwaysUserScalable([_configuration ignoresViewportScaleLimits]);
+
+    CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), (__bridge const void *)(self), hardwareKeyboardAvailabilityChangedCallback, (CFStringRef)[NSString stringWithUTF8String:kGSEventHardwareKeyboardAvailabilityChangedNotification], nullptr, CFNotificationSuspensionBehaviorCoalesce);
 #endif
 
 #if PLATFORM(MAC)
@@ -842,6 +845,8 @@
     [[_configuration _contentProviderRegistry] removePage:*_page];
     [[NSNotificationCenter defaultCenter] removeObserver:self];
     [_scrollView setInternalDelegate:nil];
+
+    CFNotificationCenterRemoveObserver(CFNotificationCenterGetDarwinNotifyCenter(), (__bridge const void *)(self), (CFStringRef)[NSString stringWithUTF8String:kGSEventHardwareKeyboardAvailabilityChangedNotification], nullptr);
 #endif
 
 #if ENABLE(ACCESSIBILITY_EVENTS)
@@ -3102,6 +3107,13 @@
     [self _keyboardChangedWithInfo:notification.userInfo adjustScrollView:YES];
 }
 
+static void hardwareKeyboardAvailabilityChangedCallback(CFNotificationCenterRef, void* observer, CFStringRef, const void*, CFDictionaryRef)
+{
+    ASSERT(observer);
+    WKWebView *webView = (__bridge WKWebView *)observer;
+    webView._page->hardwareKeyboardAvailabilityChanged();
+}
+
 - (void)_windowDidRotate:(NSNotification *)notification
 {
     if (!_overridesInterfaceOrientation)

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (238046 => 238047)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2018-11-09 19:10:27 UTC (rev 238047)
@@ -8132,7 +8132,7 @@
 
 void WebPageProxy::updateCurrentModifierState()
 {
-#if PLATFORM(MAC) && ENABLE(WEBPROCESS_WINDOWSERVER_BLOCKING)
+#if PLATFORM(MAC) && ENABLE(WEBPROCESS_WINDOWSERVER_BLOCKING) || PLATFORM(IOS_FAMILY)
     auto modifiers = PlatformKeyboardEvent::currentStateOfModifierKeys();
     m_process->send(Messages::WebPage::UpdateCurrentModifierState(modifiers), m_pageID);
 #endif

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (238046 => 238047)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2018-11-09 19:10:27 UTC (rev 238047)
@@ -645,6 +645,7 @@
     void storeSelectionForAccessibility(bool);
     void startAutoscrollAtPosition(const WebCore::FloatPoint& positionInWindow);
     void cancelAutoscroll();
+    void hardwareKeyboardAvailabilityChanged();
 #if ENABLE(DATA_INTERACTION)
     void didHandleStartDataInteractionRequest(bool started);
     void didHandleAdditionalDragItemsRequest(bool added);
@@ -1365,6 +1366,8 @@
     void didCloseSuggestions();
 #endif
 
+    void updateCurrentModifierState();
+
 private:
     WebPageProxy(PageClient&, WebProcessProxy&, uint64_t pageID, Ref<API::PageConfiguration>&&);
     void platformInitialize();
@@ -1847,8 +1850,6 @@
     void stopDisplayLink(unsigned observerID);
 #endif
 
-    void updateCurrentModifierState();
-
     void reportPageLoadResult(const WebCore::ResourceError& = { });
 
     void continueNavigationInNewProcess(API::Navigation&, Ref<WebProcessProxy>&&);

Modified: trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm (238046 => 238047)


--- trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm	2018-11-09 19:10:27 UTC (rev 238047)
@@ -3756,9 +3756,13 @@
 
 - (void)_handleKeyUIEvent:(::UIEvent *)event
 {
+    bool isHardwareKeyboardEvent = !!event._hidEvent;
+    if (isHardwareKeyboardEvent && ((UIPhysicalKeyboardEvent *)event)._inputFlags & kUIKeyboardInputModifierFlagsChanged)
+        _page->updateCurrentModifierState();
+
     // We only want to handle key event from the hardware keyboard when we are
     // first responder and we are not interacting with editable content.
-    if ([self isFirstResponder] && event._hidEvent && !_page->editorState().isContentEditable) {
+    if ([self isFirstResponder] && isHardwareKeyboardEvent && !_page->editorState().isContentEditable) {
         [self handleKeyEvent:event];
         return;
     }

Modified: trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm (238046 => 238047)


--- trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm	2018-11-09 19:10:27 UTC (rev 238047)
@@ -1089,6 +1089,12 @@
         m_validationBubble->show();
 }
 
+void WebPageProxy::hardwareKeyboardAvailabilityChanged()
+{
+    updateCurrentModifierState();
+    m_process->send(Messages::WebPage::HardwareKeyboardAvailabilityChanged(), m_pageID);
+}
+
 #if ENABLE(DATA_INTERACTION)
 
 void WebPageProxy::didHandleStartDataInteractionRequest(bool started)

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (238046 => 238047)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2018-11-09 19:10:27 UTC (rev 238047)
@@ -913,6 +913,8 @@
 
     bool platformPrefersTextLegibilityBasedZoomScaling() const;
     const WebCore::ViewportConfiguration& viewportConfiguration() const { return m_viewportConfiguration; }
+
+    void hardwareKeyboardAvailabilityChanged();
 #endif
 
 #if ENABLE(IOS_TOUCH_EVENTS)

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (238046 => 238047)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2018-11-09 19:10:27 UTC (rev 238047)
@@ -106,6 +106,7 @@
     StartAutoscrollAtPosition(WebCore::FloatPoint positionInWindow)
     CancelAutoscroll()
     RequestAssistedNodeInformation(WebKit::CallbackID callbackID)
+    HardwareKeyboardAvailabilityChanged()
 #endif
 
     SetControlledByAutomation(bool controlled)

Modified: trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm (238046 => 238047)


--- trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm	2018-11-09 19:10:27 UTC (rev 238047)
@@ -3087,6 +3087,12 @@
     return String();
 }
 
+void WebPage::hardwareKeyboardAvailabilityChanged()
+{
+    if (auto* focusedFrame = m_page->focusController().focusedFrame())
+        focusedFrame->eventHandler().capsLockStateMayHaveChanged();
+}
+
 #if USE(QUICK_LOOK)
 void WebPage::didReceivePasswordForQuickLookDocument(const String& password)
 {

Modified: trunk/Source/WebKitLegacy/mac/ChangeLog (238046 => 238047)


--- trunk/Source/WebKitLegacy/mac/ChangeLog	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebKitLegacy/mac/ChangeLog	2018-11-09 19:10:27 UTC (rev 238047)
@@ -1,5 +1,20 @@
 2018-11-09  Daniel Bates  <daba...@apple.com>
 
+        [iOS] Draw caps lock indicator in password fields
+        https://bugs.webkit.org/show_bug.cgi?id=190565
+        <rdar://problem/45262343>
+
+        Reviewed by Dean Jackson.
+
+        Update the caps lock state when a hardware keyboard is attached or detached.
+
+        * WebView/WebHTMLView.mm:
+        (hardwareKeyboardAvailabilityChangedCallback): Added.
+        (-[WebHTMLView initWithFrame:]): Register for hardware keyboard availability changed notifications.
+        (-[WebHTMLView dealloc]): Unregister from hardware keyboard availability changed notifications.
+
+2018-11-09  Daniel Bates  <daba...@apple.com>
+
         [iOS] Pressing forward delete key in text field does nothing and we should not invoke an editor
         action when forward delete is pressed outside a text field
         https://bugs.webkit.org/show_bug.cgi?id=190566

Modified: trunk/Source/WebKitLegacy/mac/WebView/WebHTMLView.mm (238046 => 238047)


--- trunk/Source/WebKitLegacy/mac/WebView/WebHTMLView.mm	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/Source/WebKitLegacy/mac/WebView/WebHTMLView.mm	2018-11-09 19:10:27 UTC (rev 238047)
@@ -164,7 +164,9 @@
 #import <WebCore/WAKScrollView.h>
 #import <WebCore/WAKWindow.h>
 #import <WebCore/WKGraphics.h>
+#import <WebCore/WebCoreThreadRun.h>
 #import <WebCore/WebEvent.h>
+#import <pal/spi/ios/GraphicsServicesSPI.h>
 #endif
 
 using namespace WebCore;
@@ -814,6 +816,16 @@
 
 #if PLATFORM(IOS_FAMILY)
 static NSString * const WebMarkedTextUpdatedNotification = @"WebMarkedTextUpdated";
+
+static void hardwareKeyboardAvailabilityChangedCallback(CFNotificationCenterRef, void* observer, CFStringRef, const void*, CFDictionaryRef)
+{
+    ASSERT(observer);
+    WebThreadRun(^{
+        WebHTMLView *webView = (__bridge WebHTMLView *)observer;
+        if (Frame* coreFrame = core([webView _frame]))
+            coreFrame->eventHandler().capsLockStateMayHaveChanged();
+    });
+}
 #endif
 
 @interface WebHTMLView (WebHTMLViewFileInternal)
@@ -2610,6 +2622,7 @@
     [[NSNotificationCenter defaultCenter] 
             addObserver:self selector:@selector(markedTextUpdate:) 
                    name:WebMarkedTextUpdatedNotification object:nil];
+    CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), (__bridge const void *)(self), hardwareKeyboardAvailabilityChangedCallback, (CFStringRef)[NSString stringWithUTF8String:kGSEventHardwareKeyboardAvailabilityChangedNotification], nullptr, CFNotificationSuspensionBehaviorCoalesce);
 #endif
 
 #if PLATFORM(MAC)
@@ -2626,6 +2639,7 @@
 
 #if PLATFORM(IOS_FAMILY)
     [[NSNotificationCenter defaultCenter] removeObserver:self name:WebMarkedTextUpdatedNotification object:nil];
+    CFNotificationCenterRemoveObserver(CFNotificationCenterGetDarwinNotifyCenter(), (__bridge const void *)(self), (CFStringRef)[NSString stringWithUTF8String:kGSEventHardwareKeyboardAvailabilityChangedNotification], nullptr);
 #endif
 
     // We can't assert that close has already been called because

Modified: trunk/WebKitLibraries/ChangeLog (238046 => 238047)


--- trunk/WebKitLibraries/ChangeLog	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/WebKitLibraries/ChangeLog	2018-11-09 19:10:27 UTC (rev 238047)
@@ -1,3 +1,15 @@
+2018-11-09  Daniel Bates  <daba...@apple.com>
+
+        [iOS] Draw caps lock indicator in password fields
+        https://bugs.webkit.org/show_bug.cgi?id=190565
+        <rdar://problem/45262343>
+
+        Reviewed by Dean Jackson.
+
+        Expose some more symbols.
+
+        * WebKitPrivateFrameworkStubs/iOS/12/GraphicsServices.framework/GraphicsServices.tbd:
+
 2018-06-27  Jonathan Bedard  <jbed...@apple.com>
 
         Enable WebKit iOS 12 build

Modified: trunk/WebKitLibraries/WebKitPrivateFrameworkStubs/iOS/12/GraphicsServices.framework/GraphicsServices.tbd (238046 => 238047)


--- trunk/WebKitLibraries/WebKitPrivateFrameworkStubs/iOS/12/GraphicsServices.framework/GraphicsServices.tbd	2018-11-09 19:04:01 UTC (rev 238046)
+++ trunk/WebKitLibraries/WebKitPrivateFrameworkStubs/iOS/12/GraphicsServices.framework/GraphicsServices.tbd	2018-11-09 19:10:27 UTC (rev 238047)
@@ -15,10 +15,13 @@
       - x86_64
     symbols:
       - _GSCurrentEventTimestamp
+      - _GSEventIsHardwareKeyboardAttached
       - _GSFontInitialize
       - _GSFontPurgeFontCache
       - _GSInitialize
+      - _GSKeyboardGetModifierState
       - _GSSystemRootDirectory
+      - _kGSEventHardwareKeyboardAvailabilityChangedNotification
 install-name: /System/Library/PrivateFrameworks/GraphicsServices.framework/GraphicsServices
 objc-constraint: none
 platform: ios
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to