Title: [238078] trunk
Revision
238078
Author
dba...@webkit.org
Date
2018-11-11 13:32:53 -0800 (Sun, 11 Nov 2018)

Log Message

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

Source/WebCore:

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.

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:

Reviewed by Dean Jackson.

Forward declare some more SPI.

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

Source/WebKit:

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.

Source/WebKitLegacy/mac:

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.

WebKitLibraries:

Reviewed by Dean Jackson.

Expose some more symbols.

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

LayoutTests:

Unreviewed.

Update expected results now that iOS supports showing the caps lock indictor.

* platform/ios/fast/css/text-overflow-input-expected.txt:
* platform/ios/fast/forms/basic-inputs-expected.txt:
* platform/ios/fast/forms/input-appearance-height-expected.txt:
* platform/ios/fast/forms/input-value-expected.txt:
* platform/ios/fast/forms/placeholder-pseudo-style-expected.txt:
* platform/ios/tables/mozilla_expected_failures/bugs/bug92647-1-expected.txt:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (238077 => 238078)


--- trunk/LayoutTests/ChangeLog	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/LayoutTests/ChangeLog	2018-11-11 21:32:53 UTC (rev 238078)
@@ -1,3 +1,20 @@
+2018-11-11  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>
+
+        Unreviewed.
+
+        Update expected results now that iOS supports showing the caps lock indictor.
+
+        * platform/ios/fast/css/text-overflow-input-expected.txt:
+        * platform/ios/fast/forms/basic-inputs-expected.txt:
+        * platform/ios/fast/forms/input-appearance-height-expected.txt:
+        * platform/ios/fast/forms/input-value-expected.txt:
+        * platform/ios/fast/forms/placeholder-pseudo-style-expected.txt:
+        * platform/ios/tables/mozilla_expected_failures/bugs/bug92647-1-expected.txt:
+
 2018-11-11  Myles C. Maxfield  <mmaxfi...@apple.com>
 
         Address post-review comments after r237955

Modified: trunk/LayoutTests/platform/ios/fast/css/text-overflow-input-expected.txt (238077 => 238078)


