Title: [226480] trunk/Source/WebKit
Revision
226480
Author
[email protected]
Date
2018-01-05 17:53:44 -0800 (Fri, 05 Jan 2018)

Log Message

Show Keyboard when re-launching WKWebView with a previously focused element
https://bugs.webkit.org/show_bug.cgi?id=181353

Reviewed by Tim Horton.

When relaunching an app with a WKWebView, restore the keyboard if there was a previously
focused element that was being assisted. The element was already being tracked, we just
needed to not bail on showing the keyboard for instances where it was a state change that
caused the element to be refocused.

* UIProcess/PageClient.h:
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.messages.in:
* UIProcess/ios/PageClientImplIOS.h:
* UIProcess/ios/PageClientImplIOS.mm:
(WebKit::PageClientImpl::startAssistingNode):
* UIProcess/ios/WKContentView.h:
* UIProcess/ios/WKContentViewInteraction.h:
* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView _startAssistingNode:userIsInteracting:blurPreviousNode:changingActivityState:userObject:]):
(-[WKContentView _startAssistingNode:userIsInteracting:blurPreviousNode:userObject:]): Deleted.
* UIProcess/ios/WebPageProxyIOS.mm:
(WebKit::WebPageProxy::startAutoscrollAtPosition):
(WebKit::WebPageProxy::startAssistingNode):
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::setActivityState):
(WebKit::WebPage::elementDidFocus):
* WebProcess/WebPage/WebPage.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (226479 => 226480)


--- trunk/Source/WebKit/ChangeLog	2018-01-06 01:49:47 UTC (rev 226479)
+++ trunk/Source/WebKit/ChangeLog	2018-01-06 01:53:44 UTC (rev 226480)
@@ -1,3 +1,34 @@
+2018-01-05  Megan Gardner  <[email protected]>
+
+        Show Keyboard when re-launching WKWebView with a previously focused element
+        https://bugs.webkit.org/show_bug.cgi?id=181353
+
+        Reviewed by Tim Horton.
+
+        When relaunching an app with a WKWebView, restore the keyboard if there was a previously
+        focused element that was being assisted. The element was already being tracked, we just
+        needed to not bail on showing the keyboard for instances where it was a state change that
+        caused the element to be refocused.
+
+        * UIProcess/PageClient.h:
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.messages.in:
+        * UIProcess/ios/PageClientImplIOS.h:
+        * UIProcess/ios/PageClientImplIOS.mm:
+        (WebKit::PageClientImpl::startAssistingNode):
+        * UIProcess/ios/WKContentView.h:
+        * UIProcess/ios/WKContentViewInteraction.h:
+        * UIProcess/ios/WKContentViewInteraction.mm:
+        (-[WKContentView _startAssistingNode:userIsInteracting:blurPreviousNode:changingActivityState:userObject:]):
+        (-[WKContentView _startAssistingNode:userIsInteracting:blurPreviousNode:userObject:]): Deleted.
+        * UIProcess/ios/WebPageProxyIOS.mm:
+        (WebKit::WebPageProxy::startAutoscrollAtPosition):
+        (WebKit::WebPageProxy::startAssistingNode):
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::setActivityState):
+        (WebKit::WebPage::elementDidFocus):
+        * WebProcess/WebPage/WebPage.h:
+
 2018-01-05  Alex Christensen  <[email protected]>
 
         Restrict navigation-time WKWebsiteDataStore swapping to main frame navigations

Modified: trunk/Source/WebKit/UIProcess/PageClient.h (226479 => 226480)


--- trunk/Source/WebKit/UIProcess/PageClient.h	2018-01-06 01:49:47 UTC (rev 226479)
+++ trunk/Source/WebKit/UIProcess/PageClient.h	2018-01-06 01:53:44 UTC (rev 226480)
@@ -290,7 +290,7 @@
     virtual void restorePageState(std::optional<WebCore::FloatPoint> scrollPosition, const WebCore::FloatPoint& scrollOrigin, const WebCore::FloatBoxExtent& obscuredInsetsOnSave, double scale) = 0;
     virtual void restorePageCenterAndScale(std::optional<WebCore::FloatPoint> center, double scale) = 0;
 
