_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のスマートポインタがゴネるみたいですね。
わかったつもりでわかってないんだなぁ…