Title: [282803] trunk/Source/WebKit
Revision
282803
Author
[email protected]
Date
2021-09-21 00:18:03 -0700 (Tue, 21 Sep 2021)

Log Message

Ensure that capture attribution works even for URLS without hostnames
https://bugs.webkit.org/show_bug.cgi?id=230479
<rdar://81832853>

Reviewed by Eric Carlson.

Some URLs allow to call getUserMedia but do not have origins, like custom scheme URLs.
In that case, the attribution status call was failing previously as we were not able to get a visible name to provide.
We mimick what we are doing for the default prompt by using the visible application name if the origin is not available.
Since we do the system attribution in GPUProcess, we now send the visible name to GPUProcess when creating it.

Manually tested.
We do not have system status attributon on MacOS or simulator so we cannot test it automatically.

* GPUProcess/GPUProcess.cpp:
(WebKit::GPUProcess::initializeGPUProcess):
* GPUProcess/GPUProcess.h:
(WebKit::GPUProcess::applicationVisibleName const):
* GPUProcess/GPUProcessCreationParameters.cpp:
(WebKit::GPUProcessCreationParameters::encode const):
(WebKit::GPUProcessCreationParameters::decode):
* GPUProcess/GPUProcessCreationParameters.h:
* GPUProcess/cocoa/GPUConnectionToWebProcessCocoa.mm:
(WebKit::GPUConnectionToWebProcess::setCaptureAttributionString):
* UIProcess/Cocoa/GPUProcessProxyCocoa.mm:
(WebKit::GPUProcessProxy::platformInitializeGPUProcessParameters):
* UIProcess/Cocoa/MediaPermissionUtilities.mm:
(WebKit::applicationVisibleNameFromOrigin):
(WebKit::applicationVisibleName):
(WebKit::alertMessageText):
* UIProcess/MediaPermissionUtilities.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (282802 => 282803)


--- trunk/Source/WebKit/ChangeLog	2021-09-21 07:14:09 UTC (rev 282802)
+++ trunk/Source/WebKit/ChangeLog	2021-09-21 07:18:03 UTC (rev 282803)
@@ -1,3 +1,37 @@
+2021-09-21  Youenn Fablet  <[email protected]>
+
+        Ensure that capture attribution works even for URLS without hostnames
+        https://bugs.webkit.org/show_bug.cgi?id=230479
+        <rdar://81832853>
+
+        Reviewed by Eric Carlson.
+
+        Some URLs allow to call getUserMedia but do not have origins, like custom scheme URLs.
+        In that case, the attribution status call was failing previously as we were not able to get a visible name to provide.
+        We mimick what we are doing for the default prompt by using the visible application name if the origin is not available.
+        Since we do the system attribution in GPUProcess, we now send the visible name to GPUProcess when creating it.
+
+        Manually tested.
+        We do not have system status attributon on MacOS or simulator so we cannot test it automatically.
+
+        * GPUProcess/GPUProcess.cpp:
+        (WebKit::GPUProcess::initializeGPUProcess):
+        * GPUProcess/GPUProcess.h:
+        (WebKit::GPUProcess::applicationVisibleName const):
+        * GPUProcess/GPUProcessCreationParameters.cpp:
+        (WebKit::GPUProcessCreationParameters::encode const):
+        (WebKit::GPUProcessCreationParameters::decode):
+        * GPUProcess/GPUProcessCreationParameters.h:
+        * GPUProcess/cocoa/GPUConnectionToWebProcessCocoa.mm:
+        (WebKit::GPUConnectionToWebProcess::setCaptureAttributionString):
+        * UIProcess/Cocoa/GPUProcessProxyCocoa.mm:
+        (WebKit::GPUProcessProxy::platformInitializeGPUProcessParameters):
+        * UIProcess/Cocoa/MediaPermissionUtilities.mm:
+        (WebKit::applicationVisibleNameFromOrigin):
+        (WebKit::applicationVisibleName):
+        (WebKit::alertMessageText):
+        * UIProcess/MediaPermissionUtilities.h:
+
 2021-09-20  Chris Dumez  <[email protected]>
 
         Avoid doing a second server pre-connect after a process-swap

Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.cpp (282802 => 282803)


--- trunk/Source/WebKit/GPUProcess/GPUProcess.cpp	2021-09-21 07:14:09 UTC (rev 282802)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.cpp	2021-09-21 07:18:03 UTC (rev 282803)
@@ -249,6 +249,8 @@
     WebKit::logChannels().initializeLogChannelsIfNecessary(parameters.webKitLoggingChannels);
 #endif
 