-    virtual void startAssistingNode(const AssistedNodeInformation&, bool userIsInteracting, bool blurPreviousNode, API::Object* userData) = 0;
+    virtual void startAssistingNode(const AssistedNodeInformation&, bool userIsInteracting, bool blurPreviousNode, bool changingActivityState, API::Object* userData) = 0;
     virtual void stopAssistingNode() = 0;
     virtual bool isAssistingNode() = 0;
     virtual bool interpretKeyEvent(const NativeWebKeyboardEvent&, bool isCharEvent) = 0;

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (226479 => 226480)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2018-01-06 01:49:47 UTC (rev 226479)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2018-01-06 01:53:44 UTC (rev 226480)
@@ -284,6 +284,7 @@
     AssistedNodeInformation m_nodeInformation;
     bool m_userIsInteracting;
     bool m_blurPreviousNode;
+    bool m_changingActivityState;
     RefPtr<API::Object> m_userData;
 };
 
@@ -1600,7 +1601,7 @@
 
     void didGetTapHighlightGeometries(uint64_t requestID, const WebCore::Color& color, const Vector<WebCore::FloatQuad>& geometries, const WebCore::IntSize& topLeftRadius, const WebCore::IntSize& topRightRadius, const WebCore::IntSize& bottomLeftRadius, const WebCore::IntSize& bottomRightRadius);
 
-    void startAssistingNode(const AssistedNodeInformation&, bool userIsInteracting, bool blurPreviousNode, const UserData&);
+    void startAssistingNode(const AssistedNodeInformation&, bool userIsInteracting, bool blurPreviousNode, bool changingActivityState, const UserData&);
     void stopAssistingNode();
 
     void showInspectorHighlight(const WebCore::Highlight&);

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in (226479 => 226480)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in	2018-01-06 01:49:47 UTC (rev 226479)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in	2018-01-06 01:53:44 UTC (rev 226480)
@@ -392,7 +392,7 @@
     RestorePageCenterAndScale(std::optional<WebCore::FloatPoint> unobscuredCenter, double scale)
     DidGetTapHighlightGeometries(uint64_t requestID, WebCore::Color color, Vector<WebCore::FloatQuad> geometries, WebCore::IntSize topLeftRadius, WebCore::IntSize topRightRadius, WebCore::IntSize bottomLeftRadius, WebCore::IntSize bottomRightRadius)
 
-    StartAssistingNode(struct WebKit::AssistedNodeInformation information, bool userIsInteracting, bool blurPreviousNode, WebKit::UserData userData)
+    StartAssistingNode(struct WebKit::AssistedNodeInformation information, bool userIsInteracting, bool blurPreviousNode, bool changingActivityState, WebKit::UserData userData)
     StopAssistingNode()
     OverflowScrollWillStartScroll()
     OverflowScrollDidEndScroll()

Modified: trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.h (226479 => 226480)


--- trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.h	2018-01-06 01:49:47 UTC (rev 226479)
+++ trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.h	2018-01-06 01:53:44 UTC (rev 226480)
@@ -125,7 +125,7 @@
     void restorePageState(std::optional<WebCore::FloatPoint>, const WebCore::FloatPoint&, const WebCore::FloatBoxExtent&, double) override;
     void restorePageCenterAndScale(std::optional<WebCore::FloatPoint>, double) override;
 
-    void startAssistingNode(const AssistedNodeInformation&, bool userIsInteracting, bool blurPreviousNode, API::Object* userData) override;
+    void startAssistingNode(const AssistedNodeInformation&, bool userIsInteracting, bool blurPreviousNode, bool changingActivityState, API::Object* userData) override;
     void stopAssistingNode() override;
     bool isAssistingNode() override;
     void selectionDidChange() override;

Modified: trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm (226479 => 226480)


--- trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm	2018-01-06 01:49:47 UTC (rev 226479)
+++ trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm	2018-01-06 01:53:44 UTC (rev 226480)
@@ -534,7 +534,7 @@
     [m_webView _restorePageStateToUnobscuredCenter:center scale:scale];
 }
 
