Title: [249683] trunk/Tools
Revision
249683
Author
[email protected]
Date
2019-09-09 18:31:06 -0700 (Mon, 09 Sep 2019)

Log Message

[Win][MiniBrowser] WebKitLegacyBrowserWindow is leaked by circular references
https://bugs.webkit.org/show_bug.cgi?id=201600

Reviewed by Brent Fulgham.

There were some circular references between
WebKitLegacyBrowserWindow and its delegation classes. For
example, WebKitLegacyBrowserWindow has a reference of
WebDownloadDelegate, and WebDownloadDelegate shares the ref
counter with WebKitLegacyBrowserWindow.

WebNotificationObserver was leaked because it wasn't unregistered
from the default notification center by using
IWebNotificationCenter::removeObserver.

If a new legacy window was created by mouse right click a link,
WebView was released twice because
PrintWebUIDelegate::createWebViewWithRequest didn't AddRef the
WebView.

This change does:
1. Make delegation classes have own ref-counter to avoid circular references
2. Do removeObserver notification observers
3. AddRef WebView in PrintWebUIDelegate::createWebViewWithRequest

* MiniBrowser/win/AccessibilityDelegate.cpp:
(AccessibilityDelegate::AddRef):
(AccessibilityDelegate::Release):
* MiniBrowser/win/AccessibilityDelegate.h: Added m_refCount.
* MiniBrowser/win/MiniBrowserWebHost.cpp:
(MiniBrowserWebHost::QueryInterface):
(MiniBrowserWebHost::AddRef):
(MiniBrowserWebHost::Release):
* MiniBrowser/win/MiniBrowserWebHost.h: Added m_refCount.
* MiniBrowser/win/PrintWebUIDelegate.cpp:
(PrintWebUIDelegate::createWebViewWithRequest): Do AddRef for the returned IWebView.
(PrintWebUIDelegate::AddRef):
(PrintWebUIDelegate::Release):
* MiniBrowser/win/PrintWebUIDelegate.h: Added m_refCount.
* MiniBrowser/win/ResourceLoadDelegate.cpp:
(ResourceLoadDelegate::AddRef):
(ResourceLoadDelegate::Release):
* MiniBrowser/win/ResourceLoadDelegate.h: Added m_refCount.
* MiniBrowser/win/WebDownloadDelegate.cpp:
(WebDownloadDelegate::AddRef):
(WebDownloadDelegate::Release):
* MiniBrowser/win/WebDownloadDelegate.h: Added m_refCount.
* MiniBrowser/win/WebKitLegacyBrowserWindow.cpp:
(WebKitLegacyBrowserWindow::~WebKitLegacyBrowserWindow): Do removeObserver notification observers.
(WebKitLegacyBrowserWindow::init):
(WebKitLegacyBrowserWindow::setUIDelegate):
(WebKitLegacyBrowserWindow::setAccessibilityDelegate):
(WebKitLegacyBrowserWindow::setResourceLoadDelegate):
(WebKitLegacyBrowserWindow::setDownloadDelegate):
(WebKitLegacyBrowserWindow::AddRef): Deleted.
(WebKitLegacyBrowserWindow::Release): Deleted.
(WebKitLegacyBrowserWindow::setFrameLoadDelegate): Deleted.
(WebKitLegacyBrowserWindow::setFrameLoadDelegatePrivate): Deleted.
* MiniBrowser/win/WebKitLegacyBrowserWindow.h:

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (249682 => 249683)


--- trunk/Tools/ChangeLog	2019-09-10 01:28:57 UTC (rev 249682)
+++ trunk/Tools/ChangeLog	2019-09-10 01:31:06 UTC (rev 249683)
@@ -1,3 +1,65 @@
+2019-09-09  Fujii Hironori  <[email protected]>
+
+        [Win][MiniBrowser] WebKitLegacyBrowserWindow is leaked by circular references
+        https://bugs.webkit.org/show_bug.cgi?id=201600
+
+        Reviewed by Brent Fulgham.
+
+        There were some circular references between
+        WebKitLegacyBrowserWindow and its delegation classes. For
+        example, WebKitLegacyBrowserWindow has a reference of
+        WebDownloadDelegate, and WebDownloadDelegate shares the ref
+        counter with WebKitLegacyBrowserWindow.
+
+        WebNotificationObserver was leaked because it wasn't unregistered
+        from the default notification center by using
+        IWebNotificationCenter::removeObserver.
+
+        If a new legacy window was created by mouse right click a link,
+        WebView was released twice because
+        PrintWebUIDelegate::createWebViewWithRequest didn't AddRef the
+        WebView.
+
+        This change does:
+        1. Make delegation classes have own ref-counter to avoid circular references
+        2. Do removeObserver notification observers
+        3. AddRef WebView in PrintWebUIDelegate::createWebViewWithRequest
+
+        * MiniBrowser/win/AccessibilityDelegate.cpp:
+        (AccessibilityDelegate::AddRef):
+        (AccessibilityDelegate::Release):
+        * MiniBrowser/win/AccessibilityDelegate.h: Added m_refCount.
+        * MiniBrowser/win/MiniBrowserWebHost.cpp:
+        (MiniBrowserWebHost::QueryInterface):
+        (MiniBrowserWebHost::AddRef):
+        (MiniBrowserWebHost::Release):
+        * MiniBrowser/win/MiniBrowserWebHost.h: Added m_refCount.
+        * MiniBrowser/win/PrintWebUIDelegate.cpp:
+        (PrintWebUIDelegate::createWebViewWithRequest): Do AddRef for the returned IWebView.
+        (PrintWebUIDelegate::AddRef):
+        (PrintWebUIDelegate::Release):
+        * MiniBrowser/win/PrintWebUIDelegate.h: Added m_refCount.
+        * MiniBrowser/win/ResourceLoadDelegate.cpp:
+        (ResourceLoadDelegate::AddRef):
+        (ResourceLoadDelegate::Release):
+        * MiniBrowser/win/ResourceLoadDelegate.h: Added m_refCount.
+        * MiniBrowser/win/WebDownloadDelegate.cpp:
+        (WebDownloadDelegate::AddRef):
+        (WebDownloadDelegate::Release):
+        * MiniBrowser/win/WebDownloadDelegate.h: Added m_refCount.
+        * MiniBrowser/win/WebKitLegacyBrowserWindow.cpp:
+        (WebKitLegacyBrowserWindow::~WebKitLegacyBrowserWindow): Do removeObserver notification observers.
+        (WebKitLegacyBrowserWindow::init):
+        (WebKitLegacyBrowserWindow::setUIDelegate):
+        (WebKitLegacyBrowserWindow::setAccessibilityDelegate):
+        (WebKitLegacyBrowserWindow::setResourceLoadDelegate):
+        (WebKitLegacyBrowserWindow::setDownloadDelegate):
+        (WebKitLegacyBrowserWindow::AddRef): Deleted.
+        (WebKitLegacyBrowserWindow::Release): Deleted.
+        (WebKitLegacyBrowserWindow::setFrameLoadDelegate): Deleted.
+        (WebKitLegacyBrowserWindow::setFrameLoadDelegatePrivate): Deleted.
+        * MiniBrowser/win/WebKitLegacyBrowserWindow.h:
+
 2019-09-09  Chris Dumez  <[email protected]>
 
         Stop using testRunner.setPrivateBrowsingEnabled_DEPRECATED() in http/tests/adClickAttribution/conversion-disabled-in-ephemeral-session.html

Modified: trunk/Tools/MiniBrowser/win/AccessibilityDelegate.cpp (249682 => 249683)


--- trunk/Tools/MiniBrowser/win/AccessibilityDelegate.cpp	2019-09-10 01:28:57 UTC (rev 249682)
+++ trunk/Tools/MiniBrowser/win/AccessibilityDelegate.cpp	2019-09-10 01:31:06 UTC (rev 249683)
@@ -53,12 +53,15 @@
 
 ULONG AccessibilityDelegate::AddRef()
 {
-    return m_client.AddRef();
+    return ++m_refCount;
 }
 
 ULONG AccessibilityDelegate::Release()
 {
-    return m_client.Release();
+    ULONG newRef = --m_refCount;
+    if (!newRef)
+        delete this;
+    return newRef;
 }
 
 HRESULT AccessibilityDelegate::fireFrameLoadStartedEvents()

