Skip to content

Commit

Permalink
Apply patch. rdar://120427651
Browse files Browse the repository at this point in the history
Identifier: 272448.685@safari-7618-branch
  • Loading branch information
Dan Robson authored and drobson1005 committed Mar 6, 2024
1 parent 028628c commit 11c5ecc
Show file tree
Hide file tree
Showing 29 changed files with 392 additions and 200 deletions.
6 changes: 3 additions & 3 deletions Source/WebKit/NetworkProcess/NetworkProcess.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2970,7 +2970,7 @@ void NetworkProcess::setIsHoldingLockedFiles(bool isHoldingLockedFiles)
if (!isHoldingLockedFiles) {
m_holdingLockedFileAssertion = nullptr;
#if USE(EXTENSIONKIT)
invalidateGrant();
invalidateFileActivity();
#endif
return;
}
Expand All @@ -2979,9 +2979,9 @@ void NetworkProcess::setIsHoldingLockedFiles(bool isHoldingLockedFiles)
return;

#if USE(EXTENSIONKIT)
if (hasAcquiredGrant())
if (hasAcquiredFileActivity())
return;
if (aqcuireLockedFileGrant())
if (acquireLockedFileActivity())
return;
#endif

Expand Down
8 changes: 4 additions & 4 deletions Source/WebKit/NetworkProcess/NetworkProcess.h
Original file line number Diff line number Diff line change
Expand Up @@ -522,9 +522,9 @@ class NetworkProcess : public AuxiliaryProcess, private DownloadManager::Client,
#if USE(RUNNINGBOARD)
void setIsHoldingLockedFiles(bool);
#if USE(EXTENSIONKIT)
bool aqcuireLockedFileGrant();
void invalidateGrant();
bool hasAcquiredGrant() const;
bool acquireLockedFileActivity();
void invalidateFileActivity();
bool hasAcquiredFileActivity() const;
#endif
#endif
void stopRunLoopIfNecessary();
Expand Down Expand Up @@ -563,7 +563,7 @@ class NetworkProcess : public AuxiliaryProcess, private DownloadManager::Client,
#if USE(RUNNINGBOARD)
WebSQLiteDatabaseTracker m_webSQLiteDatabaseTracker;
#if USE(EXTENSIONKIT)
RetainPtr<WKGrant> m_holdingLockedFileGrant;
OSObjectPtr<dispatch_semaphore_t> m_holdingLockedFileSemaphore;
#endif
RefPtr<ProcessAssertion> m_holdingLockedFileAssertion;
#endif
Expand Down
39 changes: 25 additions & 14 deletions Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm
Original file line number Diff line number Diff line change
Expand Up @@ -257,29 +257,40 @@ void saveCookies(NSHTTPCookieStorage *cookieStorage, CompletionHandler<void()>&&
#endif // HAVE(NW_PROXY_CONFIG)

#if USE(RUNNINGBOARD) && USE(EXTENSIONKIT)
bool NetworkProcess::aqcuireLockedFileGrant()
bool NetworkProcess::acquireLockedFileActivity()
{
[m_holdingLockedFileGrant invalidateGrant];
m_holdingLockedFileGrant = [WKProcessExtension.sharedInstance grant:@"com.apple.common" name:@"FinishTaskInterruptable"];
if (m_holdingLockedFileGrant)
RELEASE_LOG(Process, "Successfully took assertion on Network process for locked file.");
else
RELEASE_LOG_ERROR(Process, "Unable to take assertion on Network process for locked file.");
return !!m_holdingLockedFileGrant;
RELEASE_LOG(Process, "NetworkProcess::acquireLockedFileActivity hasAcquiredFileActivity = %d", hasAcquiredFileActivity());

invalidateFileActivity();

m_holdingLockedFileSemaphore = adoptOSObject(dispatch_semaphore_create(0));
[[NSProcessInfo processInfo] performExpiringActivityWithReason:@"Expiring activity for locked file" usingBlock:[holdingLockedFileSemaphore = m_holdingLockedFileSemaphore] (BOOL expired) {
RELEASE_LOG(Process, "Starting expiring activity, expired = %d", expired);
if (!expired) {
auto timeout = dispatch_time(DISPATCH_TIME_NOW, 30 * NSEC_PER_SEC);
dispatch_semaphore_wait(holdingLockedFileSemaphore.get(), timeout);
}
}];

return true;
}

void NetworkProcess::invalidateGrant()
void NetworkProcess::invalidateFileActivity()
{
if (!hasAcquiredGrant())
RELEASE_LOG(Process, "NetworkProcess::invalidateActivity hasAcquiredFileActivity = %d", hasAcquiredFileActivity());

if (!hasAcquiredFileActivity())
return;

[m_holdingLockedFileGrant invalidateGrant];
m_holdingLockedFileGrant = nil;
if (m_holdingLockedFileSemaphore) {
dispatch_semaphore_signal(m_holdingLockedFileSemaphore.get());
m_holdingLockedFileSemaphore = nullptr;
}
}

bool NetworkProcess::hasAcquiredGrant() const
bool NetworkProcess::hasAcquiredFileActivity() const
{
return !!m_holdingLockedFileGrant;
return !!m_holdingLockedFileSemaphore;
}
#endif

Expand Down
2 changes: 0 additions & 2 deletions Source/WebKit/Platform/cocoa/AssertionCapability.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,15 +43,13 @@ class AssertionCapability final : public ExtensionCapability {

// ExtensionCapability
String environmentIdentifier() const final { return m_environmentIdentifier; }
RetainPtr<_SECapability> platformCapability() const final;

private:
String m_environmentIdentifier;
String m_domain;
String m_name;
BlockPtr<void()> m_willInvalidateBlock;
BlockPtr<void()> m_didInvalidateBlock;
RetainPtr<_SECapability> m_capability;
};

} // namespace WebKit
Expand Down
21 changes: 9 additions & 12 deletions Source/WebKit/Platform/cocoa/AssertionCapability.mm
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@

