[Extra zoom mode] Add plumbing for next and previous focusable element rects
authorwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 26 Mar 2018 19:09:33 +0000 (19:09 +0000)
committerwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 26 Mar 2018 19:09:33 +0000 (19:09 +0000)
https://bugs.webkit.org/show_bug.cgi?id=184016
Work towards <rdar://problem/38758727>

Reviewed by Tim Horton.

When building up AssistedNodeInformation, we currently compute the element rect of the current focused element,
as well as flags indicating whether or not there are next or previous focusable elements. For
<rdar://problem/38758727>, we additionally send the rects of the next or previous focusable elements as well.

* Shared/AssistedNodeInformation.cpp:
(WebKit::AssistedNodeInformation::encode const):
(WebKit::AssistedNodeInformation::decode):

IPC support for nextNodeRect and previousNodeRect.

* Shared/AssistedNodeInformation.h:
* WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::elementRectInRootViewCoordinates):

Add a helper to compute an element's rect in root view coordinates. We use this to compute the rects of the
current focused element as well as those of the next and previous elements, if any.

(WebKit::WebPage::getAssistedNodeInformation):
(WebKit::hasAssistableElement): Deleted.

Since we need the next or previous focusable element to get its rect, we don't need this helper anymore.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@229982 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit/ChangeLog
Source/WebKit/Shared/AssistedNodeInformation.cpp
Source/WebKit/Shared/AssistedNodeInformation.h
Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm

index 163f70cde69bb9d6c482c22c0f801b656f7e2a46..94aab2a0e469f2cef2627aae8813cd154bf23906 100644 (file)
@@ -1,3 +1,33 @@
+2018-03-26  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+        [Extra zoom mode] Add plumbing for next and previous focusable element rects
+        https://bugs.webkit.org/show_bug.cgi?id=184016
+        Work towards <rdar://problem/38758727>
+
+        Reviewed by Tim Horton.
+
+        When building up AssistedNodeInformation, we currently compute the element rect of the current focused element,
+        as well as flags indicating whether or not there are next or previous focusable elements. For
+        <rdar://problem/38758727>, we additionally send the rects of the next or previous focusable elements as well.
+
+        * Shared/AssistedNodeInformation.cpp:
+        (WebKit::AssistedNodeInformation::encode const):
+        (WebKit::AssistedNodeInformation::decode):
+
+        IPC support for nextNodeRect and previousNodeRect.
+
+        * Shared/AssistedNodeInformation.h:
+        * WebProcess/WebPage/ios/WebPageIOS.mm:
+        (WebKit::elementRectInRootViewCoordinates):
+
+        Add a helper to compute an element's rect in root view coordinates. We use this to compute the rects of the
+        current focused element as well as those of the next and previous elements, if any.
+
+        (WebKit::WebPage::getAssistedNodeInformation):
+        (WebKit::hasAssistableElement): Deleted.
+
+        Since we need the next or previous focusable element to get its rect, we don't need this helper anymore.
+
 2018-03-26  Chris Dumez  <cdumez@apple.com>
 
         Use SecurityOriginData more consistently in Service Worker code
index a7884a974b7cd59c09c80062333db1bbd6f8deec..c7cb31af3e42b96a64ce2a4da735f67fa6ca81e3 100644 (file)
@@ -70,7 +70,9 @@ void AssistedNodeInformation::encode(IPC::Encoder& encoder) const
     encoder << maximumScaleFactorIgnoringAlwaysScalable;
     encoder << nodeFontSize;
     encoder << hasNextNode;
+    encoder << nextNodeRect;
     encoder << hasPreviousNode;
+    encoder << previousNodeRect;
     encoder << isAutocorrect;
     encoder << isRTL;
     encoder.encodeEnum(autocapitalizeType);