Modified: trunk/Tools/MiniBrowser/win/AccessibilityDelegate.h (249682 => 249683)


--- trunk/Tools/MiniBrowser/win/AccessibilityDelegate.h	2019-09-10 01:28:57 UTC (rev 249682)
+++ trunk/Tools/MiniBrowser/win/AccessibilityDelegate.h	2019-09-10 01:31:06 UTC (rev 249683)
@@ -41,6 +41,7 @@
     virtual HRESULT STDMETHODCALLTYPE fireFrameLoadStartedEvents();
     virtual HRESULT STDMETHODCALLTYPE fireFrameLoadFinishedEvents();
 private:
+    ULONG m_refCount { 0 };
     WebKitLegacyBrowserWindow& m_client;
 };
 

Modified: trunk/Tools/MiniBrowser/win/MiniBrowserWebHost.cpp (249682 => 249683)


--- trunk/Tools/MiniBrowser/win/MiniBrowserWebHost.cpp	2019-09-10 01:28:57 UTC (rev 249682)
+++ trunk/Tools/MiniBrowser/win/MiniBrowserWebHost.cpp	2019-09-10 01:31:06 UTC (rev 249683)
@@ -82,6 +82,10 @@
         *ppvObject = static_cast<IWebFrameLoadDelegate*>(this);
     else if (IsEqualGUID(riid, IID_IWebFrameLoadDelegate))
         *ppvObject = static_cast<IWebFrameLoadDelegate*>(this);
+    else if (IsEqualGUID(riid, IID_IWebFrameLoadDelegatePrivate))
+        *ppvObject = static_cast<IWebFrameLoadDelegatePrivate*>(this);
+    else if (IsEqualGUID(riid, IID_IWebNotificationObserver))
+        *ppvObject = static_cast<IWebNotificationObserver*>(this);
     else
         return E_NOINTERFACE;
 
@@ -91,12 +95,15 @@
 
 ULONG MiniBrowserWebHost::AddRef()
 {
-    return m_client->AddRef();
+    return ++m_refCount;
 }
 
 ULONG MiniBrowserWebHost::Release()
 {
-    return m_client->Release();
+    ULONG newRef = --m_refCount;
+    if (!newRef)
+        delete this;
+    return newRef;
 }
 
 HRESULT MiniBrowserWebHost::didFinishLoadForFrame(_In_opt_ IWebView* webView, _In_opt_ IWebFrame* frame)

Modified: trunk/Tools/MiniBrowser/win/MiniBrowserWebHost.h (249682 => 249683)


--- trunk/Tools/MiniBrowser/win/MiniBrowserWebHost.h	2019-09-10 01:28:57 UTC (rev 249682)
+++ trunk/Tools/MiniBrowser/win/MiniBrowserWebHost.h	2019-09-10 01:31:06 UTC (rev 249683)
@@ -68,5 +68,6 @@
     virtual HRESULT STDMETHODCALLTYPE onNotify(_In_opt_ IWebNotification*);
 
 private:
+    ULONG m_refCount { 0 };
     WebKitLegacyBrowserWindow* m_client { nullptr };
 };

Modified: trunk/Tools/MiniBrowser/win/PrintWebUIDelegate.cpp (249682 => 249683)


--- trunk/Tools/MiniBrowser/win/PrintWebUIDelegate.cpp	2019-09-10 01:28:57 UTC (rev 249682)
+++ trunk/Tools/MiniBrowser/win/PrintWebUIDelegate.cpp	2019-09-10 01:31:06 UTC (rev 249683)
@@ -72,7 +72,7 @@
     ShowWindow(newWindow.hwnd(), SW_SHOW);
 
     auto& newBrowserWindow = *static_cast<WebKitLegacyBrowserWindow*>(newWindow.browserWindow());
-    *newWebView = newBrowserWindow.webView();
+    *newWebView = newBrowserWindow.webView().Detach();
     IWebFramePtr frame;
     HRESULT hr;
     hr = (*newWebView)->mainFrame(&frame.GetInterfacePtr());