#if ENABLE(EXTENSION_CAPABILITIES)

#import "ExtensionKitSoftLink.h"
#import "Logging.h"
#import <BrowserEngineKit/BrowserEngineKit.h>

namespace WebKit {

Expand All @@ -39,17 +40,13 @@
, m_willInvalidateBlock { makeBlockPtr(WTFMove(willInvalidateFunction)) }
, m_didInvalidateBlock { makeBlockPtr(WTFMove(didInvalidateFunction)) }
{
#if USE(EXTENSIONKIT)
if ([get_SECapabilityClass() respondsToSelector:@selector(assertionWithDomain:name:environmentIdentifier:willInvalidate:didInvalidate:)])
m_capability = [get_SECapabilityClass() assertionWithDomain:m_domain name:m_name environmentIdentifier:m_environmentIdentifier willInvalidate:m_willInvalidateBlock.get() didInvalidate:m_didInvalidateBlock.get()];
if ([get_SECapabilityClass() respondsToSelector:@selector(assertionWithDomain:name:environmentIdentifier:)])
m_capability = [get_SECapabilityClass() assertionWithDomain:m_domain name:m_name environmentIdentifier:m_environmentIdentifier];
#endif
}

RetainPtr<_SECapability> AssertionCapability::platformCapability() const
{
return m_capability;
RELEASE_LOG(Process, "AssertionCapability::AssertionCapability: taking assertion %{public}s", m_name.utf8().data());
if (m_name == "Suspended"_s)
setPlatformCapability([BEProcessCapability suspended]);
else if (m_name == "Background"_s)
setPlatformCapability([BEProcessCapability background]);
else if (m_name == "Foreground"_s)
setPlatformCapability([BEProcessCapability foreground]);
}

} // namespace WebKit
Expand Down
9 changes: 7 additions & 2 deletions Source/WebKit/Platform/cocoa/ExtensionCapability.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,19 +28,24 @@
#if ENABLE(EXTENSION_CAPABILITIES)

#include <wtf/Forward.h>
#include <wtf/RetainPtr.h>

OBJC_CLASS _SECapability;
OBJC_CLASS BEProcessCapability;

namespace WebKit {

class ExtensionCapability {
public:
virtual ~ExtensionCapability() = default;
virtual String environmentIdentifier() const = 0;
virtual RetainPtr<_SECapability> platformCapability() const = 0;
BEProcessCapability *platformCapability() const { return m_platformCapability.get(); }

protected:
ExtensionCapability() = default;
void setPlatformCapability(BEProcessCapability *capability) { m_platformCapability = capability; }

private:
RetainPtr<BEProcessCapability> m_platformCapability;
};

} // namespace WebKit
Expand Down
8 changes: 4 additions & 4 deletions Source/WebKit/Platform/cocoa/ExtensionCapabilityGrant.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
#include <wtf/RetainPtr.h>
#include <wtf/text/WTFString.h>

