Changeset 52829 in webkit


Ignore:
Timestamp:
Jan 5, 2010 3:07:21 PM (14 years ago)
Author:
Adam Roben
Message:

Make it safe to call IWebView::close when IWebView::initWithFrame hasn't been called

Part of <http://webkit.org/b/32827> Crash when calling
IWebView::close, then releasing the WebView, without calling
DestroyWindow

Reviewed by Steve Falkenburg.

WebKit/win:

  • WebView.cpp:

(WebView::close): Null-check m_page and m_preferences before using
them. They will be null if initWithFrame was never called.

WebKitTools:

Test that it's safe to call IWebView::close when IWebView::initWithFrame
hasn't been called

  • WebKitAPITest/tests/WebViewDestruction.cpp:

(WebKitAPITest::CloseWithoutInitWithFrame): Calls IWebView::close
without ever calling IWebView::initWithFrame and tests that we don't
crash or leak.

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebKit/win/ChangeLog

    r52828 r52829  
     12010-01-05  Adam Roben  <aroben@apple.com>
     2
     3        Make it safe to call IWebView::close when IWebView::initWithFrame
     4        hasn't been called
     5
     6        Part of <http://webkit.org/b/32827> Crash when calling
     7        IWebView::close, then releasing the WebView, without calling
     8        DestroyWindow
     9
     10        Reviewed by Steve Falkenburg.
     11
     12        * WebView.cpp:
     13        (WebView::close): Null-check m_page and m_preferences before using
     14        them. They will be null if initWithFrame was never called.
     15
    1162010-01-05  Adam Roben  <aroben@apple.com>
    217
  • trunk/WebKit/win/WebView.cpp

    r52828 r52829  
    636636    removeFromAllWebViewsSet();
    637637
    638     Frame* frame = m_page->mainFrame();
    639     if (frame)
    640         frame->loader()->detachFromParent();
     638    if (m_page) {
     639        if (Frame* frame = m_page->mainFrame())
     640            frame->loader()->detachFromParent();
     641    }
    641642
    642643    if (m_mouseOutTracker) {
     
    669670    notifyCenter->removeObserver(this, WebPreferences::webPreferencesChangedNotification(), static_cast<IWebPreferences*>(m_preferences.get()));
    670671
    671     BSTR identifier = 0;
    672     m_preferences->identifier(&identifier);
    673 
    674     COMPtr<WebPreferences> preferences = m_preferences;
    675     m_preferences = 0;
    676     preferences->didRemoveFromWebView();
    677     // Make sure we release the reference, since WebPreferences::removeReferenceForIdentifier will check for last reference to WebPreferences
    678     preferences = 0;
    679     if (identifier) {
    680         WebPreferences::removeReferenceForIdentifier(identifier);
    681         SysFreeString(identifier);
     672    if (COMPtr<WebPreferences> preferences = m_preferences) {
     673        BSTR identifier = 0;
     674        preferences->identifier(&identifier);
     675
     676        m_preferences = 0;
     677        preferences->didRemoveFromWebView();
     678        // Make sure we release the reference, since WebPreferences::removeReferenceForIdentifier will check for last reference to WebPreferences
     679        preferences = 0;
     680        if (identifier) {
     681            WebPreferences::removeReferenceForIdentifier(identifier);
     682            SysFreeString(identifier);
     683        }
    682684    }
    683685
  • trunk/WebKitTools/ChangeLog

    r52826 r52829  
     12010-01-05  Adam Roben  <aroben@apple.com>
     2
     3        Test that it's safe to call IWebView::close when
     4        IWebView::initWithFrame hasn't been called
     5
     6        Part of <http://webkit.org/b/32827> Crash when calling
     7        IWebView::close, then releasing the WebView, without calling
     8        DestroyWindow
     9
     10        Reviewed by Steve Falkenburg.
     11
     12        * WebKitAPITest/tests/WebViewDestruction.cpp:
     13        (WebKitAPITest::CloseWithoutInitWithFrame): Calls IWebView::close
     14        without ever calling IWebView::initWithFrame and tests that we don't
     15        crash or leak.
     16
    1172010-01-05  Adam Roben  <aroben@apple.com>
    218
  • trunk/WebKitTools/WebKitAPITest/tests/WebViewDestruction.cpp

    r52826 r52829  
    103103}
    104104
     105TEST(WebViewDestruction, CloseWithoutInitWithFrame)
     106{
     107    COMPtr<IWebView> webView;
     108    TEST_ASSERT(SUCCEEDED(WebKitCreateInstance(__uuidof(WebView), &webView)));
     109
     110    TEST_ASSERT(SUCCEEDED(webView->close()));
     111
     112    finishWebViewDestructionTest(webView, 0);
     113}
     114
    105115// Tests that releasing a WebView without calling IWebView::close or DestroyWindow doesn't leak. <http://webkit.org/b/33162>
    106116TEST(WebViewDestruction, NoCloseOrDestroyViewWindow)
Note: See TracChangeset for help on using the changeset viewer.