@@ -151,12 +151,15 @@
 
 ULONG PrintWebUIDelegate::AddRef()
 {
-    return m_client.AddRef();
+    return ++m_refCount;
 }
 
 ULONG PrintWebUIDelegate::Release()
 {
-    return m_client.Release();
+    ULONG newRef = --m_refCount;
+    if (!newRef)
+        delete this;
+    return newRef;
 }
 
 HRESULT PrintWebUIDelegate::webViewPrintingMarginRect(_In_opt_ IWebView* view, _Out_ RECT* rect)

Modified: trunk/Tools/MiniBrowser/win/PrintWebUIDelegate.h (249682 => 249683)


--- trunk/Tools/MiniBrowser/win/PrintWebUIDelegate.h	2019-09-10 01:28:57 UTC (rev 249682)
+++ trunk/Tools/MiniBrowser/win/PrintWebUIDelegate.h	2019-09-10 01:31:06 UTC (rev 249683)
@@ -106,6 +106,7 @@
     virtual HRESULT STDMETHODCALLTYPE paintCustomScrollCorner(_In_opt_ IWebView*, _In_ HDC, RECT) { return E_NOTIMPL; }
 
 private:
+    ULONG m_refCount { 0 };
     WebKitLegacyBrowserWindow& m_client;
     HWND m_modalDialogParent { nullptr };
 };

Modified: trunk/Tools/MiniBrowser/win/ResourceLoadDelegate.cpp (249682 => 249683)


--- trunk/Tools/MiniBrowser/win/ResourceLoadDelegate.cpp	2019-09-10 01:28:57 UTC (rev 249682)
+++ trunk/Tools/MiniBrowser/win/ResourceLoadDelegate.cpp	2019-09-10 01:31:06 UTC (rev 249683)
@@ -55,12 +55,15 @@
 
 ULONG ResourceLoadDelegate::AddRef()
 {
-    return m_client->AddRef();
+    return ++m_refCount;
 }
 
 ULONG ResourceLoadDelegate::Release()
 {
-    return m_client->Release();
+    ULONG newRef = --m_refCount;
+    if (!newRef)
+        delete this;
+    return newRef;
 }
 
 HRESULT ResourceLoadDelegate::identifierForInitialRequest(_In_opt_ IWebView*, _In_opt_ IWebURLRequest*, _In_opt_ IWebDataSource*, unsigned long identifier)

Modified: trunk/Tools/MiniBrowser/win/ResourceLoadDelegate.h (249682 => 249683)


--- trunk/Tools/MiniBrowser/win/ResourceLoadDelegate.h	2019-09-10 01:28:57 UTC (rev 249682)
+++ trunk/Tools/MiniBrowser/win/ResourceLoadDelegate.h	2019-09-10 01:31:06 UTC (rev 249683)
@@ -52,6 +52,7 @@
     virtual HRESULT STDMETHODCALLTYPE plugInFailedWithError(_In_opt_ IWebView*, _In_opt_ IWebError*, _In_opt_ IWebDataSource*);
 
 private:
+    ULONG m_refCount { 0 };
     WebKitLegacyBrowserWindow* m_client;
 };
 

Modified: trunk/Tools/MiniBrowser/win/WebDownloadDelegate.cpp (249682 => 249683)


--- trunk/Tools/MiniBrowser/win/WebDownloadDelegate.cpp	2019-09-10 01:28:57 UTC (rev 249682)
+++ trunk/Tools/MiniBrowser/win/WebDownloadDelegate.cpp	2019-09-10 01:31:06 UTC (rev 249683)
@@ -59,12 +59,15 @@
 
 ULONG WebDownloadDelegate::AddRef()
 {
-    return m_client.AddRef();
+    return ++m_refCount;
 }
 
 ULONG WebDownloadDelegate::Release()
 {
-    return m_client.Release();
+    ULONG newRef = --m_refCount;
+    if (!newRef)
+        delete this;
+    return newRef;
 }
 
 HRESULT WebDownloadDelegate::decideDestinationWithSuggestedFilename(_In_opt_ IWebDownload* download, _In_ BSTR filename)

Modified: trunk/Tools/MiniBrowser/win/WebDownloadDelegate.h (249682 => 249683)