OBJC_PROTOCOL(_SEGrant);
OBJC_PROTOCOL(BEProcessCapabilityGrant);

namespace WebKit {

Expand All @@ -48,13 +48,13 @@ class ExtensionCapabilityGrant {
bool isEmpty() const;
bool isValid() const;

void setPlatformGrant(RetainPtr<_SEGrant>&&);
void setPlatformGrant(RetainPtr<BEProcessCapabilityGrant>&&);

private:
ExtensionCapabilityGrant(String&&, RetainPtr<_SEGrant>&&);
ExtensionCapabilityGrant(String&&, RetainPtr<BEProcessCapabilityGrant>&&);

String m_environmentIdentifier;
RetainPtr<_SEGrant> m_platformGrant;
RetainPtr<BEProcessCapabilityGrant> m_platformGrant;
};

} // namespace WebKit
Expand Down
14 changes: 7 additions & 7 deletions Source/WebKit/Platform/cocoa/ExtensionCapabilityGrant.mm
Original file line number Diff line number Diff line change
Expand Up @@ -30,19 +30,19 @@

#import "ExtensionKitSPI.h"
#import "Logging.h"
#import <BrowserEngineKit/BrowserEngineKit.h>
#import <wtf/CrossThreadCopier.h>

namespace WebKit {

static void platformInvalidate(RetainPtr<_SEGrant>&& platformGrant)
static void platformInvalidate(BEProcessCapabilityGrant *platformGrant)
{
if (![platformGrant isValid])
return;

#if USE(EXTENSIONKIT)
NSError *error = nil;
if (![platformGrant invalidateWithError:&error])
RELEASE_LOG_ERROR(ProcessCapabilities, "Invalidating grant %{public}@ failed with error: %{public}@", platformGrant.get(), error);
if (![platformGrant invalidate])
RELEASE_LOG_ERROR(ProcessCapabilities, "Invalidating grant %{public}@ failed", platformGrant);
#endif
}

Expand All @@ -51,7 +51,7 @@ static void platformInvalidate(RetainPtr<_SEGrant>&& platformGrant)
{
}

ExtensionCapabilityGrant::ExtensionCapabilityGrant(String&& environmentIdentifier, RetainPtr<_SEGrant>&& platformGrant)
ExtensionCapabilityGrant::ExtensionCapabilityGrant(String&& environmentIdentifier, RetainPtr<BEProcessCapabilityGrant>&& platformGrant)
: m_environmentIdentifier { WTFMove(environmentIdentifier) }
, m_platformGrant { WTFMove(platformGrant) }
{
Expand Down Expand Up @@ -84,9 +84,9 @@ static void platformInvalidate(RetainPtr<_SEGrant>&& platformGrant)
return false;
}

void ExtensionCapabilityGrant::setPlatformGrant(RetainPtr<_SEGrant>&& platformGrant)
void ExtensionCapabilityGrant::setPlatformGrant(RetainPtr<BEProcessCapabilityGrant>&& platformGrant)
{
platformInvalidate(std::exchange(m_platformGrant, WTFMove(platformGrant)));
platformInvalidate(std::exchange(m_platformGrant, WTFMove(platformGrant)).get());
}

} // namespace WebKit
Expand Down
7 changes: 5 additions & 2 deletions Source/WebKit/Platform/cocoa/MediaCapability.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ namespace WebCore {
class RegistrableDomain;
}

OBJC_CLASS BEMediaEnvironment;

namespace WebKit {

class ExtensionCapabilityGrant;
Expand Down Expand Up @@ -64,12 +66,13 @@ class MediaCapability final : public ExtensionCapability, public CanMakeWeakPtr<

// ExtensionCapability
String environmentIdentifier() const final;
RetainPtr<_SECapability> platformCapability() const final { return m_platformCapability.get(); }

BEMediaEnvironment *platformMediaEnvironment() const { return m_mediaEnvironment.get(); }

private:
State m_state { State::Inactive };
URL m_url;
RetainPtr<_SECapability> m_platformCapability;
RetainPtr<BEMediaEnvironment> m_mediaEnvironment;
};

} // namespace WebKit
Expand Down
21 changes: 7 additions & 14 deletions Source/WebKit/Platform/cocoa/MediaCapability.mm
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