--- trunk/LayoutTests/platform/ios/fast/css/text-overflow-input-expected.txt	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/LayoutTests/platform/ios/fast/css/text-overflow-input-expected.txt	2018-11-11 21:32:53 UTC (rev 238078)
@@ -31,6 +31,8 @@
         RenderText {#text} at (569,21) size 5x19
           text run at (569,21) width 5: " "
         RenderTextControl {INPUT} at (575,22) size 136x22 [bgcolor=#FFFFFF] [border: (1px solid #4C4C4C)]
+          RenderFlexibleBox {DIV} at (6,3) size 123x15
+            RenderBlock {DIV} at (0,0) size 123x14
         RenderBR {BR} at (712,21) size 1x19
         RenderTextControl {INPUT} at (2,47) size 136x22 [bgcolor=#FFFFFF] [border: (1px solid #4C4C4C)]
         RenderText {#text} at (139,46) size 5x19
@@ -53,6 +55,8 @@
         RenderText {#text} at (569,46) size 5x19
           text run at (569,46) width 5: " "
         RenderTextControl {INPUT} at (575,47) size 136x22 [bgcolor=#FFFFFF] [border: (1px solid #4C4C4C)]
+          RenderFlexibleBox {DIV} at (6,3) size 123x15
+            RenderBlock {DIV} at (0,0) size 123x14
         RenderText {#text} at (0,0) size 0x0
       RenderBlock {P} at (0,122) size 784x70
         RenderText {#text} at (0,0) size 547x19
@@ -79,6 +83,8 @@
         RenderText {#text} at (569,21) size 5x19
           text run at (569,21) width 5: " "
         RenderTextControl {INPUT} at (575,22) size 136x22 [bgcolor=#FFFFFF] [border: (1px solid #4C4C4C)]
+          RenderFlexibleBox {DIV} at (6,3) size 123x15
+            RenderBlock {DIV} at (0,0) size 123x14
         RenderBR {BR} at (712,21) size 1x19
         RenderTextControl {INPUT} at (2,47) size 136x22 [bgcolor=#FFFFFF] [border: (1px solid #4C4C4C)]
         RenderText {#text} at (139,46) size 5x19
@@ -101,6 +107,8 @@
         RenderText {#text} at (569,46) size 5x19
           text run at (569,46) width 5: " "
         RenderTextControl {INPUT} at (575,47) size 136x22 [bgcolor=#FFFFFF] [border: (1px solid #4C4C4C)]
+          RenderFlexibleBox {DIV} at (6,3) size 123x15
+            RenderBlock {DIV} at (0,0) size 123x14
         RenderText {#text} at (0,0) size 0x0
       RenderBlock {P} at (0,208) size 784x70
         RenderText {#text} at (0,0) size 238x19
@@ -145,7 +153,7 @@
     RenderText {#text} at (0,0) size 265x14
       text run at (0,0) width 265: "Lorem ipsum dolor sit amet, consectetur adipiscing elit"
 layer at (590,77) size 122x14 scrollWidth 366
-  RenderBlock {DIV} at (6,3) size 123x15
+  RenderBlock {DIV} at (0,0) size 123x14
     RenderText {#text} at (0,0) size 366x14
       text run at (0,0) width 366: "\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}"
 layer at (17,102) size 122x14 scrollX 142 scrollWidth 265
@@ -169,7 +177,7 @@
     RenderText {#text} at (-142,0) size 266x14
       text run at (-142,0) width 265: "Lorem ipsum dolor sit amet, consectetur adipiscing elit"
 layer at (590,102) size 122x14 scrollWidth 366
-  RenderBlock {DIV} at (6,3) size 123x15
+  RenderBlock {DIV} at (0,0) size 123x14
     RenderText {#text} at (0,0) size 366x14
       text run at (0,0) width 366: "\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}"
 layer at (17,163) size 122x14 scrollWidth 265
@@ -193,7 +201,7 @@
     RenderText {#text} at (0,0) size 265x14
       text run at (0,0) width 265: "Lorem ipsum dolor sit amet, consectetur adipiscing elit"
 layer at (590,163) size 122x14 scrollWidth 366
-  RenderBlock {DIV} at (6,3) size 123x15
+  RenderBlock {DIV} at (0,0) size 123x14
     RenderText {#text} at (0,0) size 366x14
       text run at (0,0) width 366: "\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}"
 layer at (17,188) size 122x14 scrollX 142 scrollWidth 265
@@ -217,7 +225,7 @@
     RenderText {#text} at (-142,0) size 266x14
       text run at (-142,0) width 265: "Lorem ipsum dolor sit amet, consectetur adipiscing elit"
 layer at (590,188) size 122x14 scrollWidth 371
-  RenderBlock {DIV} at (6,3) size 123x15
+  RenderBlock {DIV} at (0,0) size 123x14
     RenderText {#text} at (5,0) size 366x14
       text run at (5,0) width 366: "\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}"
 layer at (263,249) size 122x14 scrollWidth 265

Modified: trunk/LayoutTests/platform/ios/fast/forms/basic-inputs-expected.txt (238077 => 238078)


--- trunk/LayoutTests/platform/ios/fast/forms/basic-inputs-expected.txt	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/LayoutTests/platform/ios/fast/forms/basic-inputs-expected.txt	2018-11-11 21:32:53 UTC (rev 238078)
@@ -42,6 +42,8 @@
           text run at (314,2) width 13: "b "
           text run at (326,2) width 8: "a"
         RenderTextControl {INPUT} at (3,28) size 136x22 [bgcolor=#FFFFFF] [border: (1px solid #4C4C4C)]
+          RenderFlexibleBox {DIV} at (6,3) size 123x15
+            RenderBlock {DIV} at (0,0) size 123x14
         RenderText {#text} at (140,27) size 65x19
           text run at (140,27) width 65: "password "
         RenderText {#text} at (344,27) size 9x19
@@ -67,7 +69,7 @@
     RenderText {#text} at (0,0) size 147x14
       text run at (0,0) width 147: "foobarbazfoobarbazfoobarbaz"
 layer at (28,389) size 122x14
-  RenderBlock {DIV} at (6,3) size 123x15
+  RenderBlock {DIV} at (0,0) size 123x14
     RenderText {#text} at (0,0) size 20x14
       text run at (0,0) width 20: "\x{25CF}\x{25CF}\x{25CF}"
 layer at (195,361) size 136x21
@@ -78,8 +80,10 @@
       text run at (0,0) width 16: "foo"
 layer at (225,386) size 135x21
   RenderTextControl {INPUT} at (206,28) size 137x22 [bgcolor=#FFFFFF] [border: (1px solid #4C4C4C)]
+    RenderFlexibleBox {DIV} at (6,3) size 123x15
+      RenderBlock {DIV} at (0,0) size 123x14
 layer at (231,389) size 122x14
-  RenderBlock {DIV} at (6,3) size 123x15 [color=#545454]
+  RenderBlock {DIV} at (0,0) size 123x14 [color=#545454]
     RenderText {#text} at (0,0) size 20x14
       text run at (0,0) width 20: "\x{25CF}\x{25CF}\x{25CF}"
 layer at (113,424) size 16x16

Modified: trunk/LayoutTests/platform/ios/fast/forms/input-appearance-height-expected.txt (238077 => 238078)


--- trunk/LayoutTests/platform/ios/fast/forms/input-appearance-height-expected.txt	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/LayoutTests/platform/ios/fast/forms/input-appearance-height-expected.txt	2018-11-11 21:32:53 UTC (rev 238078)
@@ -83,6 +83,8 @@
         RenderText {#text} at (0,235) size 65x19
           text run at (0,235) width 65: "password "
         RenderTextControl {INPUT} at (66,236) size 136x22 [bgcolor=#FFFFFF] [border: (1px solid #4C4C4C)]
+          RenderFlexibleBox {DIV} at (6,3) size 123x15
+            RenderBlock {DIV} at (0,0) size 123x14
         RenderText {#text} at (203,235) size 5x19
           text run at (203,235) width 5: " "
         RenderBR {BR} at (207,250) size 1x0
@@ -101,6 +103,6 @@
 layer at (67,242) size 122x14
   RenderBlock {DIV} at (6,3) size 123x15
 layer at (81,267) size 122x14
-  RenderBlock {DIV} at (6,3) size 123x15
+  RenderBlock {DIV} at (0,0) size 123x14
 layer at (61,292) size 122x14
   RenderBlock {DIV} at (0,0) size 123x14

Modified: trunk/LayoutTests/platform/ios/fast/forms/input-value-expected.txt (238077 => 238078)


--- trunk/LayoutTests/platform/ios/fast/forms/input-value-expected.txt	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/LayoutTests/platform/ios/fast/forms/input-value-expected.txt	2018-11-11 21:32:53 UTC (rev 238078)
@@ -46,6 +46,8 @@
                   text run at (1,2) width 248: "password with value property changed"
               RenderTableCell {TD} at (395,29) size 240x27 [r=1 c=1 rs=1 cs=1]
                 RenderTextControl {INPUT} at (3,3) size 136x22 [bgcolor=#FFFFFF] [border: (1px solid #4C4C4C)]
+                  RenderFlexibleBox {DIV} at (6,3) size 123x15
+                    RenderBlock {DIV} at (0,0) size 123x14
               RenderTableCell {TD} at (636,31) size 63x23 [r=1 c=2 rs=1 cs=1]
                 RenderText {#text} at (1,1) size 30x20
                   text run at (1,2) width 30: "after"
@@ -205,7 +207,7 @@
     RenderText {#text} at (0,0) size 32x14
       text run at (0,0) width 32: "before"
 layer at (413,171) size 122x14
-  RenderBlock {DIV} at (6,3) size 123x15
+  RenderBlock {DIV} at (0,0) size 123x14
     RenderText {#text} at (0,0) size 40x14
       text run at (0,0) width 40: "\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}\x{25CF}"
 layer at (413,328) size 122x14

Modified: trunk/LayoutTests/platform/ios/fast/forms/placeholder-pseudo-style-expected.txt (238077 => 238078)


--- trunk/LayoutTests/platform/ios/fast/forms/placeholder-pseudo-style-expected.txt	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/LayoutTests/platform/ios/fast/forms/placeholder-pseudo-style-expected.txt	2018-11-11 21:32:53 UTC (rev 238078)
@@ -17,6 +17,8 @@
       RenderText {#text} at (282,21) size 5x19
         text run at (282,21) width 5: " "
       RenderTextControl {INPUT} at (288,22) size 137x22 [bgcolor=#FFFFFF] [border: (1px solid #4C4C4C)]
+        RenderFlexibleBox {DIV} at (6,3) size 123x15
+          RenderBlock {DIV} at (0,0) size 123x14
       RenderText {#text} at (426,21) size 5x19
         text run at (426,21) width 5: " "
       RenderText {#text} at (569,21) size 5x19
@@ -43,7 +45,7 @@
     RenderText {#text} at (0,0) size 48x14
       text run at (0,0) width 48: "password"
 layer at (303,33) size 122x14
-  RenderBlock {DIV} at (6,3) size 123x15
+  RenderBlock {DIV} at (0,0) size 123x14
 layer at (590,33) size 122x14
   RenderBlock {DIV} at (6,3) size 123x15 [color=#A9A9A9]
     RenderText {#text} at (0,0) size 34x14

Modified: trunk/LayoutTests/platform/ios/tables/mozilla_expected_failures/bugs/bug92647-1-expected.txt (238077 => 238078)


--- trunk/LayoutTests/platform/ios/tables/mozilla_expected_failures/bugs/bug92647-1-expected.txt	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/LayoutTests/platform/ios/tables/mozilla_expected_failures/bugs/bug92647-1-expected.txt	2018-11-11 21:32:53 UTC (rev 238078)
@@ -24,9 +24,11 @@
                           text run at (2,3) width 31: "PIN:"
                       RenderTableCell {TD} at (82,48) size 185x29 [border: (1px inset #808080)] [r=1 c=1 rs=1 cs=1]
                         RenderTextControl {INPUT} at (4,4) size 136x22 [bgcolor=#FFFFFF] [border: (1px solid #4C4C4C)]
+                          RenderFlexibleBox {DIV} at (6,3) size 123x15
+                            RenderBlock {DIV} at (0,0) size 123x14
                         RenderText {#text} at (0,0) size 0x0
                       RenderTableCell {TD} at (268,60) size 5x5 [border: (1px inset #808080)] [r=1 c=2 rs=1 cs=1]
 layer at (108,32) size 122x14
   RenderBlock {DIV} at (6,3) size 123x15
 layer at (108,70) size 122x14
-  RenderBlock {DIV} at (6,3) size 123x15
+  RenderBlock {DIV} at (0,0) size 123x14

Modified: trunk/Source/WebCore/ChangeLog (238077 => 238078)


--- trunk/Source/WebCore/ChangeLog	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebCore/ChangeLog	2018-11-11 21:32:53 UTC (rev 238078)
@@ -1,3 +1,54 @@
+2018-11-11  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.
+
+        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-11  Zalan Bujtas  <za...@apple.com>
 
         [LFC][BFC] In-flow positioned logic is really formatting context dependent.

Modified: trunk/Source/WebCore/PAL/ChangeLog (238077 => 238078)


--- trunk/Source/WebCore/PAL/ChangeLog	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebCore/PAL/ChangeLog	2018-11-11 21:32:53 UTC (rev 238078)
@@ -1,3 +1,16 @@
+2018-11-11  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-09  Ryan Haddad  <ryanhad...@apple.com>
 
         Unreviewed, rolling out r238047.

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


--- trunk/Source/WebCore/PAL/pal/spi/ios/GraphicsServicesSPI.h	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebCore/PAL/pal/spi/ios/GraphicsServicesSPI.h	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebCore/PAL/pal/spi/ios/UIKitSPI.h	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebCore/PAL/pal/spi/ios/UIKitSPI.h	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebCore/page/EventHandler.cpp	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebCore/page/EventHandler.cpp	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebCore/page/EventHandler.h	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebCore/page/EventHandler.h	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebCore/platform/cocoa/KeyEventCocoa.mm	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebCore/platform/cocoa/KeyEventCocoa.mm	2018-11-11 21:32:53 UTC (rev 238078)
@@ -27,8 +27,10 @@
 #import "KeyEventCocoa.h"
 
 #import "Logging.h"
+#import "PlatformKeyboardEvent.h"
 #import "WindowsKeyboardCodes.h"
 #import <wtf/ASCIICType.h>
+#import <wtf/MainThread.h>
 #import <wtf/text/WTFString.h>
 
 #if PLATFORM(IOS_FAMILY)
@@ -39,6 +41,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 (238077 => 238078)


--- trunk/Source/WebCore/platform/ios/KeyEventIOS.mm	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebCore/platform/ios/KeyEventIOS.mm	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebCore/platform/ios/WebEvent.h	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebCore/platform/ios/WebEvent.h	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebCore/platform/ios/WebEvent.mm	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebCore/platform/ios/WebEvent.mm	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebCore/platform/mac/KeyEventMac.mm	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebCore/platform/mac/KeyEventMac.mm	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebCore/rendering/RenderThemeCocoa.h	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebCore/rendering/RenderThemeCocoa.h	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebCore/rendering/RenderThemeCocoa.mm	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebCore/rendering/RenderThemeCocoa.mm	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebCore/rendering/RenderThemeIOS.h	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebCore/rendering/RenderThemeIOS.h	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebCore/rendering/RenderThemeIOS.mm	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebCore/rendering/RenderThemeIOS.mm	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebCore/rendering/RenderThemeMac.h	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebCore/rendering/RenderThemeMac.h	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebCore/rendering/RenderThemeMac.mm	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebCore/rendering/RenderThemeMac.mm	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebKit/ChangeLog	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebKit/ChangeLog	2018-11-11 21:32:53 UTC (rev 238078)
@@ -1,3 +1,35 @@
+2018-11-11  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-11  Dan Bernstein  <m...@apple.com>
 
         ProcessPoolConfiguration::copy() doesn’t copy m_customWebContentServiceBundleIdentifier

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


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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__)
@@ -712,6 +713,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)
@@ -849,6 +852,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)
@@ -3107,6 +3112,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 (238077 => 238078)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2018-11-11 21:32:53 UTC (rev 238078)
@@ -8150,7 +8150,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 (238077 => 238078)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2018-11-11 21:32:53 UTC (rev 238078)
@@ -649,6 +649,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);
@@ -1369,6 +1370,8 @@
     void didCloseSuggestions();
 #endif
 
+    void updateCurrentModifierState();
+
 private:
     WebPageProxy(PageClient&, WebProcessProxy&, uint64_t pageID, Ref<API::PageConfiguration>&&);
     void platformInitialize();
@@ -1851,8 +1854,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 (238077 => 238078)


--- trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm	2018-11-11 21:32:53 UTC (rev 238078)
@@ -3797,9 +3797,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 (238077 => 238078)


--- trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/Source/WebKitLegacy/mac/ChangeLog	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebKitLegacy/mac/ChangeLog	2018-11-11 21:32:53 UTC (rev 238078)
@@ -1,3 +1,18 @@
+2018-11-11  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-11  Benjamin Poulain  <benja...@webkit.org>
 
         Fix a fixme: rename wtfObjcMsgSend to wtfObjCMsgSend

Modified: trunk/Source/WebKitLegacy/mac/WebView/WebHTMLView.mm (238077 => 238078)


--- trunk/Source/WebKitLegacy/mac/WebView/WebHTMLView.mm	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/Source/WebKitLegacy/mac/WebView/WebHTMLView.mm	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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 (238077 => 238078)


--- trunk/WebKitLibraries/ChangeLog	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/WebKitLibraries/ChangeLog	2018-11-11 21:32:53 UTC (rev 238078)
@@ -1,3 +1,15 @@
+2018-11-11  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-11-09  Ryan Haddad  <ryanhad...@apple.com>
 
         Unreviewed, rolling out r238047.

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


--- trunk/WebKitLibraries/WebKitPrivateFrameworkStubs/iOS/12/GraphicsServices.framework/GraphicsServices.tbd	2018-11-11 21:29:12 UTC (rev 238077)
+++ trunk/WebKitLibraries/WebKitPrivateFrameworkStubs/iOS/12/GraphicsServices.framework/GraphicsServices.tbd	2018-11-11 21:32:53 UTC (rev 238078)
@@ -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