-void PageClientImpl::startAssistingNode(const AssistedNodeInformation& nodeInformation, bool userIsInteracting, bool blurPreviousNode, API::Object* userData)
+void PageClientImpl::startAssistingNode(const AssistedNodeInformation& nodeInformation, bool userIsInteracting, bool blurPreviousNode, bool changingActivityState, API::Object* userData)
 {
     MESSAGE_CHECK(!userData || userData->type() == API::Object::Type::Data);
 
@@ -549,7 +549,7 @@
         }
     }
 
-    [m_contentView _startAssistingNode:nodeInformation userIsInteracting:userIsInteracting blurPreviousNode:blurPreviousNode userObject:userObject];
+    [m_contentView _startAssistingNode:nodeInformation userIsInteracting:userIsInteracting blurPreviousNode:blurPreviousNode changingActivityState:changingActivityState userObject:userObject];
 }
 
 bool PageClientImpl::isAssistingNode()

Modified: trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h (226479 => 226480)


--- trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h	2018-01-06 01:49:47 UTC (rev 226479)
+++ trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h	2018-01-06 01:53:44 UTC (rev 226480)
@@ -283,7 +283,7 @@
 
 - (BOOL)_mayDisableDoubleTapGesturesDuringSingleTap;
 - (void)_disableDoubleTapGesturesDuringTapIfNecessary:(uint64_t)requestID;
-- (void)_startAssistingNode:(const WebKit::AssistedNodeInformation&)information userIsInteracting:(BOOL)userIsInteracting blurPreviousNode:(BOOL)blurPreviousNode userObject:(NSObject <NSSecureCoding> *)userObject;
+- (void)_startAssistingNode:(const WebKit::AssistedNodeInformation&)information userIsInteracting:(BOOL)userIsInteracting blurPreviousNode:(BOOL)blurPreviousNode changingActivityState:(bool)changingActivityState userObject:(NSObject <NSSecureCoding> *)userObject;
 - (void)_stopAssistingNode;
 - (void)_selectionChanged;
 - (void)_updateChangedSelection;

Modified: trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm (226479 => 226480)


--- trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm	2018-01-06 01:49:47 UTC (rev 226479)
+++ trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm	2018-01-06 01:53:44 UTC (rev 226480)
@@ -3865,7 +3865,7 @@
     return false;
 }
 
-- (void)_startAssistingNode:(const AssistedNodeInformation&)information userIsInteracting:(BOOL)userIsInteracting blurPreviousNode:(BOOL)blurPreviousNode userObject:(NSObject <NSSecureCoding> *)userObject
+- (void)_startAssistingNode:(const AssistedNodeInformation&)information userIsInteracting:(BOOL)userIsInteracting blurPreviousNode:(BOOL)blurPreviousNode changingActivityState:(BOOL)changingActivityState userObject:(NSObject <NSSecureCoding> *)userObject
 {
     _inputViewUpdateDeferrer = nullptr;
 
@@ -3877,7 +3877,7 @@
         shouldShowKeyboard = [inputDelegate _webView:_webView focusShouldStartInputSession:focusedElementInfo.get()];
     else {
         // The default behavior is to allow node assistance if the user is interacting or the keyboard is already active.
-        shouldShowKeyboard = userIsInteracting || _textSelectionAssistant;
+        shouldShowKeyboard = userIsInteracting || _textSelectionAssistant || changingActivityState;
 #if ENABLE(DATA_INTERACTION)
         shouldShowKeyboard |= _dragDropInteractionState.isPerformingDrop();
 #endif

Modified: trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm (226479 => 226480)


--- trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm	2018-01-06 01:49:47 UTC (rev 226479)
+++ trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm	2018-01-06 01:53:44 UTC (rev 226480)
@@ -398,7 +398,8 @@
     }
 
     if (m_hasDeferredStartAssistingNode) {
-        m_pageClient.startAssistingNode(m_deferredNodeAssistanceArguments->m_nodeInformation, m_deferredNodeAssistanceArguments->m_userIsInteracting, m_deferredNodeAssistanceArguments->m_blurPreviousNode, m_deferredNodeAssistanceArguments->m_userData.get());
+        m_pageClient.startAssistingNode(m_deferredNodeAssistanceArguments->m_nodeInformation, m_deferredNodeAssistanceArguments->m_userIsInteracting, m_deferredNodeAssistanceArguments->m_blurPreviousNode,
+            m_deferredNodeAssistanceArguments->m_changingActivityState, m_deferredNodeAssistanceArguments->m_userData.get());
         m_hasDeferredStartAssistingNode = false;
         m_deferredNodeAssistanceArguments = nullptr;
     }
@@ -897,16 +898,16 @@
     m_pageClient.didGetTapHighlightGeometries(requestID, color, highlightedQuads, topLeftRadius, topRightRadius, bottomLeftRadius, bottomRightRadius);
 }
 