--- trunk/Tools/MiniBrowser/win/WebDownloadDelegate.h	2019-09-10 01:28:57 UTC (rev 249682)
+++ trunk/Tools/MiniBrowser/win/WebDownloadDelegate.h	2019-09-10 01:31:06 UTC (rev 249683)
@@ -54,6 +54,7 @@
     virtual HRESULT STDMETHODCALLTYPE didFinish(_In_opt_ IWebDownload*);
 
 private:
+    ULONG m_refCount { 0 };
     WebKitLegacyBrowserWindow& m_client;
 };
 

Modified: trunk/Tools/MiniBrowser/win/WebKitLegacyBrowserWindow.cpp (249682 => 249683)


--- trunk/Tools/MiniBrowser/win/WebKitLegacyBrowserWindow.cpp	2019-09-10 01:28:57 UTC (rev 249682)
+++ trunk/Tools/MiniBrowser/win/WebKitLegacyBrowserWindow.cpp	2019-09-10 01:31:06 UTC (rev 249683)
@@ -69,19 +69,12 @@
 {
 }
 
-ULONG WebKitLegacyBrowserWindow::AddRef()
+WebKitLegacyBrowserWindow::~WebKitLegacyBrowserWindow()
 {
-    ref();
-    return refCount();
+    m_defaultNotificationCenter->removeObserver(m_notificationObserver, _bstr_t(WebViewProgressEstimateChangedNotification), m_webView);
+    m_defaultNotificationCenter->removeObserver(m_notificationObserver, _bstr_t(WebViewProgressFinishedNotification), m_webView);
 }
 
-ULONG WebKitLegacyBrowserWindow::Release()
-{
-    auto count = refCount();
-    deref();
-    return --count;
-}
-
 HRESULT WebKitLegacyBrowserWindow::init()
 {
     HRESULT hr = WebKitCreateInstance(CLSID_WebView, 0, IID_IWebView, reinterpret_cast<void**>(&m_webView.GetInterfacePtr()));
@@ -109,8 +102,7 @@
     if (FAILED(hr))
         return hr;
 
-    IWebNotificationCenterPtr defaultNotificationCenter;
-    hr = notificationCenter->defaultCenter(&defaultNotificationCenter.GetInterfacePtr());
+    hr = notificationCenter->defaultCenter(&m_defaultNotificationCenter.GetInterfacePtr());
     if (FAILED(hr))
         return hr;
 
@@ -125,19 +117,20 @@
 
     auto webHost = new MiniBrowserWebHost(this);
 
-    hr = setFrameLoadDelegate(webHost);
+    hr = m_webView->setFrameLoadDelegate(webHost);
     if (FAILED(hr))
         return hr;
 
-    hr = setFrameLoadDelegatePrivate(webHost);
+    hr = m_webViewPrivate->setFrameLoadDelegatePrivate(webHost);
     if (FAILED(hr))
         return hr;
 
-    hr = defaultNotificationCenter->addObserver(webHost, _bstr_t(WebViewProgressEstimateChangedNotification), nullptr);
+    m_notificationObserver = webHost;
+    hr = m_defaultNotificationCenter->addObserver(m_notificationObserver, _bstr_t(WebViewProgressEstimateChangedNotification), m_webView);
     if (FAILED(hr))
         return hr;
 
-    hr = defaultNotificationCenter->addObserver(webHost, _bstr_t(WebViewProgressFinishedNotification), nullptr);
+    hr = m_defaultNotificationCenter->addObserver(m_notificationObserver, _bstr_t(WebViewProgressFinishedNotification), m_webView);
     if (FAILED(hr))
         return hr;
 
@@ -153,9 +146,7 @@
     if (FAILED(hr))
         return hr;
 
-    IWebDownloadDelegatePtr downloadDelegate;
-    downloadDelegate.Attach(new WebDownloadDelegate(*this));
-    hr = setDownloadDelegate(downloadDelegate);
+    hr = setDownloadDelegate(new WebDownloadDelegate(*this));
     if (FAILED(hr))
         return hr;
 
@@ -247,38 +238,23 @@
 #endif
 }
 
