[webkit-changes] [WebKit/WebKit] 01ba84: Fix various leaks and reference cycles in Web Exte...

Timothy Hatcher noreply at github.com
Tue Nov 22 14:51:12 PST 2022


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 01ba8487b4464ec9fe00767613438148240e234f
      https://github.com/WebKit/WebKit/commit/01ba8487b4464ec9fe00767613438148240e234f
  Author: Timothy Hatcher <timothy at apple.com>
  Date:   2022-11-22 (Tue, 22 Nov 2022)

  Changed paths:
    M Source/WebKit/UIProcess/API/APIPageConfiguration.cpp
    M Source/WebKit/UIProcess/API/APIPageConfiguration.h
    M Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm
    M Source/WebKit/UIProcess/API/Cocoa/WKWebViewConfiguration.mm
    M Source/WebKit/UIProcess/API/Cocoa/WKWebViewConfigurationPrivate.h
    M Source/WebKit/UIProcess/API/Cocoa/_WKWebExtensionController.h
    M Source/WebKit/UIProcess/API/Cocoa/_WKWebExtensionController.mm
    M Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionContextCocoa.mm
    M Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionControllerCocoa.mm
    M Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionURLSchemeHandlerCocoa.mm
    M Source/WebKit/UIProcess/Extensions/WebExtensionController.cpp
    M Source/WebKit/UIProcess/Extensions/WebExtensionController.h
    M Source/WebKit/UIProcess/Extensions/WebExtensionURLSchemeHandler.h
    M Source/WebKit/UIProcess/WebPageProxy.cpp
    M Source/WebKit/UIProcess/WebPageProxy.h
    M Source/WebKit/WebProcess/Extensions/WebExtensionContextProxy.cpp
    M Source/WebKit/WebProcess/Extensions/WebExtensionContextProxy.h
    M Source/WebKit/WebProcess/Extensions/WebExtensionControllerProxy.cpp
    M Source/WebKit/WebProcess/Extensions/WebExtensionControllerProxy.h

  Log Message:
  -----------
  Fix various leaks and reference cycles in Web Extension classes.
https://bugs.webkit.org/show_bug.cgi?id=248207

Reviewed by Darin Adler.

Issues this fixes:
* WKWebViewConfiguration holds a references to _WKWebExtensionController, and that strong references
  was causing a retain cycle when WebExtensionContext made a configuration and loaded a WKWebView.
  To solve this, add a new _weakWebExtensionController property to the configuration and page proxy
  that can be used internally when making extension WKWebViews.
* WebExtensionController was not unloading contexts on destruct, and that was causing some world leaks.
* WebProcess proxy objects were not removing themselves from the MessageReceiverMap, causing an ASSERT.
  This wasn't fatal, since the MessageReceiverMap uses WeakPtr now and the count is just a debug tool.
  Maybe we should remove the MessageReceiverMap counting now that WeakPtr makes it moot?
* Removed empty NSSecureCoding support from _WKWebExtensionController since it did nothing and really
  would need a complex implementation make it work correctly. This was conflicting with the WeakPtr changes.

* Source/WebKit/UIProcess/API/APIPageConfiguration.cpp:
(API::PageConfiguration::copy const): Added weakWebExtensionController.
(API::PageConfiguration::weakWebExtensionController): Added.
(API::PageConfiguration::setWeakWebExtensionController): Added.
* Source/WebKit/UIProcess/API/APIPageConfiguration.h:
* Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _setupPageConfiguration:]): Setup weakWebExtensionController.
* Source/WebKit/UIProcess/API/Cocoa/WKWebViewConfiguration.mm:
(-[WKWebViewConfiguration encodeWithCoder:]): Removed webExtensionController.
(-[WKWebViewConfiguration initWithCoder:]): Ditto.
(-[WKWebViewConfiguration copyWithZone:]): Ditto.
(-[WKWebViewConfiguration _strongWebExtensionController]): Added.
(-[WKWebViewConfiguration _webExtensionController]): Support returning _weakWebExtensionController.
(-[WKWebViewConfiguration _weakWebExtensionController]): Added.
(-[WKWebViewConfiguration _setWeakWebExtensionController:]): Added.
(-[WKWebViewConfiguration _webExtensionControllerIfExists]): Deleted.
* Source/WebKit/UIProcess/API/Cocoa/WKWebViewConfigurationPrivate.h:
* Source/WebKit/UIProcess/API/Cocoa/_WKWebExtensionController.h:
* Source/WebKit/UIProcess/API/Cocoa/_WKWebExtensionController.mm:
(-[_WKWebExtensionController loadExtensionContext:]): Drive-by add of NSParameterAssert to match other methods.
(-[_WKWebExtensionController loadExtensionContext:error:]): Ditto.
(-[_WKWebExtensionController unloadExtensionContext:]): Ditto.
(-[_WKWebExtensionController unloadExtensionContext:error:]): Ditto.
(-[_WKWebExtensionController extensionContextForExtension:]): Ditto.
(+[_WKWebExtensionController supportsSecureCoding]): Deleted.
(-[_WKWebExtensionController initWithCoder:]): Deleted.
(-[_WKWebExtensionController encodeWithCoder:]): Deleted.
* Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionContextCocoa.mm:
(WebKit::WebExtensionContext::webViewConfiguration): Set _weakWebExtensionController property.
* Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionControllerCocoa.mm:
(WebKit::WebExtensionController::unload): Change unload order and protect context.
(WebKit::WebExtensionController::unloadAll): Added.
* Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionURLSchemeHandlerCocoa.mm:
(WebKit::WebExtensionURLSchemeHandler::platformStartTask): Early return if weak WebExtensionController is null.
(WebKit::WebExtensionURLSchemeHandler::platformTaskCompleted): Added. Tasks were not being removed from map.
* Source/WebKit/UIProcess/Extensions/WebExtensionController.cpp:
(WebKit::WebExtensionController::~WebExtensionController): Added. Call unloadAll().
* Source/WebKit/UIProcess/Extensions/WebExtensionController.h:
* Source/WebKit/UIProcess/Extensions/WebExtensionURLSchemeHandler.h:
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::WebPageProxy): Added m_weakWebExtensionController.
(WebKit::WebPageProxy::close): Use m_weakWebExtensionController too.
(WebKit::WebPageProxy::creationParameters): Ditto.
* Source/WebKit/UIProcess/WebPageProxy.h:
* Source/WebKit/WebProcess/Extensions/WebExtensionContextProxy.cpp:
(WebKit::WebExtensionContextProxy::~WebExtensionContextProxy): Added. Call removeMessageReceiver().
* Source/WebKit/WebProcess/Extensions/WebExtensionContextProxy.h:
* Source/WebKit/WebProcess/Extensions/WebExtensionControllerProxy.cpp:
(WebKit::WebExtensionControllerProxy::~WebExtensionControllerProxy): Added. Call removeMessageReceiver().
* Source/WebKit/WebProcess/Extensions/WebExtensionControllerProxy.h:

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




More information about the webkit-changes mailing list