-void WebPageProxy::startAssistingNode(const AssistedNodeInformation& information, bool userIsInteracting, bool blurPreviousNode, const UserData& userData)
+void WebPageProxy::startAssistingNode(const AssistedNodeInformation& information, bool userIsInteracting, bool blurPreviousNode, bool changingActivityState, const UserData& userData)
 {
     API::Object* userDataObject = process().transformHandlesToObjects(userData.object()).get();
     if (m_editorState.isMissingPostLayoutData) {
-        m_deferredNodeAssistanceArguments = std::make_unique<NodeAssistanceArguments>(NodeAssistanceArguments { information, userIsInteracting, blurPreviousNode, userDataObject });
+        m_deferredNodeAssistanceArguments = std::make_unique<NodeAssistanceArguments>(NodeAssistanceArguments { information, userIsInteracting, blurPreviousNode, changingActivityState, userDataObject });
         m_hasDeferredStartAssistingNode = true;
         return;
     }
 
-    m_pageClient.startAssistingNode(information, userIsInteracting, blurPreviousNode, userDataObject);
+    m_pageClient.startAssistingNode(information, userIsInteracting, blurPreviousNode, changingActivityState, userDataObject);
 }
 
 void WebPageProxy::stopAssistingNode()

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (226479 => 226480)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2018-01-06 01:49:47 UTC (rev 226479)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2018-01-06 01:53:44 UTC (rev 226480)
@@ -2723,7 +2723,11 @@
     if (changed)
         updateThrottleState();
 
-    m_page->setActivityState(activityState);
+    {
+        SetForScope<bool> currentlyChangingActivityState { m_changingActivityState, true };
+        m_page->setActivityState(activityState);
+    }
+    
     for (auto* pluginView : m_pluginViews)
         pluginView->activityStateDidChange(changed);
 
@@ -4874,7 +4878,7 @@
 
         m_formClient->willBeginInputSession(this, downcast<Element>(node), WebFrame::fromCoreFrame(*node->document().frame()), m_userIsInteracting, userData);
 
-        send(Messages::WebPageProxy::StartAssistingNode(information, m_userIsInteracting, m_hasPendingBlurNotification, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
+        send(Messages::WebPageProxy::StartAssistingNode(information, m_userIsInteracting, m_hasPendingBlurNotification, m_changingActivityState, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
 #elif PLATFORM(MAC)
         if (node->hasTagName(WebCore::HTMLNames::selectTag))
             send(Messages::WebPageProxy::SetEditableElementIsFocused(false));

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (226479 => 226480)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2018-01-06 01:49:47 UTC (rev 226479)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2018-01-06 01:53:44 UTC (rev 226480)
@@ -1567,6 +1567,7 @@
     bool m_hasEverFocusedElementDueToUserInteractionSincePageTransition { false };
     bool m_needsHiddenContentEditableQuirk { false };
     bool m_needsPlainTextQuirk { false };
+    bool m_changingActivityState { false };
 
 #if ENABLE(CONTEXT_MENUS)
     bool m_isShowingContextMenu { false };
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to