Changeset 295530 in webkit


Ignore:
Timestamp:
Jun 14, 2022 11:06:06 AM (2 years ago)
Author:
pvollan@apple.com
Message:

Create sandbox extension for Power logging service in the GPU process
https://bugs.webkit.org/show_bug.cgi?id=241227
<rdar://82442196>

Reviewed by Geoffrey Garen.

When power logging is enabled, the GPU process on macOS should be granted access to the Power logging service.

  • Source/WTF/wtf/PlatformHave.h:
  • Source/WebCore/PAL/PAL.xcodeproj/project.pbxproj:
  • Source/WebCore/PAL/pal/spi/mac/PowerLogSPI.h: Copied from Source/WebKit/UIProcess/Cocoa/GPUProcessProxyCocoa.mm.
  • Source/WebCore/platform/graphics/cg/ImageDecoderCG.cpp:

(WebCore::createImageSourceOptions):

  • Source/WebKit/Configurations/WebKit.xcconfig:
  • Source/WebKit/GPUProcess/GPUProcess.h:
  • Source/WebKit/GPUProcess/GPUProcess.messages.in:
  • Source/WebKit/GPUProcess/mac/GPUProcessMac.mm:

(WebKit::GPUProcess::openDirectoryCacheInvalidated):
(WebKit::GPUProcess::enablePowerLogging):

  • Source/WebKit/UIProcess/Cocoa/GPUProcessProxyCocoa.mm:

(WebKit::GPUProcessProxy::powerLoggingInTaskMode const):
(WebKit::GPUProcessProxy::enablePowerLogging):

  • Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm:

(WebKit::WebProcessPool::registerNotificationObservers):
(WebKit::WebProcessPool::unregisterNotificationObservers):

  • Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp:

(WebKit::GPUProcessProxy::didFinishLaunching):

  • Source/WebKit/UIProcess/GPU/GPUProcessProxy.h:
  • Source/WebKit/UIProcess/WebProcessPool.h:
  • WebKit.xcworkspace/xcshareddata/xcschemes/All Source.xcscheme:

Canonical link: https://commits.webkit.org/251534@main