-HRESULT WebKitLegacyBrowserWindow::setFrameLoadDelegate(IWebFrameLoadDelegate* frameLoadDelegate)
-{
-    m_frameLoadDelegate = frameLoadDelegate;
-    return m_webView->setFrameLoadDelegate(frameLoadDelegate);
-}
-
-HRESULT WebKitLegacyBrowserWindow::setFrameLoadDelegatePrivate(IWebFrameLoadDelegatePrivate* frameLoadDelegatePrivate)
-{
-    return m_webViewPrivate->setFrameLoadDelegatePrivate(frameLoadDelegatePrivate);
-}
-
 HRESULT WebKitLegacyBrowserWindow::setUIDelegate(IWebUIDelegate* uiDelegate)
 {
-    m_uiDelegate = uiDelegate;
     return m_webView->setUIDelegate(uiDelegate);
 }
 
 HRESULT WebKitLegacyBrowserWindow::setAccessibilityDelegate(IAccessibilityDelegate* accessibilityDelegate)
 {
-    m_accessibilityDelegate = accessibilityDelegate;
     return m_webView->setAccessibilityDelegate(accessibilityDelegate);
 }
 
 HRESULT WebKitLegacyBrowserWindow::setResourceLoadDelegate(IWebResourceLoadDelegate* resourceLoadDelegate)
 {
-    m_resourceLoadDelegate = resourceLoadDelegate;
     return m_webView->setResourceLoadDelegate(resourceLoadDelegate);
 }
 
 HRESULT WebKitLegacyBrowserWindow::setDownloadDelegate(IWebDownloadDelegatePtr downloadDelegate)
 {
-    m_downloadDelegate = downloadDelegate;
     return m_webView->setDownloadDelegate(downloadDelegate);
 }
 

Modified: trunk/Tools/MiniBrowser/win/WebKitLegacyBrowserWindow.h (249682 => 249683)


--- trunk/Tools/MiniBrowser/win/WebKitLegacyBrowserWindow.h	2019-09-10 01:28:57 UTC (rev 249682)
+++ trunk/Tools/MiniBrowser/win/WebKitLegacyBrowserWindow.h	2019-09-10 01:31:06 UTC (rev 249683)
@@ -64,9 +64,6 @@
     friend class WebDownloadDelegate;
     friend class ResourceLoadDelegate;
 
-    ULONG AddRef();
-    ULONG Release();
-
     HRESULT init();
     HRESULT prepareViews(HWND mainWnd, const RECT& clientRect);
 
@@ -81,8 +78,6 @@
     bool seedInitialDefaultPreferences();
     bool setToDefaultPreferences();
 
-    HRESULT setFrameLoadDelegate(IWebFrameLoadDelegate*);
-    HRESULT setFrameLoadDelegatePrivate(IWebFrameLoadDelegatePrivate*);
     HRESULT setUIDelegate(IWebUIDelegate*);
     HRESULT setAccessibilityDelegate(IAccessibilityDelegate*);
     HRESULT setResourceLoadDelegate(IWebResourceLoadDelegate*);
@@ -116,6 +111,7 @@
     void setPreference(UINT menuID, bool enable);
 
     WebKitLegacyBrowserWindow(BrowserWindowClient&, HWND mainWnd, bool useLayeredWebView);
+    ~WebKitLegacyBrowserWindow();
     void subclassForLayeredWindow();
     bool setCacheFolder();
 
@@ -129,13 +125,9 @@
     IWebInspectorPtr m_inspector;
     IWebPreferencesPtr m_standardPreferences;
     IWebPreferencesPrivatePtr m_prefsPrivate;
+    IWebNotificationCenterPtr m_defaultNotificationCenter;
+    IWebNotificationObserverPtr m_notificationObserver;
 
-    IWebFrameLoadDelegatePtr m_frameLoadDelegate;
-    IWebUIDelegatePtr m_uiDelegate;
-    IAccessibilityDelegatePtr m_accessibilityDelegate;
-    IWebResourceLoadDelegatePtr m_resourceLoadDelegate;
-    IWebDownloadDelegatePtr m_downloadDelegate;
-
     IWebCoreStatisticsPtr m_statistics;
     IWebCachePtr m_webCache;
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to