Title: [226023] releases/WebKitGTK/webkit-2.18/Source
Revision
226023
Author
carlo...@webkit.org
Date
2017-12-18 03:16:35 -0800 (Mon, 18 Dec 2017)

Log Message

Merge r224789 - Web Automation: inViewCenterPoint should not include topContentInset when computed in viewport coordinates
https://bugs.webkit.org/show_bug.cgi?id=179129
<rdar://problem/35297038>

Reviewed by Simon Fraser.

Source/WebCore:

Add or export some helpers needed to compute element layout for WebDriver.

* dom/Element.h: Export the non-DOM version of getClientBounds().
* page/FrameView.h:
* page/FrameView.cpp:
(WebCore::FrameView::clientToDocumentRect const):
Added. This does the same thing as clientToDocumentPoint. Export it, too.

Source/WebDriver:

Adjust code to use the proper coordinate system when requesting element layout.

* Session.cpp:
(WebDriver::Session::computeElementLayout):

Source/WebKit:

When computing the in view center point per W3C specification, the top content inset
is inadvertently added back in when converting to the root view coordinate system.

This patch reworks the protocol command so that it explicitly requests a coordinate
system, with options for "Page" (root / contents), "LayoutViewport", and "VisualViewport".
The latter is not implemented in this patch, since it is intended for use on iOS someday.

* UIProcess/Automation/Automation.json:
Change usesViewport to CoordinateSystem.
Add a new coordinate system enum type and use it.
Fix relevant comments for Automation.computElementLayout.

* UIProcess/Automation/WebAutomationSession.h:
* UIProcess/Automation/WebAutomationSession.cpp:
(WebKit::protocolStringToCoordinateSystem):
(WebKit::WebAutomationSession::computeElementLayout):
Parse the requested coordinate system and send it in the message to the web process.

* WebKit.xcodeproj/project.pbxproj:
* WebProcess/Automation/WebAutomationSessionProxy.messages.in:
* WebProcess/Automation/WebAutomationSessionProxy.h:
* WebProcess/Automation/WebAutomationSessionProxy.cpp:
(WebKit::WebAutomationSessionProxy::computeElementLayout):
Rework the implementation. Get the element bounds and in-view center point in
client coordinates and convert back to root view coordinates for CoordinateSystem::Page.

Modified Paths

Added Paths

Diff

Modified: releases/WebKitGTK/webkit-2.18/Source/WebCore/ChangeLog (226022 => 226023)


--- releases/WebKitGTK/webkit-2.18/Source/WebCore/ChangeLog	2017-12-18 10:54:33 UTC (rev 226022)
+++ releases/WebKitGTK/webkit-2.18/Source/WebCore/ChangeLog	2017-12-18 11:16:35 UTC (rev 226023)
@@ -1,3 +1,19 @@
+2017-11-07  Brian Burg  <bb...@apple.com>
+
+        Web Automation: inViewCenterPoint should not include topContentInset when computed in viewport coordinates
+        https://bugs.webkit.org/show_bug.cgi?id=179129
+        <rdar://problem/35297038>
+
+        Reviewed by Simon Fraser.
+
+        Add or export some helpers needed to compute element layout for WebDriver.
+
+        * dom/Element.h: Export the non-DOM version of getClientBounds().
+        * page/FrameView.h:
+        * page/FrameView.cpp:
+        (WebCore::FrameView::clientToDocumentRect const):
+        Added. This does the same thing as clientToDocumentPoint. Export it, too.
+
 2017-09-07  Carlos Garcia Campos  <cgar...@igalia.com>
 
         [GTK] Bring back line height rounding when computing font metrics

Modified: releases/WebKitGTK/webkit-2.18/Source/WebCore/dom/Element.h (226022 => 226023)


--- releases/WebKitGTK/webkit-2.18/Source/WebCore/dom/Element.h	2017-12-18 10:54:33 UTC (rev 226022)
+++ releases/WebKitGTK/webkit-2.18/Source/WebCore/dom/Element.h	2017-12-18 11:16:35 UTC (rev 226023)
@@ -173,7 +173,7 @@
 
     WEBCORE_EXPORT IntRect boundsInRootViewSpace();
 
