Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: bbb9a28e95477f7f83bb0b2b822d5aebfecf6b44
https://github.com/WebKit/WebKit/commit/bbb9a28e95477f7f83bb0b2b822d5aebfecf6b44
Author: Timothy Hatcher <[email protected]>
Date: 2022-11-22 (Tue, 22 Nov 2022)
Changed paths:
M Source/WebKit/Shared/API/APIObject.h
M Source/WebKit/Shared/Cocoa/APIObject.mm
M Source/WebKit/Shared/Cocoa/WKNSArray.mm
M Source/WebKit/Shared/Cocoa/WKNSDictionary.mm
M Source/WebKit/UIProcess/Extensions/WebExtension.h
M Source/WebKit/UIProcess/Extensions/WebExtensionContext.h
M Source/WebKit/UIProcess/Extensions/WebExtensionController.h
M Source/WebKit/UIProcess/Extensions/WebExtensionMatchPattern.h
M Source/WebKit/UIProcess/PageClient.h
Log Message:
-----------
API::Object allocations leak in ObjC ARC due to internal strong wrapper
reference.
https://bugs.webkit.org/show_bug.cgi?id=248205
Reviewed by Darin Adler and David Kilzer.
The m_wrapper in `API::Object` was counting as a strong reference in objects
using ObjC ARC.
This was affecting all the new `_WKWebExtension*` API classes.
Changed `m_wrapper` in `API::Object` to be a `CFTypeRef` instead. This hides
the references from
ARC and continues to let `API::Object` manage the ref counting with
`CFRetain`/`CFRelease`.
Tested with automated WKWebExtension API tests and manual testing with Xcode's
memory graph.
* Source/WebKit/Shared/API/APIObject.h:
(API::Object::constructInWrapper): Bridge cast to `CFTypeRef` when setting
m_wrapper. Use `id <WKObject>`.
(API::Object::wrapper const): Changed to return `id <WKObject>` instead of
NSObject *. This
better balances with `constructInWrapper()` taking `id <WKObject>`. wrapper()
is now also limited
to ObjC contexts, like `constructInWrapper()`, which ObjC/ObjC++ files is the
only place it is used.
The `WKObject` protocol conforms to the `NSObject` protocol, so `NSObject
<WKObject> *` is redundant.
* Source/WebKit/Shared/Cocoa/APIObject.mm:
(API::Object::ref const): Use `m_wrapper` instead of `wrapper()` since the type
is now `CFTypeRef`.
(API::Object::deref const): Ditto.
(API::Object::newObject): Bridge cast to `CFTypeRef` when setting m_wrapper.
* Source/WebKit/Shared/Cocoa/WKNSArray.mm:
(-[WKNSArray objectAtIndex:]): Cast `wrapper()` to id to avoid warning about
NSNull not conforming to `WKObject`.
* Source/WebKit/Shared/Cocoa/WKNSDictionary.mm:
(-[WKNSDictionary objectForKey:]): Ditto.
* Source/WebKit/UIProcess/Extensions/WebExtension.h: Wrap `wrapper()` in `#if
__OBJC__` to match `API::Object`.
* Source/WebKit/UIProcess/Extensions/WebExtensionContext.h: Ditto.
* Source/WebKit/UIProcess/Extensions/WebExtensionController.h: Ditto.
* Source/WebKit/UIProcess/Extensions/WebExtensionMatchPattern.h: Ditto.
* Source/WebKit/UIProcess/PageClient.h: Added `OBJC_CLASS NSObject;` to fix
build.
Canonical link: https://commits.webkit.org/256954@main
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes