[WinCairo][PlayStation] Add automation support for RemoteInspector SocketServer implementation.
https://bugs.webkit.org/show_bug.cgi?id=199070

Reviewed by Ross Kirsling.

Added handler for StartAutomationSession event from WebDriver and preparing for automation session.

* inspector/remote/RemoteInspector.h:
* inspector/remote/socket/RemoteInspectorSocket.cpp:
(Inspector::RemoteInspector::listingForAutomationTarget const):
(Inspector::RemoteInspector::sendAutomaticInspectionCandidateMessage):
(Inspector::RemoteInspector::requestAutomationSession):
(Inspector::RemoteInspector::dispatchMap):
(Inspector::RemoteInspector::startAutomationSession):


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@251373 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog
index 35fd09a..1c930b0 100644
--- a/Source/JavaScriptCore/ChangeLog
+++ b/Source/JavaScriptCore/ChangeLog
@@ -1,3 +1,20 @@
+2019-10-21  Basuke Suzuki  <Basuke.Suzuki@sony.com>
+
+        [WinCairo][PlayStation] Add automation support for RemoteInspector SocketServer implementation.
+        https://bugs.webkit.org/show_bug.cgi?id=199070
+
+        Reviewed by Ross Kirsling.
+
+        Added handler for StartAutomationSession event from WebDriver and preparing for automation session.
+
+        * inspector/remote/RemoteInspector.h:
+        * inspector/remote/socket/RemoteInspectorSocket.cpp:
+        (Inspector::RemoteInspector::listingForAutomationTarget const):
+        (Inspector::RemoteInspector::sendAutomaticInspectionCandidateMessage):
+        (Inspector::RemoteInspector::requestAutomationSession):
+        (Inspector::RemoteInspector::dispatchMap):
+        (Inspector::RemoteInspector::startAutomationSession):
+
 2019-10-21  Mark Lam  <mark.lam@apple.com>
 
         Remove all uses of untagCodePtr in debugging code.
diff --git a/Source/JavaScriptCore/inspector/remote/RemoteInspector.h b/Source/JavaScriptCore/inspector/remote/RemoteInspector.h
index fb09379..141e9ab 100644
--- a/Source/JavaScriptCore/inspector/remote/RemoteInspector.h
+++ b/Source/JavaScriptCore/inspector/remote/RemoteInspector.h
@@ -149,7 +149,7 @@
     void sendMessageToTarget(TargetID, const char* message);
 #endif
 #if USE(INSPECTOR_SOCKET_SERVER)
-    void requestAutomationSession(String&& sessionID, const Client::SessionCapabilities&);
+    void requestAutomationSession(const String& sessionID, const Client::SessionCapabilities&);
 
     bool isConnected() const { return !!m_clientConnection; }
     void connect(ConnectionID);
@@ -221,6 +221,9 @@
     void setupTarget(const Event&);
     void frontendDidClose(const Event&);
     void sendMessageToBackend(const Event&);
+    void startAutomationSession(const Event&);
+
+    void receivedAutomationSessionRequestMessage(const Event&);
 
     String backendCommands() const;
 #endif
diff --git a/Source/JavaScriptCore/inspector/remote/socket/RemoteInspectorSocket.cpp b/Source/JavaScriptCore/inspector/remote/socket/RemoteInspectorSocket.cpp
index e99e874..decd84f 100644
--- a/Source/JavaScriptCore/inspector/remote/socket/RemoteInspectorSocket.cpp
+++ b/Source/JavaScriptCore/inspector/remote/socket/RemoteInspectorSocket.cpp
@@ -135,9 +135,14 @@
     return targetListing;
 }
 
-TargetListing RemoteInspector::listingForAutomationTarget(const RemoteAutomationTarget&) const
+TargetListing RemoteInspector::listingForAutomationTarget(const RemoteAutomationTarget& target) const
 {
-    return nullptr;
+    TargetListing targetListing = JSON::Object::create();
+    targetListing->setString("type"_s, "automation"_s);
+    targetListing->setString("name"_s, target.name());
+    targetListing->setInteger("targetID"_s, target.targetIdentifier());
+    targetListing->setBoolean("isPaired"_s, target.isPaired());
+    return targetListing;
 }
 
 void RemoteInspector::pushListingsNow()
@@ -178,6 +183,30 @@
 
 void RemoteInspector::sendAutomaticInspectionCandidateMessage()
 {
+    ASSERT(m_enabled);
+    ASSERT(m_automaticInspectionEnabled);
+    ASSERT(m_automaticInspectionPaused);
+    ASSERT(m_automaticInspectionCandidateTargetIdentifier);
+    // FIXME: Implement automatic inspection.
+}
+
+void RemoteInspector::requestAutomationSession(const String& sessionID, const Client::SessionCapabilities& capabilities)
+{
+    if (!m_client)
+        return;
+
+    if (!m_clientCapabilities || !m_clientCapabilities->remoteAutomationAllowed) {
+        LOG_ERROR("Error: Remote automation is not allowed");
+        return;
+    }
+
+    if (sessionID.isNull()) {
+        LOG_ERROR("Client error: SESSION ID cannot be null");
+        return;
+    }
+
+    m_client->requestAutomationSession(sessionID, capabilities);
+    updateClientCapabilities();
 }
 
 void RemoteInspector::sendMessageToRemote(TargetID targetIdentifier, const String& message)
@@ -251,6 +280,7 @@
         { "Setup"_s, static_cast<CallHandler>(&RemoteInspector::setupTarget) },
         { "FrontendDidClose"_s, static_cast<CallHandler>(&RemoteInspector::frontendDidClose) },
         { "SendMessageToBackend"_s, static_cast<CallHandler>(&RemoteInspector::sendMessageToBackend) },
+        { "StartAutomationSession"_s, static_cast<CallHandler>(&RemoteInspector::startAutomationSession) },
     });
 
     return methods;
@@ -321,6 +351,32 @@
     connectionToTarget->sendMessageToTarget(event.message.value());
 }
 
+void RemoteInspector::startAutomationSession(const Event& event)
+{
+    ASSERT(isMainThread());
+
+    if (!event.message)
+        return;
+
+    requestAutomationSession(event.message.value(), { });
+
+    auto sendEvent = JSON::Object::create();
+    sendEvent->setString("event"_s, "SetCapabilities"_s);
+
+    auto capability = clientCapabilities();
+
+    auto message = JSON::Object::create();
+    message->setString("browserName"_s, capability ? capability->browserName : "");
+    message->setString("browserVersion"_s, capability ? capability->browserVersion : "");
+    sendEvent->setString("message"_s, message->toJSONString());
+    sendWebInspectorEvent(sendEvent->toJSONString());
+
+    m_readyToPushListings = true;
+
+    LockHolder lock(m_mutex);
+    pushListingsNow();
+}
+
 } // namespace Inspector
 
 #endif // ENABLE(REMOTE_INSPECTOR)