Changeset 249683 in webkit
- Timestamp:
- Sep 9, 2019 6:31:06 PM (5 years ago)
- Location:
- trunk/Tools
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Tools/ChangeLog
r249675 r249683 1 2019-09-09 Fujii Hironori <Hironori.Fujii@sony.com> 2 3 [Win][MiniBrowser] WebKitLegacyBrowserWindow is leaked by circular references 4 https://bugs.webkit.org/show_bug.cgi?id=201600 5 6 Reviewed by Brent Fulgham. 7 8 There were some circular references between 9 WebKitLegacyBrowserWindow and its delegation classes. For 10 example, WebKitLegacyBrowserWindow has a reference of 11 WebDownloadDelegate, and WebDownloadDelegate shares the ref 12 counter with WebKitLegacyBrowserWindow. 13 14 WebNotificationObserver was leaked because it wasn't unregistered 15 from the default notification center by using 16 IWebNotificationCenter::removeObserver. 17 18 If a new legacy window was created by mouse right click a link, 19 WebView was released twice because 20 PrintWebUIDelegate::createWebViewWithRequest didn't AddRef the 21 WebView. 22 23 This change does: 24 1. Make delegation classes have own ref-counter to avoid circular references 25 2. Do removeObserver notification observers 26 3. AddRef WebView in PrintWebUIDelegate::createWebViewWithRequest 27 28 * MiniBrowser/win/AccessibilityDelegate.cpp: 29 (AccessibilityDelegate::AddRef): 30 (AccessibilityDelegate::Release): 31 * MiniBrowser/win/AccessibilityDelegate.h: Added m_refCount. 32 * MiniBrowser/win/MiniBrowserWebHost.cpp: 33 (MiniBrowserWebHost::QueryInterface): 34 (MiniBrowserWebHost::AddRef): 35 (MiniBrowserWebHost::Release): 36 * MiniBrowser/win/MiniBrowserWebHost.h: Added m_refCount. 37 * MiniBrowser/win/PrintWebUIDelegate.cpp: 38 (PrintWebUIDelegate::createWebViewWithRequest): Do AddRef for the returned IWebView. 39 (PrintWebUIDelegate::AddRef): 40 (PrintWebUIDelegate::Release): 41 * MiniBrowser/win/PrintWebUIDelegate.h: Added m_refCount. 42 * MiniBrowser/win/ResourceLoadDelegate.cpp: 43 (ResourceLoadDelegate::AddRef): 44 (ResourceLoadDelegate::Release): 45 * MiniBrowser/win/ResourceLoadDelegate.h: Added m_refCount. 46 * MiniBrowser/win/WebDownloadDelegate.cpp: 47 (WebDownloadDelegate::AddRef): 48 (WebDownloadDelegate::Release): 49 * MiniBrowser/win/WebDownloadDelegate.h: Added m_refCount. 50 * MiniBrowser/win/WebKitLegacyBrowserWindow.cpp: 51 (WebKitLegacyBrowserWindow::~WebKitLegacyBrowserWindow): Do removeObserver notification observers. 52 (WebKitLegacyBrowserWindow::init): 53 (WebKitLegacyBrowserWindow::setUIDelegate): 54 (WebKitLegacyBrowserWindow::setAccessibilityDelegate): 55 (WebKitLegacyBrowserWindow::setResourceLoadDelegate): 56 (WebKitLegacyBrowserWindow::setDownloadDelegate): 57 (WebKitLegacyBrowserWindow::AddRef): Deleted. 58 (WebKitLegacyBrowserWindow::Release): Deleted. 59 (WebKitLegacyBrowserWindow::setFrameLoadDelegate): Deleted. 60 (WebKitLegacyBrowserWindow::setFrameLoadDelegatePrivate): Deleted. 61 * MiniBrowser/win/WebKitLegacyBrowserWindow.h: 62 1 63 2019-09-09 Chris Dumez <cdumez@apple.com> 2 64 -
trunk/Tools/MiniBrowser/win/AccessibilityDelegate.cpp
r232669 r249683 54 54 ULONG AccessibilityDelegate::AddRef() 55 55 { 56 return m_client.AddRef();56 return ++m_refCount; 57 57 } 58 58 59 59 ULONG AccessibilityDelegate::Release() 60 60 { 61 return m_client.Release(); 61 ULONG newRef = --m_refCount; 62 if (!newRef) 63 delete this; 64 return newRef; 62 65 } 63 66 -
trunk/Tools/MiniBrowser/win/AccessibilityDelegate.h
r232669 r249683 42 42 virtual HRESULT STDMETHODCALLTYPE fireFrameLoadFinishedEvents(); 43 43 private: 44 ULONG m_refCount { 0 }; 44 45 WebKitLegacyBrowserWindow& m_client; 45 46 }; -
trunk/Tools/MiniBrowser/win/MiniBrowserWebHost.cpp
r249039 r249683 83 83 else if (IsEqualGUID(riid, IID_IWebFrameLoadDelegate)) 84 84 *ppvObject = static_cast<IWebFrameLoadDelegate*>(this); 85 else if (IsEqualGUID(riid, IID_IWebFrameLoadDelegatePrivate)) 86 *ppvObject = static_cast<IWebFrameLoadDelegatePrivate*>(this); 87 else if (IsEqualGUID(riid, IID_IWebNotificationObserver)) 88 *ppvObject = static_cast<IWebNotificationObserver*>(this); 85 89 else 86 90 return E_NOINTERFACE; … … 92 96 ULONG MiniBrowserWebHost::AddRef() 93 97 { 94 return m_client->AddRef();98 return ++m_refCount; 95 99 } 96 100 97 101 ULONG MiniBrowserWebHost::Release() 98 102 { 99 return m_client->Release(); 103 ULONG newRef = --m_refCount; 104 if (!newRef) 105 delete this; 106 return newRef; 100 107 } 101 108 -
trunk/Tools/MiniBrowser/win/MiniBrowserWebHost.h
r249039 r249683 69 69 70 70 private: 71 ULONG m_refCount { 0 }; 71 72 WebKitLegacyBrowserWindow* m_client { nullptr }; 72 73 }; -
trunk/Tools/MiniBrowser/win/PrintWebUIDelegate.cpp
r249039 r249683 73 73 74 74 auto& newBrowserWindow = *static_cast<WebKitLegacyBrowserWindow*>(newWindow.browserWindow()); 75 *newWebView = newBrowserWindow.webView() ;75 *newWebView = newBrowserWindow.webView().Detach(); 76 76 IWebFramePtr frame; 77 77 HRESULT hr; … … 152 152 ULONG PrintWebUIDelegate::AddRef() 153 153 { 154 return m_client.AddRef();154 return ++m_refCount; 155 155 } 156 156 157 157 ULONG PrintWebUIDelegate::Release() 158 158 { 159 return m_client.Release(); 159 ULONG newRef = --m_refCount; 160 if (!newRef) 161 delete this; 162 return newRef; 160 163 } 161 164 -
trunk/Tools/MiniBrowser/win/PrintWebUIDelegate.h
r232669 r249683 107 107 108 108 private: 109 ULONG m_refCount { 0 }; 109 110 WebKitLegacyBrowserWindow& m_client; 110 111 HWND m_modalDialogParent { nullptr }; -
trunk/Tools/MiniBrowser/win/ResourceLoadDelegate.cpp
r247896 r249683 56 56 ULONG ResourceLoadDelegate::AddRef() 57 57 { 58 return m_client->AddRef();58 return ++m_refCount; 59 59 } 60 60 61 61 ULONG ResourceLoadDelegate::Release() 62 62 { 63 return m_client->Release(); 63 ULONG newRef = --m_refCount; 64 if (!newRef) 65 delete this; 66 return newRef; 64 67 } 65 68 -
trunk/Tools/MiniBrowser/win/ResourceLoadDelegate.h
r232669 r249683 53 53 54 54 private: 55 ULONG m_refCount { 0 }; 55 56 WebKitLegacyBrowserWindow* m_client; 56 57 }; -
trunk/Tools/MiniBrowser/win/WebDownloadDelegate.cpp
r232669 r249683 60 60 ULONG WebDownloadDelegate::AddRef() 61 61 { 62 return m_client.AddRef();62 return ++m_refCount; 63 63 } 64 64 65 65 ULONG WebDownloadDelegate::Release() 66 66 { 67 return m_client.Release(); 67 ULONG newRef = --m_refCount; 68 if (!newRef) 69 delete this; 70 return newRef; 68 71 } 69 72 -
trunk/Tools/MiniBrowser/win/WebDownloadDelegate.h
r232669 r249683 55 55 56 56 private: 57 ULONG m_refCount { 0 }; 57 58 WebKitLegacyBrowserWindow& m_client; 58 59 }; -
trunk/Tools/MiniBrowser/win/WebKitLegacyBrowserWindow.cpp
r249039 r249683 70 70 } 71 71 72 ULONG WebKitLegacyBrowserWindow::AddRef() 73 { 74 ref(); 75 return refCount(); 76 } 77 78 ULONG WebKitLegacyBrowserWindow::Release() 79 { 80 auto count = refCount(); 81 deref(); 82 return --count; 72 WebKitLegacyBrowserWindow::~WebKitLegacyBrowserWindow() 73 { 74 m_defaultNotificationCenter->removeObserver(m_notificationObserver, _bstr_t(WebViewProgressEstimateChangedNotification), m_webView); 75 m_defaultNotificationCenter->removeObserver(m_notificationObserver, _bstr_t(WebViewProgressFinishedNotification), m_webView); 83 76 } 84 77 … … 110 103 return hr; 111 104 112 IWebNotificationCenterPtr defaultNotificationCenter; 113 hr = notificationCenter->defaultCenter(&defaultNotificationCenter.GetInterfacePtr()); 105 hr = notificationCenter->defaultCenter(&m_defaultNotificationCenter.GetInterfacePtr()); 114 106 if (FAILED(hr)) 115 107 return hr; … … 126 118 auto webHost = new MiniBrowserWebHost(this); 127 119 128 hr = setFrameLoadDelegate(webHost); 129 if (FAILED(hr)) 130 return hr; 131 132 hr = setFrameLoadDelegatePrivate(webHost); 133 if (FAILED(hr)) 134 return hr; 135 136 hr = defaultNotificationCenter->addObserver(webHost, _bstr_t(WebViewProgressEstimateChangedNotification), nullptr); 137 if (FAILED(hr)) 138 return hr; 139 140 hr = defaultNotificationCenter->addObserver(webHost, _bstr_t(WebViewProgressFinishedNotification), nullptr); 120 hr = m_webView->setFrameLoadDelegate(webHost); 121 if (FAILED(hr)) 122 return hr; 123 124 hr = m_webViewPrivate->setFrameLoadDelegatePrivate(webHost); 125 if (FAILED(hr)) 126 return hr; 127 128 m_notificationObserver = webHost; 129 hr = m_defaultNotificationCenter->addObserver(m_notificationObserver, _bstr_t(WebViewProgressEstimateChangedNotification), m_webView); 130 if (FAILED(hr)) 131 return hr; 132 133 hr = m_defaultNotificationCenter->addObserver(m_notificationObserver, _bstr_t(WebViewProgressFinishedNotification), m_webView); 141 134 if (FAILED(hr)) 142 135 return hr; … … 154 147 return hr; 155 148 156 IWebDownloadDelegatePtr downloadDelegate; 157 downloadDelegate.Attach(new WebDownloadDelegate(*this)); 158 hr = setDownloadDelegate(downloadDelegate); 149 hr = setDownloadDelegate(new WebDownloadDelegate(*this)); 159 150 if (FAILED(hr)) 160 151 return hr; … … 248 239 } 249 240 250 HRESULT WebKitLegacyBrowserWindow::setFrameLoadDelegate(IWebFrameLoadDelegate* frameLoadDelegate)251 {252 m_frameLoadDelegate = frameLoadDelegate;253 return m_webView->setFrameLoadDelegate(frameLoadDelegate);254 }255 256 HRESULT WebKitLegacyBrowserWindow::setFrameLoadDelegatePrivate(IWebFrameLoadDelegatePrivate* frameLoadDelegatePrivate)257 {258 return m_webViewPrivate->setFrameLoadDelegatePrivate(frameLoadDelegatePrivate);259 }260 261 241 HRESULT WebKitLegacyBrowserWindow::setUIDelegate(IWebUIDelegate* uiDelegate) 262 242 { 263 m_uiDelegate = uiDelegate;264 243 return m_webView->setUIDelegate(uiDelegate); 265 244 } … … 267 246 HRESULT WebKitLegacyBrowserWindow::setAccessibilityDelegate(IAccessibilityDelegate* accessibilityDelegate) 268 247 { 269 m_accessibilityDelegate = accessibilityDelegate;270 248 return m_webView->setAccessibilityDelegate(accessibilityDelegate); 271 249 } … … 273 251 HRESULT WebKitLegacyBrowserWindow::setResourceLoadDelegate(IWebResourceLoadDelegate* resourceLoadDelegate) 274 252 { 275 m_resourceLoadDelegate = resourceLoadDelegate;276 253 return m_webView->setResourceLoadDelegate(resourceLoadDelegate); 277 254 } … … 279 256 HRESULT WebKitLegacyBrowserWindow::setDownloadDelegate(IWebDownloadDelegatePtr downloadDelegate) 280 257 { 281 m_downloadDelegate = downloadDelegate;282 258 return m_webView->setDownloadDelegate(downloadDelegate); 283 259 } -
trunk/Tools/MiniBrowser/win/WebKitLegacyBrowserWindow.h
r249039 r249683 65 65 friend class ResourceLoadDelegate; 66 66 67 ULONG AddRef();68 ULONG Release();69 70 67 HRESULT init(); 71 68 HRESULT prepareViews(HWND mainWnd, const RECT& clientRect); … … 82 79 bool setToDefaultPreferences(); 83 80 84 HRESULT setFrameLoadDelegate(IWebFrameLoadDelegate*);85 HRESULT setFrameLoadDelegatePrivate(IWebFrameLoadDelegatePrivate*);86 81 HRESULT setUIDelegate(IWebUIDelegate*); 87 82 HRESULT setAccessibilityDelegate(IAccessibilityDelegate*); … … 117 112 118 113 WebKitLegacyBrowserWindow(BrowserWindowClient&, HWND mainWnd, bool useLayeredWebView); 114 ~WebKitLegacyBrowserWindow(); 119 115 void subclassForLayeredWindow(); 120 116 bool setCacheFolder(); … … 130 126 IWebPreferencesPtr m_standardPreferences; 131 127 IWebPreferencesPrivatePtr m_prefsPrivate; 132 133 IWebFrameLoadDelegatePtr m_frameLoadDelegate; 134 IWebUIDelegatePtr m_uiDelegate; 135 IAccessibilityDelegatePtr m_accessibilityDelegate; 136 IWebResourceLoadDelegatePtr m_resourceLoadDelegate; 137 IWebDownloadDelegatePtr m_downloadDelegate; 128 IWebNotificationCenterPtr m_defaultNotificationCenter; 129 IWebNotificationObserverPtr m_notificationObserver; 138 130 139 131 IWebCoreStatisticsPtr m_statistics;
Note: See TracChangeset
for help on using the changeset viewer.