[Cocoa] Web Automation: include browser name and version in listing for automation...
authorbburg@apple.com <bburg@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 8 Jun 2018 20:46:14 +0000 (20:46 +0000)
committerbburg@apple.com <bburg@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 8 Jun 2018 20:46:14 +0000 (20:46 +0000)
https://bugs.webkit.org/show_bug.cgi?id=186204
<rdar://problem/36950423>

Reviewed by Darin Adler.

Source/JavaScriptCore:

Ask the client what the reported browser name and version should be, then
send this as part of the listing for an automation target.

* inspector/remote/RemoteInspectorConstants.h:
* inspector/remote/cocoa/RemoteInspectorCocoa.mm:
(Inspector::RemoteInspector::listingForAutomationTarget const):

Source/WebKit:

Add a new delegate method that allows the client to set the name and version
of the browser as returned in the 'browserName' and 'browserVersion' capabilities.
If the delegate methods are not implemented, try to get this information from
the main bundle.

In the RWI protocol, these fields are added to automation target listings.

* UIProcess/API/Cocoa/_WKAutomationDelegate.h:
* UIProcess/Cocoa/AutomationClient.h:
* UIProcess/Cocoa/AutomationClient.mm:
(WebKit::AutomationClient::AutomationClient):
(WebKit::AutomationClient::browserName const):
(WebKit::AutomationClient::browserVersion const):

Source/WTF:

* wtf/spi/cf/CFBundleSPI.h: Add needed infoDictionary key values.

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/inspector/remote/RemoteInspectorConstants.h
Source/JavaScriptCore/inspector/remote/cocoa/RemoteInspectorCocoa.mm
Source/WTF/ChangeLog
Source/WTF/wtf/spi/cf/CFBundleSPI.h
Source/WebKit/ChangeLog
Source/WebKit/UIProcess/API/Cocoa/_WKAutomationDelegate.h
Source/WebKit/UIProcess/Cocoa/AutomationClient.h
Source/WebKit/UIProcess/Cocoa/AutomationClient.mm

index e89b573..adab4a2 100644 (file)
@@ -1,3 +1,18 @@
+2018-06-08  Brian Burg  <bburg@apple.com>
+
+        [Cocoa] Web Automation: include browser name and version in listing for automation targets
+        https://bugs.webkit.org/show_bug.cgi?id=186204
+        <rdar://problem/36950423>
+
+        Reviewed by Darin Adler.
+
+        Ask the client what the reported browser name and version should be, then
+        send this as part of the listing for an automation target.
+
+        * inspector/remote/RemoteInspectorConstants.h:
+        * inspector/remote/cocoa/RemoteInspectorCocoa.mm:
+        (Inspector::RemoteInspector::listingForAutomationTarget const):
+
 2018-06-07  Chris Dumez  <cdumez@apple.com>
 
         Add base class to get WeakPtrFactory member and avoid some boilerplate code
index 17896e0..b947efd 100644 (file)
@@ -84,6 +84,8 @@
 #define WIRAutomaticInspectionCandidateMessage     @"WIRAutomaticInspectionCandidateMessage"
 
 #define WIRAutomationTargetIsPairedKey             @"WIRAutomationTargetIsPairedKey"
+#define WIRAutomationTargetNameKey                 @"WIRAutomationTargetNameKey"
+#define WIRAutomationTargetVersionKey              @"WIRAutomationTargetVersionKey"
 #define WIRSessionIdentifierKey                    @"WIRSessionIdentifierKey"
 #define WIRSessionCapabilitiesKey                  @"WIRSessionCapabilitiesKey"
 #define WIRAutomationSessionRequestMessage         @"WIRAutomationSessionRequestMessage"