-    FloatRect boundingClientRect();
+    WEBCORE_EXPORT FloatRect boundingClientRect();
 
     WEBCORE_EXPORT Ref<DOMRectList> getClientRects();
     Ref<DOMRect> getBoundingClientRect();

Modified: releases/WebKitGTK/webkit-2.18/Source/WebCore/page/FrameView.cpp (226022 => 226023)


--- releases/WebKitGTK/webkit-2.18/Source/WebCore/page/FrameView.cpp	2017-12-18 10:54:33 UTC (rev 226022)
+++ releases/WebKitGTK/webkit-2.18/Source/WebCore/page/FrameView.cpp	2017-12-18 11:16:35 UTC (rev 226023)
@@ -4976,6 +4976,12 @@
     return p;
 }
 
+FloatRect FrameView::clientToDocumentRect(FloatRect rect) const
+{
+    rect.move(-documentToClientOffset());
+    return rect;
+}
+
 FloatPoint FrameView::clientToDocumentPoint(FloatPoint point) const
 {
     point.move(-documentToClientOffset());

Modified: releases/WebKitGTK/webkit-2.18/Source/WebCore/page/FrameView.h (226022 => 226023)


--- releases/WebKitGTK/webkit-2.18/Source/WebCore/page/FrameView.h	2017-12-18 10:54:33 UTC (rev 226022)
+++ releases/WebKitGTK/webkit-2.18/Source/WebCore/page/FrameView.h	2017-12-18 11:16:35 UTC (rev 226023)
@@ -477,6 +477,7 @@
     FloatSize documentToClientOffset() const;
     FloatRect documentToClientRect(FloatRect) const;
     FloatPoint documentToClientPoint(FloatPoint) const;
+    WEBCORE_EXPORT FloatRect clientToDocumentRect(FloatRect) const;
     WEBCORE_EXPORT FloatPoint clientToDocumentPoint(FloatPoint) const;
 
     FloatRect layoutViewportToAbsoluteRect(FloatRect) const;

Modified: releases/WebKitGTK/webkit-2.18/Source/WebDriver/ChangeLog (226022 => 226023)


--- releases/WebKitGTK/webkit-2.18/Source/WebDriver/ChangeLog	2017-12-18 10:54:33 UTC (rev 226022)
+++ releases/WebKitGTK/webkit-2.18/Source/WebDriver/ChangeLog	2017-12-18 11:16:35 UTC (rev 226023)
@@ -1,3 +1,16 @@
+2017-11-07  Brian Burg  <bb...@apple.com>
+
+        Web Automation: inViewCenterPoint should not include topContentInset when computed in viewport coordinates
+        https://bugs.webkit.org/show_bug.cgi?id=179129
+        <rdar://problem/35297038>
+
+        Reviewed by Simon Fraser.
+
+        Adjust code to use the proper coordinate system when requesting element layout.
+
+        * Session.cpp:
+        (WebDriver::Session::computeElementLayout):
+
 2017-11-09  Carlos Garcia Campos  <cgar...@igalia.com>
 
         WebDriver: WebDriverService::matchCapabilities should follow the spec

Modified: releases/WebKitGTK/webkit-2.18/Source/WebDriver/Session.cpp (226022 => 226023)


--- releases/WebKitGTK/webkit-2.18/Source/WebDriver/Session.cpp	2017-12-18 10:54:33 UTC (rev 226022)
+++ releases/WebKitGTK/webkit-2.18/Source/WebDriver/Session.cpp	2017-12-18 11:16:35 UTC (rev 226023)
@@ -825,7 +825,7 @@
     parameters->setString(ASCIILiteral("frameHandle"), m_currentBrowsingContext.value());
     parameters->setString(ASCIILiteral("nodeHandle"), elementID);
     parameters->setBoolean(ASCIILiteral("scrollIntoViewIfNeeded"), options.contains(ElementLayoutOption::ScrollIntoViewIfNeeded));
-    parameters->setBoolean(ASCIILiteral("useViewportCoordinates"), options.contains(ElementLayoutOption::UseViewportCoordinates));
+    parameters->setString(ASCIILiteral("coordinateSystem"), options.contains(ElementLayoutOption::UseViewportCoordinates) ? ASCIILiteral("LayoutViewport") : ASCIILiteral("Page"));
     m_host->sendCommandToBackend(ASCIILiteral("computeElementLayout"), WTFMove(parameters), [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](SessionHost::CommandResponse&& response) mutable {
         if (response.isError || !response.responseObject) {
             completionHandler(std::nullopt, std::nullopt, false, WTFMove(response.responseObject));

Modified: releases/WebKitGTK/webkit-2.18/Source/WebKit/ChangeLog (226022 => 226023)


--- releases/WebKitGTK/webkit-2.18/Source/WebKit/ChangeLog	2017-12-18 10:54:33 UTC (rev 226022)
+++ releases/WebKitGTK/webkit-2.18/Source/WebKit/ChangeLog	2017-12-18 11:16:35 UTC (rev 226023)
@@ -1,3 +1,37 @@
+2017-11-07  Brian Burg  <bb...@apple.com>
+
+        Web Automation: inViewCenterPoint should not include topContentInset when computed in viewport coordinates
+        https://bugs.webkit.org/show_bug.cgi?id=179129
+        <rdar://problem/35297038>
+
+        Reviewed by Simon Fraser.
+
+        When computing the in view center point per W3C specification, the top content inset
+        is inadvertently added back in when converting to the root view coordinate system.
+
+        This patch reworks the protocol command so that it explicitly requests a coordinate
+        system, with options for "Page" (root / contents), "LayoutViewport", and "VisualViewport".
+        The latter is not implemented in this patch, since it is intended for use on iOS someday.
+
+        * UIProcess/Automation/Automation.json:
+        Change usesViewport to CoordinateSystem.
+        Add a new coordinate system enum type and use it.
+        Fix relevant comments for Automation.computElementLayout.
+
+        * UIProcess/Automation/WebAutomationSession.h:
+        * UIProcess/Automation/WebAutomationSession.cpp:
+        (WebKit::protocolStringToCoordinateSystem):
+        (WebKit::WebAutomationSession::computeElementLayout):
+        Parse the requested coordinate system and send it in the message to the web process.
+
+        * WebKit.xcodeproj/project.pbxproj:
+        * WebProcess/Automation/WebAutomationSessionProxy.messages.in:
+        * WebProcess/Automation/WebAutomationSessionProxy.h:
+        * WebProcess/Automation/WebAutomationSessionProxy.cpp:
+        (WebKit::WebAutomationSessionProxy::computeElementLayout):
+        Rework the implementation. Get the element bounds and in-view center point in
+        client coordinates and convert back to root view coordinates for CoordinateSystem::Page.
+
 2017-11-20  Carlos Garcia Campos  <cgar...@igalia.com>
 
         [GTK][WPE] webkit_cookie_manager_delete_all_cookies doesn't delete the cookies if called before a web process is running

Added: releases/WebKitGTK/webkit-2.18/Source/WebKit/Shared/CoordinateSystem.h (0 => 226023)


--- releases/WebKitGTK/webkit-2.18/Source/WebKit/Shared/CoordinateSystem.h	                        (rev 0)
+++ releases/WebKitGTK/webkit-2.18/Source/WebKit/Shared/CoordinateSystem.h	2017-12-18 11:16:35 UTC (rev 226023)
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2017 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#pragma once
+
+#include <wtf/EnumTraits.h>
+
+namespace WebKit {
+
+enum class CoordinateSystem {
+    Page = 0,
+    LayoutViewport,
+    VisualViewport,
+};
+
+} // namespace WebKit
+
+namespace WTF {
+
+template<> struct EnumTraits<WebKit::CoordinateSystem> {
+    using values = EnumValues<
+    WebKit::CoordinateSystem,
+    WebKit::CoordinateSystem::Page,
+    WebKit::CoordinateSystem::LayoutViewport,
+    WebKit::CoordinateSystem::VisualViewport
+    >;
+};
+
+} // namespace WTF

Modified: releases/WebKitGTK/webkit-2.18/Source/WebKit/UIProcess/Automation/Automation.json (226022 => 226023)


--- releases/WebKitGTK/webkit-2.18/Source/WebKit/UIProcess/Automation/Automation.json	2017-12-18 10:54:33 UTC (rev 226022)
+++ releases/WebKitGTK/webkit-2.18/Source/WebKit/UIProcess/Automation/Automation.json	2017-12-18 11:16:35 UTC (rev 226023)
@@ -27,6 +27,16 @@
             ]
         },
         {
+            "id": "CoordinateSystem",
+            "type": "string",
+            "description": "The coordinate system in which rects, points, and sizes are to be interpreted.",
+            "enum": [
+                "Page",
+                "LayoutViewport",
+                "VisualViewport"
+            ]
+        },
+        {
             "id": "BrowsingContextHandle",
             "type": "string",
             "description": "An opaque identifier for a browsing context."
@@ -425,11 +435,11 @@
                 { "name": "frameHandle", "$ref": "FrameHandle", "description": "The handle for the frame that contains the element." },
                 { "name": "nodeHandle", "$ref": "NodeHandle", "description": "The handle of the element to use." },
                 { "name": "scrollIntoViewIfNeeded", "optional": true, "type": "boolean", "description": "If the element should be scrolled into view before computing its layout." },
-                { "name": "useViewportCoordinates", "optional": true, "type": "boolean", "description": "If the result coordinates should be represented as viewport coordinates or not. Defaults to false, which means coordinates should be represented as page coordinates." }
+                { "name": "coordinateSystem", "$ref": "CoordinateSystem", "description": "The coordinate system to use for rect and point results." }
             ],
             "returns": [
-                { "name": "rect", "$ref": "Rect", "description": "The layout rect for the requested element. Specified in page or viewport coordinates based on the useViewportCoordinates parameter." },
-                { "name": "inViewCenterPoint", "optional": true, "$ref": "Point", "description": "The in-view center point for the requested element. Specified in page or viewport coordinates based on the useViewportCoordinates parameter." },
+                { "name": "rect", "$ref": "Rect", "description": "The layout rect for the requested element. Values are converted to the requested coordinate system." },
+                { "name": "inViewCenterPoint", "optional": true, "$ref": "Point", "description": "The in-view center point for the requested element. Values are converted to the requested coordinate system." },
                 { "name": "isObscured", "type": "boolean", "description": "If the in-view center point of the requested element is obscured by another element." }
             ],
             "async": true

Modified: releases/WebKitGTK/webkit-2.18/Source/WebKit/UIProcess/Automation/WebAutomationSession.cpp (226022 => 226023)


--- releases/WebKitGTK/webkit-2.18/Source/WebKit/UIProcess/Automation/WebAutomationSession.cpp	2017-12-18 10:54:33 UTC (rev 226022)
+++ releases/WebKitGTK/webkit-2.18/Source/WebKit/UIProcess/Automation/WebAutomationSession.cpp	2017-12-18 11:16:35 UTC (rev 226023)
@@ -30,6 +30,7 @@
 #include "APIAutomationSessionClient.h"
 #include "APIOpenPanelParameters.h"
 #include "AutomationProtocolObjects.h"
+#include "CoordinateSystem.h"
 #include "WebAutomationSessionMacros.h"
 #include "WebAutomationSessionMessages.h"
 #include "WebAutomationSessionProxyMessages.h"
@@ -848,8 +849,19 @@
         callback->sendSuccess(handleForWebFrameID(frameID));
 }
 
-void WebAutomationSession::computeElementLayout(Inspector::ErrorString& errorString, const String& browsingContextHandle, const String& frameHandle, const String& nodeHandle, const bool* optionalScrollIntoViewIfNeeded, const bool* optionalUseViewportCoordinates, Ref<ComputeElementLayoutCallback>&& callback)
+static std::optional<CoordinateSystem> protocolStringToCoordinateSystem(const String& coordinateSystemString)
 {
+    if (coordinateSystemString == "Page")
+        return CoordinateSystem::Page;
+    if (coordinateSystemString == "LayoutViewport")
+        return CoordinateSystem::LayoutViewport;
+    if (coordinateSystemString == "VisualViewport")
+        return CoordinateSystem::VisualViewport;
+    return std::nullopt;
+}
+
+void WebAutomationSession::computeElementLayout(Inspector::ErrorString& errorString, const String& browsingContextHandle, const String& frameHandle, const String& nodeHandle, const bool* optionalScrollIntoViewIfNeeded, const String& coordinateSystemString, Ref<ComputeElementLayoutCallback>&& callback)
+{
     WebPageProxy* page = webPageProxyForHandle(browsingContextHandle);
     if (!page)
         FAIL_WITH_PREDEFINED_ERROR(WindowNotFound);
@@ -858,13 +870,15 @@
     if (!frameID)
         FAIL_WITH_PREDEFINED_ERROR(FrameNotFound);
 
+    std::optional<CoordinateSystem> coordinateSystem = protocolStringToCoordinateSystem(coordinateSystemString);
+    if (!coordinateSystem)
+        FAIL_WITH_PREDEFINED_ERROR_AND_DETAILS(InvalidParameter, "The parameter 'coordinateSystem' is invalid.");
+
     uint64_t callbackID = m_nextComputeElementLayoutCallbackID++;
     m_computeElementLayoutCallbacks.set(callbackID, WTFMove(callback));
 
     bool scrollIntoViewIfNeeded = optionalScrollIntoViewIfNeeded ? *optionalScrollIntoViewIfNeeded : false;
-    bool useViewportCoordinates = optionalUseViewportCoordinates ? *optionalUseViewportCoordinates : false;
-
-    page->process().send(Messages::WebAutomationSessionProxy::ComputeElementLayout(page->pageID(), frameID.value(), nodeHandle, scrollIntoViewIfNeeded, useViewportCoordinates, callbackID), 0);
+    page->process().send(Messages::WebAutomationSessionProxy::ComputeElementLayout(page->pageID(), frameID.value(), nodeHandle, scrollIntoViewIfNeeded, coordinateSystem.value(), callbackID), 0);
 }
 
 void WebAutomationSession::didComputeElementLayout(uint64_t callbackID, WebCore::IntRect rect, std::optional<WebCore::IntPoint> inViewCenterPoint, bool isObscured, const String& errorType)

Modified: releases/WebKitGTK/webkit-2.18/Source/WebKit/UIProcess/Automation/WebAutomationSession.h (226022 => 226023)


--- releases/WebKitGTK/webkit-2.18/Source/WebKit/UIProcess/Automation/WebAutomationSession.h	2017-12-18 10:54:33 UTC (rev 226022)
+++ releases/WebKitGTK/webkit-2.18/Source/WebKit/UIProcess/Automation/WebAutomationSession.h	2017-12-18 11:16:35 UTC (rev 226023)
@@ -133,7 +133,7 @@
     void takeScreenshot(Inspector::ErrorString&, const String& handle, const String* optionalFrameHandle, const String* optionalNodeHandle, const bool* optionalScrollIntoViewIfNeeded, Ref<TakeScreenshotCallback>&&) override;
     void resolveChildFrameHandle(Inspector::ErrorString&, const String& browsingContextHandle, const String* optionalFrameHandle, const int* optionalOrdinal, const String* optionalName, const String* optionalNodeHandle, Ref<ResolveChildFrameHandleCallback>&&) override;
     void resolveParentFrameHandle(Inspector::ErrorString&, const String& browsingContextHandle, const String& frameHandle, Ref<ResolveParentFrameHandleCallback>&&) override;
-    void computeElementLayout(Inspector::ErrorString&, const String& browsingContextHandle, const String& frameHandle, const String& nodeHandle, const bool* optionalScrollIntoViewIfNeeded, const bool* useViewportCoordinates, Ref<Inspector::AutomationBackendDispatcherHandler::ComputeElementLayoutCallback>&&) override;
+    void computeElementLayout(Inspector::ErrorString&, const String& browsingContextHandle, const String& frameHandle, const String& nodeHandle, const bool* optionalScrollIntoViewIfNeeded, const String& coordinateSystem, Ref<Inspector::AutomationBackendDispatcherHandler::ComputeElementLayoutCallback>&&) override;
     void selectOptionElement(Inspector::ErrorString&, const String& browsingContextHandle, const String& frameHandle, const String& nodeHandle, Ref<Inspector::AutomationBackendDispatcherHandler::SelectOptionElementCallback>&&) override;
     void isShowingJavaScriptDialog(Inspector::ErrorString&, const String& browsingContextHandle, bool* result) override;
     void dismissCurrentJavaScriptDialog(Inspector::ErrorString&, const String& browsingContextHandle) override;

Modified: releases/WebKitGTK/webkit-2.18/Source/WebKit/WebKit.xcodeproj/project.pbxproj (226022 => 226023)


--- releases/WebKitGTK/webkit-2.18/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2017-12-18 10:54:33 UTC (rev 226022)
+++ releases/WebKitGTK/webkit-2.18/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2017-12-18 11:16:35 UTC (rev 226023)
@@ -3756,6 +3756,7 @@
 		99C81D561C20DFBE005C4C82 /* AutomationClient.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AutomationClient.mm; sourceTree = "<group>"; };
 		99C81D5B1C20E817005C4C82 /* APIAutomationClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIAutomationClient.h; sourceTree = "<group>"; };
 		99E714C11C1249E600665B3A /* _WKAutomationDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKAutomationDelegate.h; sourceTree = "<group>"; };
+		99F642D21FABE378009621E9 /* CoordinateSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoordinateSystem.h; sourceTree = "<group>"; };
 		9BC59D6C1EFCCCB6001E8D09 /* CallbackID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CallbackID.h; sourceTree = "<group>"; };
 		9BC59D6D1EFCDC6D001E8D09 /* OptionalCallbackID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OptionalCallbackID.h; sourceTree = "<group>"; };
 		9F54F88E16488E87007DF81A /* ChildProcessMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ChildProcessMac.mm; sourceTree = "<group>"; };
@@ -4950,6 +4951,7 @@
 				290F4271172A0C7400939FF0 /* ChildProcessSupplement.h */,
 				5106D7BF18BDBE73000AB166 /* ContextMenuContextData.cpp */,
 				5106D7C018BDBE73000AB166 /* ContextMenuContextData.h */,
+				99F642D21FABE378009621E9 /* CoordinateSystem.h */,
 				C517388012DF8F4F00EE3F47 /* DragControllerAction.h */,
 				0FB659221208B4DB0044816C /* DrawingAreaInfo.h */,
 				E105FE5318D7B9DE008F57A8 /* EditingRange.h */,

Modified: releases/WebKitGTK/webkit-2.18/Source/WebKit/WebProcess/Automation/WebAutomationSessionProxy.cpp (226022 => 226023)


--- releases/WebKitGTK/webkit-2.18/Source/WebKit/WebProcess/Automation/WebAutomationSessionProxy.cpp	2017-12-18 10:54:33 UTC (rev 226022)
+++ releases/WebKitGTK/webkit-2.18/Source/WebKit/WebProcess/Automation/WebAutomationSessionProxy.cpp	2017-12-18 11:16:35 UTC (rev 226023)
@@ -27,6 +27,7 @@
 #include "WebAutomationSessionProxy.h"
 
 #include "AutomationProtocolObjects.h"
+#include "CoordinateSystem.h"
 #include "WebAutomationSessionMessages.h"
 #include "WebAutomationSessionProxyMessages.h"
 #include "WebAutomationSessionProxyScriptSource.h"
@@ -533,7 +534,7 @@
     return &element;
 }
 