@@ -117,9 +119,15 @@ bool AssistedNodeInformation::decode(IPC::Decoder& decoder, AssistedNodeInformat
     if (!decoder.decode(result.hasNextNode))
         return false;
 
+    if (!decoder.decode(result.nextNodeRect))
+        return false;
+
     if (!decoder.decode(result.hasPreviousNode))
         return false;
 
+    if (!decoder.decode(result.previousNodeRect))
+        return false;
+
     if (!decoder.decode(result.isAutocorrect))
         return false;
 
index 6bcf337951d5b75c182ddb5e66fe14eec3a2f2cf..a6124fd00f16373eaacdc680f211e59d56648dfb 100644 (file)
@@ -94,7 +94,9 @@ struct AssistedNodeInformation {
     double maximumScaleFactorIgnoringAlwaysScalable { INFINITY };
     double nodeFontSize { 0 };
     bool hasNextNode { false };
+    WebCore::IntRect nextNodeRect;
     bool hasPreviousNode { false };
+    WebCore::IntRect previousNodeRect;
     bool isAutocorrect { false };
     bool isRTL { false };
     bool isMultiSelect { false };
index 2a947fdf1f48d0e470ed2694f73259b45e3cb5fe..df8d22a4a47bffe9cdf1cc841ae402f25a005db0 100644 (file)
@@ -2691,11 +2691,6 @@ static inline Element* nextAssistableElement(Node* startNode, Page& page, bool i
     return nextElement;
 }
 
-static inline bool hasAssistableElement(Node* startNode, Page& page, bool isForward)
-{
-    return nextAssistableElement(startNode, page, isForward);
-}
-
 void WebPage::focusNextAssistedNode(bool isForward, CallbackID callbackID)
 {
     Element* nextElement = nextAssistableElement(m_assistedNode.get(), *m_page, isForward);
@@ -2706,6 +2701,19 @@ void WebPage::focusNextAssistedNode(bool isForward, CallbackID callbackID)
     send(Messages::WebPageProxy::VoidCallback(callbackID));
 }
 
+static IntRect elementRectInRootViewCoordinates(const Node& node, const Frame& frame)
+{
+    auto* view = frame.view();
+    if (!view)
+        return { };
+
+    auto* renderer = node.renderer();
+    if (!renderer)
+        return { };
+
+    return view->contentsToRootView(renderer->absoluteBoundingBoxRect());
+}
+
 void WebPage::getAssistedNodeInformation(AssistedNodeInformation& information)
 {
     layoutIfNeeded();
@@ -2716,7 +2724,7 @@ void WebPage::getAssistedNodeInformation(AssistedNodeInformation& information)
 
     if (RenderObject* renderer = m_assistedNode->renderer()) {
         Frame& elementFrame = m_page->focusController().focusedOrMainFrame();
-        information.elementRect = elementFrame.view()->contentsToRootView(renderer->absoluteBoundingBoxRect());
+        information.elementRect = elementRectInRootViewCoordinates(*m_assistedNode, elementFrame);
         information.nodeFontSize = renderer->style().fontDescription().computedSize();
 
         bool inFixed = false;
@@ -2746,8 +2754,16 @@ void WebPage::getAssistedNodeInformation(AssistedNodeInformation& information)
     information.maximumScaleFactorIgnoringAlwaysScalable = maximumPageScaleFactorIgnoringAlwaysScalable();
     information.allowsUserScaling = m_viewportConfiguration.allowsUserScaling();
     information.allowsUserScalingIgnoringAlwaysScalable = m_viewportConfiguration.allowsUserScalingIgnoringAlwaysScalable();
-    information.hasNextNode = hasAssistableElement(m_assistedNode.get(), *m_page, true);
-    information.hasPreviousNode = hasAssistableElement(m_assistedNode.get(), *m_page, false);
+    if (auto* nextElement = nextAssistableElement(m_assistedNode.get(), *m_page, true)) {
+        if (auto* frame = nextElement->document().frame())
+            information.nextNodeRect = elementRectInRootViewCoordinates(*nextElement, *frame);
+        information.hasNextNode = true;
+    }
+    if (auto* previousElement = nextAssistableElement(m_assistedNode.get(), *m_page, false)) {
+        if (auto* frame = previousElement->document().frame())
+            information.previousNodeRect = elementRectInRootViewCoordinates(*previousElement, *frame);
+        information.hasPreviousNode = true;
+    }
     information.assistedNodeIdentifier = m_currentAssistedNodeIdentifier;
 
     if (is<LabelableElement>(*m_assistedNode)) {