index b716911..c7f47fb 100644 (file)
@@ -427,6 +427,10 @@ RetainPtr<NSDictionary> RemoteInspector::listingForAutomationTarget(const Remote
     [listing setObject:target.name() forKey:WIRSessionIdentifierKey];
     [listing setObject:WIRTypeAutomation forKey:WIRTypeKey];
     [listing setObject:@(target.isPaired()) forKey:WIRAutomationTargetIsPairedKey];
+    if (m_clientCapabilities) {
+        [listing setObject:m_clientCapabilities->browserName forKey:WIRAutomationTargetNameKey];
+        [listing setObject:m_clientCapabilities->browserVersion forKey:WIRAutomationTargetVersionKey];
+    }
 
     if (auto connectionToTarget = m_targetConnectionMap.get(target.targetIdentifier()))
         [listing setObject:connectionToTarget->connectionIdentifier() forKey:WIRConnectionIdentifierKey];
index 9bbd049..4381290 100644 (file)
@@ -1,3 +1,13 @@
+2018-06-08  Brian Burg  <bburg@apple.com>
+
+        [Cocoa] Web Automation: include browser name and version in listing for automation targets
+        https://bugs.webkit.org/show_bug.cgi?id=186204
+        <rdar://problem/36950423>
+
+        Reviewed by Darin Adler.
+
+        * wtf/spi/cf/CFBundleSPI.h: Add needed infoDictionary key values.
+
 2018-06-07  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         [WTF] Add WorkerPool
index c089e17..1da60ef 100644 (file)
@@ -36,6 +36,9 @@
 
 WTF_EXTERN_C_BEGIN
 
+extern const CFStringRef _kCFBundleDisplayNameKey;
+extern const CFStringRef _kCFBundleShortVersionStringKey;
+
 void _CFBundleSetupXPCBootstrap(xpc_object_t bootstrap);
 
 CFBundleRef _CFBundleCreateUnique(CFAllocatorRef, CFURLRef bundleURL);
index ae186cc..c8e784f 100644 (file)
@@ -1,3 +1,25 @@
+2018-06-08  Brian Burg  <bburg@apple.com>
+
+        [Cocoa] Web Automation: include browser name and version in listing for automation targets
+        https://bugs.webkit.org/show_bug.cgi?id=186204
+        <rdar://problem/36950423>
+
+        Reviewed by Darin Adler.
+
+        Add a new delegate method that allows the client to set the name and version
+        of the browser as returned in the 'browserName' and 'browserVersion' capabilities.
+        If the delegate methods are not implemented, try to get this information from
+        the main bundle.
+
+        In the RWI protocol, these fields are added to automation target listings.
+
+        * UIProcess/API/Cocoa/_WKAutomationDelegate.h:
+        * UIProcess/Cocoa/AutomationClient.h:
+        * UIProcess/Cocoa/AutomationClient.mm:
+        (WebKit::AutomationClient::AutomationClient):
+        (WebKit::AutomationClient::browserName const):
+        (WebKit::AutomationClient::browserVersion const):
+
 2018-06-08  Per Arne Vollan  <pvollan@apple.com>
 
         Run display links in the UI process when ENABLE(WEBPROCESS_WINDOWSERVER_BLOCKING) is true.
index 1cd233c..db6fb92 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2016-2018 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 
 @protocol _WKAutomationDelegate <NSObject>
 @optional
-- (BOOL)_processPoolAllowsRemoteAutomation:(WKProcessPool *)processPool;
-- (void)_processPool:(WKProcessPool *)processPool didRequestAutomationSessionWithIdentifier:(NSString *)identifier configuration:(_WKAutomationSessionConfiguration *)configuration;
+- (BOOL)_processPoolAllowsRemoteAutomation:(WKProcessPool *)processPool WK_API_AVAILABLE(macosx(10.13), ios(11.0));
+- (void)_processPool:(WKProcessPool *)processPool didRequestAutomationSessionWithIdentifier:(NSString *)identifier configuration:(_WKAutomationSessionConfiguration *)configuration WK_API_AVAILABLE(macosx(10.13.4), ios(11.3));
+
+- (NSString *)_processPoolBrowserNameForAutomation:(WKProcessPool *)processPool WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
+- (NSString *)_processPoolBrowserVersionForAutomation:(WKProcessPool *)processPool WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
 @end
 
 #endif // WK_API_ENABLED
index 4f64b42..1d8316a 100644 (file)
@@ -46,14 +46,16 @@ public:
 
 private:
     // API::AutomationClient
-    bool allowsRemoteAutomation(WebProcessPool*) override { return remoteAutomationAllowed(); }
-    void didRequestAutomationSession(WebKit::WebProcessPool*, const String& sessionIdentifier) override;
+    bool allowsRemoteAutomation(WebProcessPool*) final { return remoteAutomationAllowed(); }
+    void didRequestAutomationSession(WebKit::WebProcessPool*, const String& sessionIdentifier) final;
 
-    void requestAutomationSessionWithCapabilities(NSString *sessionIdentifier, NSDictionary *forwardedCapabilities) override;
+    void requestAutomationSessionWithCapabilities(NSString *sessionIdentifier, NSDictionary *forwardedCapabilities) final;
 
     // RemoteInspector::Client
-    bool remoteAutomationAllowed() const override;
-    void requestAutomationSession(const String& sessionIdentifier) override;
+    bool remoteAutomationAllowed() const final;
+    void requestAutomationSession(const String& sessionIdentifier) final;
+    String browserName() const final;
+    String browserVersion() const final;
 
     WKProcessPool *m_processPool;
     WeakObjCPtr<id <_WKAutomationDelegate>> m_delegate;
@@ -61,6 +63,8 @@ private:
     struct {
         bool allowsRemoteAutomation : 1;
         bool requestAutomationSession : 1;
+        bool browserNameForAutomation : 1;
+        bool browserVersionForAutomation : 1;
     } m_delegateMethods;
 };
 