-void WebAutomationSessionProxy::computeElementLayout(uint64_t pageID, uint64_t frameID, String nodeHandle, bool scrollIntoViewIfNeeded, bool useViewportCoordinates, uint64_t callbackID)
+void WebAutomationSessionProxy::computeElementLayout(uint64_t pageID, uint64_t frameID, String nodeHandle, bool scrollIntoViewIfNeeded, CoordinateSystem coordinateSystem, uint64_t callbackID)
 {
     WebPage* page = WebProcess::singleton().webPage(pageID);
     if (!page) {
@@ -544,6 +545,7 @@
 
     String frameNotFoundErrorType = Inspector::Protocol::AutomationHelpers::getEnumConstantValue(Inspector::Protocol::Automation::ErrorMessage::FrameNotFound);
     String nodeNotFoundErrorType = Inspector::Protocol::AutomationHelpers::getEnumConstantValue(Inspector::Protocol::Automation::ErrorMessage::NodeNotFound);
+    String notImplementedErrorType = Inspector::Protocol::AutomationHelpers::getEnumConstantValue(Inspector::Protocol::Automation::ErrorMessage::NotImplemented);
 
     WebFrame* frame = frameID ? WebProcess::singleton().webFrame(frameID) : page->mainWebFrame();
     if (!frame || !frame->coreFrame() || !frame->coreFrame()->view()) {
@@ -565,25 +567,46 @@
         // FIXME: Wait in an implementation-specific way up to the session implicit wait timeout for the element to become in view.
     }
 
-    WebCore::IntRect rect = coreElement->clientRect();
+    if (coordinateSystem == CoordinateSystem::VisualViewport) {
+        WebProcess::singleton().parentProcessConnection()->send(Messages::WebAutomationSession::DidComputeElementLayout(callbackID, { }, std::nullopt, false, notImplementedErrorType), 0);
+        return;
+    }
 
+    WebCore::FloatRect elementBounds = coreElement->boundingClientRect();
+
     auto* coreFrameView = frame->coreFrame()->view();
-    if (useViewportCoordinates)
-        rect.moveBy(WebCore::IntPoint(0, -coreFrameView->topContentInset()));
-    else
-        rect = coreFrameView->rootViewToContents(rect);
+    switch (coordinateSystem) {
+    case CoordinateSystem::Page:
+        elementBounds = coreFrameView->clientToDocumentRect(elementBounds);
+        break;
+    case CoordinateSystem::LayoutViewport:
+        // The element bounds are already in client coordinates.
+        break;
+    case CoordinateSystem::VisualViewport:
+        ASSERT_NOT_REACHED();
+        break;
+    }
 
+    std::optional<WebCore::FloatPoint> inViewCenterPoint;
     bool isObscured = false;
-    std::optional<WebCore::IntPoint> inViewCenter;
     if (containerElement) {
-        if (auto clientCenterPoint = elementInViewClientCenterPoint(*containerElement, isObscured)) {
-            inViewCenter = WebCore::IntPoint(coreFrameView->clientToDocumentPoint(clientCenterPoint.value()));
-            if (useViewportCoordinates)
-                inViewCenter = coreFrameView->contentsToRootView(inViewCenter.value());
+        inViewCenterPoint = elementInViewClientCenterPoint(*containerElement, isObscured);
+        if (inViewCenterPoint.has_value()) {
+            switch (coordinateSystem) {
+            case CoordinateSystem::Page:
+                inViewCenterPoint = coreFrameView->clientToDocumentPoint(inViewCenterPoint.value());
+                break;
+            case CoordinateSystem::LayoutViewport:
+                // The point is already in client coordinates.
+                break;
+            case CoordinateSystem::VisualViewport:
+                ASSERT_NOT_REACHED();
+                break;
+            }
         }
     }
 
-    WebProcess::singleton().parentProcessConnection()->send(Messages::WebAutomationSession::DidComputeElementLayout(callbackID, rect, inViewCenter, isObscured, String()), 0);
+    WebProcess::singleton().parentProcessConnection()->send(Messages::WebAutomationSession::DidComputeElementLayout(callbackID, enclosingIntRect(elementBounds), WebCore::IntPoint(inViewCenterPoint.value()), isObscured, String()), 0);
 }
 
 void WebAutomationSessionProxy::selectOptionElement(uint64_t pageID, uint64_t frameID, String nodeHandle, uint64_t callbackID)

Modified: releases/WebKitGTK/webkit-2.18/Source/WebKit/WebProcess/Automation/WebAutomationSessionProxy.h (226022 => 226023)


--- releases/WebKitGTK/webkit-2.18/Source/WebKit/WebProcess/Automation/WebAutomationSessionProxy.h	2017-12-18 10:54:33 UTC (rev 226022)
+++ releases/WebKitGTK/webkit-2.18/Source/WebKit/WebProcess/Automation/WebAutomationSessionProxy.h	2017-12-18 11:16:35 UTC (rev 226023)
@@ -23,10 +23,10 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef WebAutomationSessionProxy_h
-#define WebAutomationSessionProxy_h
+#pragma once
 
 #include "Connection.h"
+#include "CoordinateSystem.h"
 #include <_javascript_Core/JSBase.h>
 #include <wtf/text/WTFString.h>
 
@@ -64,7 +64,7 @@
     void resolveChildFrameWithName(uint64_t pageID, uint64_t frameID, const String& name, uint64_t callbackID);
     void resolveParentFrame(uint64_t pageID, uint64_t frameID, uint64_t callbackID);
     void focusFrame(uint64_t pageID, uint64_t frameID);
-    void computeElementLayout(uint64_t pageID, uint64_t frameID, String nodeHandle, bool scrollIntoViewIfNeeded, bool useViewportCoordinates, uint64_t callbackID);
+    void computeElementLayout(uint64_t pageID, uint64_t frameID, String nodeHandle, bool scrollIntoViewIfNeeded, CoordinateSystem, uint64_t callbackID);
     void selectOptionElement(uint64_t pageID, uint64_t frameID, String nodeHandle, uint64_t callbackID);
     void takeScreenshot(uint64_t pageID, uint64_t frameID, String nodeHandle, bool scrollIntoViewIfNeeded, uint64_t callbackID);
     void getCookiesForFrame(uint64_t pageID, uint64_t frameID, uint64_t callbackID);
@@ -77,5 +77,3 @@
 };
 
 } // namespace WebKit