Location:
trunk/Source
Files:
12 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/Source/WTF/wtf/PlatformHave.h

    r295528 r295530  
    12571257#define HAVE_APPLE_PUSH_SERVICE_URL_TOKEN_SUPPORT 1
    12581258#endif
     1259
     1260#if (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 130000)
     1261#define HAVE_POWERLOG_TASK_MODE_QUERY 1
     1262#endif
  • trunk/Source/WebCore/PAL/PAL.xcodeproj/project.pbxproj

    r295522 r295530  
    438438                DD20DE6527BC90F90093D175 /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C09D0571E31C57E00725F18 /* config.h */; };
    439439                DDB04F32278E4F1B008D3678 /* libWebKitAdditions.a in Product Dependencies */ = {isa = PBXBuildFile; fileRef = DDE99300278D07B800F60D26 /* libWebKitAdditions.a */; };
     440                E34F26F62846D0D90076E549 /* PowerLogSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = E34F26F52846B7550076E549 /* PowerLogSPI.h */; settings = {ATTRIBUTES = (Private, ); }; };
    440441                F44291641FA52670002CC93E /* FileSizeFormatter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F44291621FA52670002CC93E /* FileSizeFormatter.cpp */; };
    441442                F44291681FA52705002CC93E /* FileSizeFormatterCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = F44291661FA52705002CC93E /* FileSizeFormatterCocoa.mm */; };
     
    949950                DF83E208263734F1000825EF /* CryptoKitPrivateSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CryptoKitPrivateSPI.h; sourceTree = "<group>"; };
    950951                E327C0DE260BDC90002281C5 /* NotifySPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotifySPI.h; sourceTree = "<group>"; };
     952                E34F26F52846B7550076E549 /* PowerLogSPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PowerLogSPI.h; sourceTree = "<group>"; };
    951953                E5D45D112106A07400D2B738 /* NSColorWellSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSColorWellSPI.h; sourceTree = "<group>"; };
    952954                E5D45D132106A18700D2B738 /* NSPopoverColorWellSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSPopoverColorWellSPI.h; sourceTree = "<group>"; };
     
    11641166                                71B1141F26823ACD004D6701 /* SystemPreviewSPI.h */,
    11651167                                0C7785881F45130F00F4EBB6 /* TelephonyUtilitiesSPI.h */,
     1168                                E34F26F52846B7550076E549 /* PowerLogSPI.h */,
    11661169                        );
    11671170                        path = mac;
     
    18011804                                DD20DE3F27BC90D80093D175 /* QuickLookMacSPI.h in Headers */,
    18021805                                DD20DDC127BC90D70093D175 /* QuickLookSoftLink.h in Headers */,
     1806                                E34F26F62846D0D90076E549 /* PowerLogSPI.h in Headers */,
    18031807                                DD20DE1827BC90D80093D175 /* QuickLookSPI.h in Headers */,
    18041808                                DD20DDC727BC90D70093D175 /* QuickLookUISoftLink.h in Headers */,
  • trunk/Source/WebCore/PAL/pal/spi/mac/PowerLogSPI.h

    r295528 r295530  
    11/*
    2  * Copyright (C) 2021 Apple Inc. All rights reserved.
     2 * Copyright (C) 2022 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2424 */
    2525
    26 #include "config.h"
    27 #include "GPUProcessProxy.h"
     26#pragma once
    2827
    29 #if ENABLE(GPU_PROCESS)
     28#if USE(APPLE_INTERNAL_SDK)
    3029
    31 #include "GPUProcessCreationParameters.h"
    32 #include "MediaPermissionUtilities.h"
     30#include <PowerLog/PLClientLogging.h>
     31#include <PowerLog/PLXPCClientHeader.h>
    3332
    34 namespace WebKit {
     33#else // USE(APPLE_INTERNAL_SDK)
    3534
    36 void GPUProcessProxy::platformInitializeGPUProcessParameters(GPUProcessCreationParameters& parameters)
     35typedef CF_ENUM(short, PLClientID)
    3736{
    38     parameters.mobileGestaltExtensionHandle = createMobileGestaltSandboxExtensionIfNeeded();
    39     parameters.applicationVisibleName = applicationVisibleName();
    40 }
     37    PLClientIDWebKit = 132
     38};
    4139
    42 }
     40WTF_EXTERN_C_BEGIN
     41
     42CFDictionaryRef PLQueryRegistered(PLClientID, CFStringRef queryName, CFDictionaryRef parameters);
     43
     44WTF_EXTERN_C_END
    4345
    4446#endif
     47
     48extern NSString *const kPLTaskingStartNotification;
  • trunk/Source/WebKit/Configurations/WebKit.xcconfig

    r295432 r295530  
    174174WK_INSTALL_COORDINATION_LDFLAGS_iphonesimulator = $(WK_INSTALL_COORDINATION_LDFLAGS_iphoneos)
    175175
    176 FRAMEWORK_AND_LIBRARY_LDFLAGS = -lobjc -framework CFNetwork -framework CoreAudio -framework CoreFoundation -framework CoreGraphics -framework CoreText -framework Foundation -framework ImageIO -framework IOKit -framework IOSurface -framework WebKitLegacy -lnetwork -framework Metal $(WK_ACCESSIBILITY_LDFLAGS) $(WK_APPKIT_LDFLAGS) $(WK_APPLE_PUSH_SERVICE_LDFLAGS) $(WK_BACKBOARD_SERVICES_LDFLAGS) $(WK_RUNNINGBOARD_SERVICES_LDFLAGS) $(WK_AUTHKIT_LDFLAGS) $(WK_CARBON_LDFLAGS) $(WK_CONTACTS_LDFLAGS) $(WK_CORE_PREDICTION_LDFLAGS) $(WK_CORE_SERVICES_LDFLAGS) $(WK_GRAPHICS_SERVICES_LDFLAGS) $(WK_LIBNETWORKEXTENSION_LDFLAGS) $(WK_LIBSANDBOX_LDFLAGS) $(WK_LIBWEBRTC_LDFLAGS) $(WK_MOBILE_CORE_SERVICES_LDFLAGS) $(WK_MOBILE_GESTALT_LDFLAGS) $(WK_PDFKIT_LDFLAGS) $(WK_PROTOTYPE_TOOLS_LDFLAGS) $(WK_SAFE_BROWSING_LDFLAGS) $(WK_SECURITY_INTERFACE_LDFLAGS) $(WK_UIKIT_LDFLAGS) $(WK_UNIFORM_TYPE_IDENTIFIERS_LDFLAGS) $(WK_URL_FORMATTING_LDFLAGS) $(WK_WEBINSPECTORUI_LDFLAGS) $(WK_COORDINATOR_LDFLAGS) $(WK_INSTALL_COORDINATION_LDFLAGS) $(WK_APP_STORE_DAEMON_LDFLAGS);
     176WK_POWERLOG_LDFLAGS = $(WK_POWERLOG_LDFLAGS_$(WK_PLATFORM_NAME));
     177WK_POWERLOG_LDFLAGS_macosx = -weak_framework PowerLog -weak_framework PowerlogCore;
     178
     179FRAMEWORK_AND_LIBRARY_LDFLAGS = -lobjc -framework CFNetwork -framework CoreAudio -framework CoreFoundation -framework CoreGraphics -framework CoreText -framework Foundation -framework ImageIO -framework IOKit -framework IOSurface -framework WebKitLegacy -lnetwork -framework Metal $(WK_ACCESSIBILITY_LDFLAGS) $(WK_APPKIT_LDFLAGS) $(WK_APPLE_PUSH_SERVICE_LDFLAGS) $(WK_BACKBOARD_SERVICES_LDFLAGS) $(WK_RUNNINGBOARD_SERVICES_LDFLAGS) $(WK_AUTHKIT_LDFLAGS) $(WK_CARBON_LDFLAGS) $(WK_CONTACTS_LDFLAGS) $(WK_CORE_PREDICTION_LDFLAGS) $(WK_CORE_SERVICES_LDFLAGS) $(WK_GRAPHICS_SERVICES_LDFLAGS) $(WK_LIBNETWORKEXTENSION_LDFLAGS) $(WK_LIBSANDBOX_LDFLAGS) $(WK_LIBWEBRTC_LDFLAGS) $(WK_MOBILE_CORE_SERVICES_LDFLAGS) $(WK_MOBILE_GESTALT_LDFLAGS) $(WK_PDFKIT_LDFLAGS) $(WK_PROTOTYPE_TOOLS_LDFLAGS) $(WK_SAFE_BROWSING_LDFLAGS) $(WK_SECURITY_INTERFACE_LDFLAGS) $(WK_UIKIT_LDFLAGS) $(WK_UNIFORM_TYPE_IDENTIFIERS_LDFLAGS) $(WK_URL_FORMATTING_LDFLAGS) $(WK_WEBINSPECTORUI_LDFLAGS) $(WK_COORDINATOR_LDFLAGS) $(WK_INSTALL_COORDINATION_LDFLAGS) $(WK_APP_STORE_DAEMON_LDFLAGS) $(WK_POWERLOG_LDFLAGS);
    177180
    178181// Prevent C++ standard library basic_stringstream, operator new, delete and their related exception types from being exported as weak symbols.
  • trunk/Source/WebKit/GPUProcess/GPUProcess.h

    r294802 r295530  
    202202#endif
    203203
     204#if HAVE(POWERLOG_TASK_MODE_QUERY)
     205    void enablePowerLogging(SandboxExtension::Handle&&);
     206#endif
     207
    204208    // Connections to WebProcesses.
    205209    HashMap<WebCore::ProcessIdentifier, Ref<GPUConnectionToWebProcess>> m_webProcessConnections;
  • trunk/Source/WebKit/GPUProcess/GPUProcess.messages.in

    r294802 r295530  
    9292#endif
    9393
     94#if HAVE(POWERLOG_TASK_MODE_QUERY)
     95    EnablePowerLogging(WebKit::SandboxExtension::Handle handle)
     96#endif
     97
    9498    WebProcessConnectionCountForTesting() -> (uint64_t count)
    9599}
  • trunk/Source/WebKit/GPUProcess/mac/GPUProcessMac.mm

    r293509 r295530  
    106106#endif
    107107
     108#if HAVE(POWERLOG_TASK_MODE_QUERY)
     109void GPUProcess::enablePowerLogging(SandboxExtension::Handle&& handle)
     110{
     111    SandboxExtension::consumePermanently(WTFMove(handle));
     112}
     113#endif // HAVE(POWERLOG_TASK_MODE_QUERY)
     114
    108115} // namespace WebKit
    109116
  • trunk/Source/WebKit/GPUProcess/mac/com.apple.WebKit.GPUProcess.sb.in

    r294969 r295530  
    653653
    654654(allow mach-lookup
    655     (global-name "com.apple.powerlog.plxpclogger.xpc"))
     655    (require-all
     656        (extension "com.apple.webkit.extension.mach")
     657        (global-name "com.apple.powerlog.plxpclogger.xpc")))
    656658
    657659(with-filter (uid 0)
  • trunk/Source/WebKit/UIProcess/Cocoa/GPUProcessProxyCocoa.mm

    r295087 r295530  
    3030
    3131#include "GPUProcessCreationParameters.h"
     32#include "GPUProcessMessages.h"
    3233#include "MediaPermissionUtilities.h"
     34
     35#if HAVE(POWERLOG_TASK_MODE_QUERY)
     36#include <pal/spi/mac/PowerLogSPI.h>
     37#endif
    3338
    3439namespace WebKit {
     
    4045}
    4146
     47#if HAVE(POWERLOG_TASK_MODE_QUERY)
     48bool GPUProcessProxy::isPowerLoggingInTaskMode()
     49{
     50    PLClientID clientIDWebKit = static_cast<PLClientID>(132); // FIXME: Replace with PLClientIDWebKit when available in SDK
     51    auto dictionary = adoptCF(PLQueryRegistered(clientIDWebKit, CFSTR("TaskModeQuery"), nullptr));
     52    if (!dictionary)
     53        return false;
     54    CFNumberRef taskModeRef = static_cast<CFNumberRef>(CFDictionaryGetValue(dictionary.get(), CFSTR("Task Mode")));
     55    if (!taskModeRef)
     56        return false;
     57    int taskMode = 0;
     58    if (!CFNumberGetValue(taskModeRef, kCFNumberIntType, &taskMode))
     59        return false;
     60    return !!taskMode;
     61}
     62
     63void GPUProcessProxy::enablePowerLogging()
     64{
     65    auto handle = SandboxExtension::createHandleForMachLookup("com.apple.powerlog.plxpclogger.xpc"_s, std::nullopt);
     66    if (!handle)
     67        return;
     68    send(Messages::GPUProcess::EnablePowerLogging(*handle), 0);
     69}
     70#endif // HAVE(POWERLOG_TASK_MODE_QUERY)
     71
    4272}
    4373
  • trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm

    r295493 r295530  
    9696#endif
    9797
     98#if HAVE(POWERLOG_TASK_MODE_QUERY)
     99#import <pal/spi/mac/PowerLogSPI.h>
     100#endif
     101
    98102#if PLATFORM(IOS_FAMILY)
    99103#import <pal/spi/ios/MobileGestaltSPI.h>
     
    704708    addCFNotificationObserver(mediaAccessibilityPreferencesChangedCallback, kMAXCaptionAppearanceSettingsChangedNotification);
    705709#endif
     710#if HAVE(POWERLOG_TASK_MODE_QUERY) && ENABLE(GPU_PROCESS)
     711    m_powerLogObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kPLTaskingStartNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) {
     712        if (auto* gpuProcess = GPUProcessProxy::singletonIfCreated())
     713            gpuProcess->enablePowerLogging();
     714    }];
     715#endif // HAVE(POWERLOG_TASK_MODE_QUERY) && ENABLE(GPU_PROCESS)
    706716}
    707717
     
    754764    removeCFNotificationObserver(kMAXCaptionAppearanceSettingsChangedNotification);
    755765#endif
    756 
     766#if HAVE(POWERLOG_TASK_MODE_QUERY) && ENABLE(GPU_PROCESS)
     767    [[NSNotificationCenter defaultCenter] removeObserver:m_powerLogObserver.get()];
     768#endif
    757769    m_weakObserver = nil;
    758770}
  • trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp

    r294802 r295530  
    6363#endif
    6464
     65#if PLATFORM(COCOA)
     66#include <wtf/BlockPtr.h>
     67#endif
     68
    6569#define MESSAGE_CHECK(assertion) MESSAGE_CHECK_BASE(assertion, this->connection())
    6670
     
    471475    for (auto& processPool : WebProcessPool::allProcessPools())
    472476        processPool->gpuProcessDidFinishLaunching(processIdentifier());
     477
     478#if HAVE(POWERLOG_TASK_MODE_QUERY)
     479    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), makeBlockPtr([weakThis = WeakPtr { *this }] () mutable {
     480        if (!isPowerLoggingInTaskMode())
     481            return;
     482        RunLoop::main().dispatch([weakThis = WTFMove(weakThis)] () {
     483            if (!weakThis)
     484                return;
     485            weakThis->enablePowerLogging();
     486        });
     487    }).get());
     488#endif
    473489}
    474490
  • trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.h

    r294802 r295530  
    103103#endif
    104104
     105#if HAVE(POWERLOG_TASK_MODE_QUERY)
     106    void enablePowerLogging();
     107    static bool isPowerLoggingInTaskMode();
     108#endif
     109
    105110    void updatePreferences(WebProcessProxy&);
    106111    void updateScreenPropertiesIfNeeded();
  • trunk/Source/WebKit/UIProcess/WebProcessPool.h

    r295493 r295530  
    690690#endif
    691691
     692#if HAVE(POWERLOG_TASK_MODE_QUERY) && ENABLE(GPU_PROCESS)
     693    RetainPtr<NSObject> m_powerLogObserver;
     694#endif
     695
    692696#if PLATFORM(COCOA)
    693697    std::unique_ptr<WebCore::PowerSourceNotifier> m_powerSourceNotifier;
Note: See TracChangeset for help on using the changeset viewer.