index a7018d6..289f6cf 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2016-2018 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -35,6 +35,7 @@
 #import "_WKAutomationSessionConfiguration.h"
 #import <JavaScriptCore/RemoteInspector.h>
 #import <JavaScriptCore/RemoteInspectorConstants.h>
+#import <wtf/spi/cf/CFBundleSPI.h>
 #import <wtf/text/WTFString.h>
 
 using namespace Inspector;
@@ -47,6 +48,8 @@ AutomationClient::AutomationClient(WKProcessPool *processPool, id <_WKAutomation
 {
     m_delegateMethods.allowsRemoteAutomation = [delegate respondsToSelector:@selector(_processPoolAllowsRemoteAutomation:)];
     m_delegateMethods.requestAutomationSession = [delegate respondsToSelector:@selector(_processPool:didRequestAutomationSessionWithIdentifier:configuration:)];
+    m_delegateMethods.browserNameForAutomation = [delegate respondsToSelector:@selector(_processPoolBrowserNameForAutomation:)];
+    m_delegateMethods.browserVersionForAutomation = [delegate respondsToSelector:@selector(_processPoolBrowserVersionForAutomation:)];
 
     RemoteInspector::singleton().setClient(this);
 }
@@ -56,11 +59,15 @@ AutomationClient::~AutomationClient()
     RemoteInspector::singleton().setClient(nullptr);
 }
 
+// MARK: API::AutomationClient
+
 void AutomationClient::didRequestAutomationSession(WebKit::WebProcessPool*, const String& sessionIdentifier)
 {
     requestAutomationSession(sessionIdentifier);
 }
 
+// MARK: RemoteInspector::Client
+
 bool AutomationClient::remoteAutomationAllowed() const
 {
     if (m_delegateMethods.allowsRemoteAutomation)
@@ -75,6 +82,28 @@ void AutomationClient::requestAutomationSession(const String& sessionIdentifier)
     requestAutomationSessionWithCapabilities(retainedIdentifier, nil);
 }
 
+String AutomationClient::browserName() const
+{
+    if (m_delegateMethods.browserNameForAutomation)
+        return [m_delegate _processPoolBrowserNameForAutomation:m_processPool];
+
+    // Fall back to using the unlocalized app name (i.e., 'Safari').
+    NSBundle *appBundle = [NSBundle mainBundle];
+    NSString *displayName = appBundle.infoDictionary[(__bridge NSString *)_kCFBundleDisplayNameKey];
+    NSString *readableName = appBundle.infoDictionary[(__bridge NSString *)kCFBundleNameKey];
+    return displayName ?: readableName;
+}
+
+String AutomationClient::browserVersion() const
+{
+    if (m_delegateMethods.browserVersionForAutomation)
+        return [m_delegate _processPoolBrowserVersionForAutomation:m_processPool];
+
+    // Fall back to using the app short version (i.e., '11.1.1').
+    NSBundle *appBundle = [NSBundle mainBundle];
+    return appBundle.infoDictionary[(__bridge NSString *)_kCFBundleShortVersionStringKey];
+}
+
 void AutomationClient::requestAutomationSessionWithCapabilities(NSString *sessionIdentifier, NSDictionary *forwardedCapabilities)
 {
     _WKAutomationSessionConfiguration *configuration = [[[_WKAutomationSessionConfiguration alloc] init] autorelease];