-
-#endif // WebAutomationSessionProxy_h

Modified: releases/WebKitGTK/webkit-2.18/Source/WebKit/WebProcess/Automation/WebAutomationSessionProxy.messages.in (226022 => 226023)


--- releases/WebKitGTK/webkit-2.18/Source/WebKit/WebProcess/Automation/WebAutomationSessionProxy.messages.in	2017-12-18 10:54:33 UTC (rev 226022)
+++ releases/WebKitGTK/webkit-2.18/Source/WebKit/WebProcess/Automation/WebAutomationSessionProxy.messages.in	2017-12-18 11:16:35 UTC (rev 226023)
@@ -30,7 +30,7 @@
 
     FocusFrame(uint64_t pageID, uint64_t frameID)
 
-    ComputeElementLayout(uint64_t pageID, uint64_t frameID, String nodeHandle, bool scrollIntoViewIfNeeded, bool useViewportCoordinates, uint64_t callbackID)
+ComputeElementLayout(uint64_t pageID, uint64_t frameID, String nodeHandle, bool scrollIntoViewIfNeeded, enum WebKit::CoordinateSystem coordinateSystem, uint64_t callbackID)
 
     SelectOptionElement(uint64_t pageID, uint64_t frameID, String nodeHandle, uint64_t callbackID)
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to