+    m_applicationVisibleName = WTFMove(parameters.applicationVisibleName);
+
     // Match the QoS of the UIProcess since the GPU process is doing rendering on its behalf.
     WTF::Thread::setCurrentThreadIsUserInteractive(0);
 

Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.h (282802 => 282803)


--- trunk/Source/WebKit/GPUProcess/GPUProcess.h	2021-09-21 07:14:09 UTC (rev 282802)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.h	2021-09-21 07:18:03 UTC (rev 282803)
@@ -97,6 +97,8 @@
 
     void tryExitIfUnusedAndUnderMemoryPressure();
 
+    const String& applicationVisibleName() const { return m_applicationVisibleName; }
+
 private:
     void lowMemoryHandler(Critical, Synchronous);
 
@@ -209,6 +211,7 @@
 #if ENABLE(VORBIS)
     bool m_vorbisEnabled { false };
 #endif
+    String m_applicationVisibleName;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/GPUProcess/GPUProcessCreationParameters.cpp (282802 => 282803)


--- trunk/Source/WebKit/GPUProcess/GPUProcessCreationParameters.cpp	2021-09-21 07:14:09 UTC (rev 282802)
+++ trunk/Source/WebKit/GPUProcess/GPUProcessCreationParameters.cpp	2021-09-21 07:18:03 UTC (rev 282803)
@@ -62,6 +62,8 @@
     encoder << wtfLoggingChannels;
     encoder << webCoreLoggingChannels;
     encoder << webKitLoggingChannels;
+
+    encoder << applicationVisibleName;
 }
 
 bool GPUProcessCreationParameters::decode(IPC::Decoder& decoder, GPUProcessCreationParameters& result)
@@ -117,6 +119,9 @@
     if (!decoder.decode(result.webKitLoggingChannels))
         return false;
 
+    if (!decoder.decode(result.applicationVisibleName))
+        return false;
+
     return true;
 }
 

Modified: trunk/Source/WebKit/GPUProcess/GPUProcessCreationParameters.h (282802 => 282803)


--- trunk/Source/WebKit/GPUProcess/GPUProcessCreationParameters.h	2021-09-21 07:14:09 UTC (rev 282802)
+++ trunk/Source/WebKit/GPUProcess/GPUProcessCreationParameters.h	2021-09-21 07:18:03 UTC (rev 282803)
@@ -61,6 +61,8 @@
     String webCoreLoggingChannels;
     String webKitLoggingChannels;
 
+    String applicationVisibleName;
+
     void encode(IPC::Encoder&) const;
     static WARN_UNUSED_RETURN bool decode(IPC::Decoder&, GPUProcessCreationParameters&);
 };

Modified: trunk/Source/WebKit/GPUProcess/cocoa/GPUConnectionToWebProcessCocoa.mm (282802 => 282803)


--- trunk/Source/WebKit/GPUProcess/cocoa/GPUConnectionToWebProcessCocoa.mm	2021-09-21 07:14:09 UTC (rev 282802)
+++ trunk/Source/WebKit/GPUProcess/cocoa/GPUConnectionToWebProcessCocoa.mm	2021-09-21 07:18:03 UTC (rev 282803)
@@ -28,6 +28,7 @@
 
 #if ENABLE(GPU_PROCESS)
 
+#import "MediaPermissionUtilities.h"
 #import "SystemStatusSPI.h"
 #import <WebCore/LocalizedStrings.h>
 #import <WebCore/RegistrableDomain.h>
@@ -43,16 +44,16 @@
     if (![PAL::getSTDynamicActivityAttributionPublisherClass() respondsToSelector:@selector(setCurrentAttributionStringWithFormat:auditToken:)])
         return true;
 
-    auto domain = WebCore::RegistrableDomain { m_captureOrigin->data() };
-    if (domain.isEmpty())
-        return false;
-
     auto auditToken = gpuProcess().parentProcessConnection()->getAuditToken();
     if (!auditToken)
         return false;
 
-    RetainPtr<NSString> formatString = [NSString stringWithFormat:WEB_UI_STRING("“%@” in “%%@”", "The domain and application using the camera and/or microphone. The first argument is domain, the second is the application name (iOS only)."), (NSString *)domain.string()];
+    auto *visibleName = applicationVisibleNameFromOrigin(m_captureOrigin->data());
+    if (!visibleName)
+        visibleName = gpuProcess().applicationVisibleName();
 