#if ENABLE(EXTENSION_CAPABILITIES)

#import <BrowserEngineKit/BECapability.h>
#import <WebCore/RegistrableDomain.h>
#import <wtf/text/WTFString.h>

Expand All @@ -37,21 +38,11 @@

using WebCore::RegistrableDomain;

static RetainPtr<_SECapability> createPlatformCapability(const URL& url)
{
#if USE(EXTENSIONKIT)
if (_SECapability *capability = [get_SECapabilityClass() mediaWithWebsite:RegistrableDomain(url).string()])
return capability;
#endif

UNUSED_PARAM(url);
return nil;
}

MediaCapability::MediaCapability(URL url)
: m_url { WTFMove(url) }
, m_platformCapability { createPlatformCapability(m_url) }
, m_mediaEnvironment(adoptNS([[BEMediaEnvironment alloc] initWithWebPageURL:m_url]))
{
setPlatformCapability([BEProcessCapability mediaPlaybackAndCaptureWithEnvironment:m_mediaEnvironment.get()]);
}

bool MediaCapability::isActivatingOrActive() const
Expand All @@ -77,8 +68,10 @@
String MediaCapability::environmentIdentifier() const
{
#if USE(EXTENSIONKIT)
if (NSString *mediaEnvironment = [m_platformCapability mediaEnvironment])
return mediaEnvironment;
xpc_object_t xpcObject = [m_mediaEnvironment createXPCRepresentation];
if (!xpcObject)
return emptyString();
return String::fromUTF8(xpc_dictionary_get_string(xpcObject, "identifier"));
#endif

return { };
Expand Down
18 changes: 18 additions & 0 deletions Source/WebKit/Platform/spi/Cocoa/ExtensionKitSPI.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,27 @@

#if USE(EXTENSIONKIT)

#import <BrowserEngineKit/BrowserEngineKit.h>

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface BEWebContentProcess (ExtensionProcess)
+(void)webContentProcessWithBundleID:(NSString *_Nullable)bundleID interruptionHandler:(void(^)(void) _Nullable)interruptionHandler completion:(void(^)(BEWebContentProcess *_Nullable process, NSError *_Nullable error))completion;
@end

@interface BENetworkingProcess (ExtensionProcess)
+(void)networkProcessWithBundleID:(NSString *_Nullable)bundleID interruptionHandler:(void(^)(void) _Nullable)interruptionHandler completion:(void(^)(BENetworkingProcess *_Nullable process, NSError *_Nullable error))completion;
@end

@interface BERenderingProcess (ExtensionProcess)
+(void)renderingProcessWithBundleID:(NSString *_Nullable)bundleID interruptionHandler:(void(^)(void) _Nullable)interruptionHandler completion:(void(^)(BERenderingProcess *_Nullable process, NSError *_Nullable error))completion;
@end

NS_ASSUME_NONNULL_END

#if __has_include(<BrowserEngineKit/BELayerHierarchy_Private.h>)
#import <BrowserEngineKit/BELayerHierarchy_Private.h>
#else
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<key>EXAppExtensionAttributes</key>
<dict>
<key>EXExtensionPointIdentifier</key>
<string>com.apple.web-browser-engine.gpu</string>
<string>com.apple.web-browser-engine.rendering</string>
</dict>
<key>CFBundleIdentifier</key>
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@
* THE POSSIBILITY OF SUCH DAMAGE.
*/

import ServiceExtensions
@_spi(Private) import ServiceExtensions
import BrowserEngineKit

@main
class GPUProcessExtension : WKProcessExtension {
Expand All @@ -34,14 +33,14 @@ class GPUProcessExtension : WKProcessExtension {
}
}

extension GPUProcessExtension: GPUServiceExtension {
extension GPUProcessExtension: RenderingExtension {
func handle(xpcConnection: xpc_connection_t) {
handleNewConnection(xpcConnection)
}

override func lockdownSandbox(_ version: String) {
if let lockdownVersion = _LockdownVersion(rawValue: version) {
self._lockdown(version: lockdownVersion)
if (version == "1.0") {
self.applyRestrictedSandbox(revision: RestrictedSandboxRevision.revision1)
}
}

Expand Down
Loading

0 comments on commit 11c5ecc

Please sign in to comment.