[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 163f70c..94aab2a 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 a7884a9..c7cb31a 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 6bcf337..a6124fd 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 2a947fd..df8d22a 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)) {