_blankで開いたのを閉じるときに死ぬ問題

解決したみたい。
こんな、感じにしてたのですが、

LRESULT nmnWebBrowserControl::OnNCDestroy(WPARAM wparam, LPARAM lparam)
{
    // Navigationをstip
    nsCOMPtr<nsIWebNavigation> webNavigation = do_QueryInterface(mWebBrowser);
    if (webNavigation) webNavigation->Stop(nsIWebNavigation::STOP_ALL);

    //WebBrowserを破棄する
    if (baseWindow) baseWindow->Destroy();
    mWebBrowser = nsnull;

    // mChromeを破棄
    NS_RELEASE(mChrome);
    mChrome = nsnull;

    return 0L;
}

最後のNS_RELEASE(mChrome);のところでエラーが出る。
target="_blank"で開いたときだけ。


target="_blank"で開くとき、nsIWindowCreatorを継承したクラスを実装し、
それをGeckoに登録して、いざというときに呼んでもらうのですが、
たとえば、こんな感じ。

NS_IMETHODIMP nmnWindowCreator::CreateChromeWindow(nsIWebBrowserChrome *parent,
                                                   PRUint32 chromeFlags,
                                                   nsIWebBrowserChrome **_retval)
{
    if (_retval && gFrameWindow && gFrameWindow->mTabBrowser) {
        // 新しいWebBrowserとChromeと子供ウインドウのセットを作る
        nmnWebBrowserControl* newWBC = gFrameWindow->mTabBrowser->NewWebBrowser(-1);
        // mChromeをもらってくる
        if (newWBC) newWBC->GetChromeNS(_retval);
        if (_retval) NS_ADDREF(*_retval);
    }

    return NS_OK;
}

この、NS_ADDREF(*_retval)をやり忘れてたのが原因みたい。
これは、新しいnsIWebBrowserChromeを作って返すというmethodなのですが、
返すときにちゃんとNS_ADDREFしないと、XPCOMのスマートポインタがゴネるみたいですね。


わかったつもりでわかってないんだなぁ…