+    RetainPtr<NSString> formatString = [NSString stringWithFormat:WEB_UI_STRING("“%@” in “%%@”", "The domain and application using the camera and/or microphone. The first argument is domain, the second is the application name (iOS only)."), visibleName];
+
     [PAL::getSTDynamicActivityAttributionPublisherClass() setCurrentAttributionStringWithFormat:formatString.get() auditToken:auditToken.value()];
 #endif
 

Modified: trunk/Source/WebKit/UIProcess/Cocoa/GPUProcessProxyCocoa.mm (282802 => 282803)


--- trunk/Source/WebKit/UIProcess/Cocoa/GPUProcessProxyCocoa.mm	2021-09-21 07:14:09 UTC (rev 282802)
+++ trunk/Source/WebKit/UIProcess/Cocoa/GPUProcessProxyCocoa.mm	2021-09-21 07:18:03 UTC (rev 282803)
@@ -29,6 +29,7 @@
 #if ENABLE(GPU_PROCESS)
 
 #include "GPUProcessCreationParameters.h"
+#include "MediaPermissionUtilities.h"
 
 namespace WebKit {
 
@@ -39,6 +40,8 @@
     parameters.webCoreLoggingChannels = [[NSUserDefaults standardUserDefaults] stringForKey:@"WebCoreLogging"];
     parameters.webKitLoggingChannels = [[NSUserDefaults standardUserDefaults] stringForKey:@"WebKit2Logging"];
 #endif
+
+    parameters.applicationVisibleName = applicationVisibleName();
 }
 
 }

Modified: trunk/Source/WebKit/UIProcess/Cocoa/MediaPermissionUtilities.mm (282802 => 282803)


--- trunk/Source/WebKit/UIProcess/Cocoa/MediaPermissionUtilities.mm	2021-09-21 07:14:09 UTC (rev 282802)
+++ trunk/Source/WebKit/UIProcess/Cocoa/MediaPermissionUtilities.mm	2021-09-21 07:18:03 UTC (rev 282803)
@@ -110,16 +110,27 @@
     return startsWithLettersIgnoringASCIICase(domain, "www.") ? domain.substring(4) : domain;
 }
 
+NSString *applicationVisibleNameFromOrigin(const WebCore::SecurityOriginData& origin)
+{
+    if (origin.protocol != "http" && origin.protocol != "https")
+        return nil;
+
+    return visibleDomain(origin.host);
+}
+
+NSString *applicationVisibleName()
+{
+    NSBundle *appBundle = [NSBundle mainBundle];
+    NSString *displayName = appBundle.infoDictionary[(__bridge NSString *)_kCFBundleDisplayNameKey];
+    NSString *readableName = appBundle.infoDictionary[(__bridge NSString *)kCFBundleNameKey];
+    return displayName ?: readableName;
+}
+
 static NSString *alertMessageText(MediaPermissionReason reason, const WebCore::SecurityOriginData& origin)
 {
-    NSString *visibleOrigin;
-    if (origin.protocol != "http" && origin.protocol != "https") {
-        NSBundle *appBundle = [NSBundle mainBundle];
-        NSString *displayName = appBundle.infoDictionary[(__bridge NSString *)_kCFBundleDisplayNameKey];
-        NSString *readableName = appBundle.infoDictionary[(__bridge NSString *)kCFBundleNameKey];
-        visibleOrigin = displayName ?: readableName;
-    } else
-        visibleOrigin = visibleDomain(origin.host);
+    NSString *visibleOrigin = applicationVisibleNameFromOrigin(origin);
+    if (!visibleOrigin)
+        visibleOrigin = applicationVisibleName();
 
     switch (reason) {
     case MediaPermissionReason::Camera:

Modified: trunk/Source/WebKit/UIProcess/MediaPermissionUtilities.h (282802 => 282803)


--- trunk/Source/WebKit/UIProcess/MediaPermissionUtilities.h	2021-09-21 07:14:09 UTC (rev 282802)
+++ trunk/Source/WebKit/UIProcess/MediaPermissionUtilities.h	2021-09-21 07:18:03 UTC (rev 282803)
@@ -62,6 +62,8 @@
 bool checkUsageDescriptionStringForType(MediaPermissionType);
 bool checkUsageDescriptionStringForSpeechRecognition();
 
+NSString *applicationVisibleNameFromOrigin(const WebCore::SecurityOriginData&);
+NSString *applicationVisibleName();
 void alertForPermission(WebPageProxy&, MediaPermissionReason, const WebCore::SecurityOriginData&, CompletionHandler<void(bool)>&&);
 #endif
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to