NS_IMETHODIMP nsMsgWindow::GetMessageWindowDocShell(nsIDocShell ** aDocShell) { *aDocShell = nsnull; nsCOMPtr<nsIDocShell> docShell(do_QueryReferent(mMessageWindowDocShellWeak)); if (!docShell) { // if we don't have a docshell, then we need to look up the message pane docshell nsCOMPtr<nsIDocShell> rootShell(do_QueryReferent(mRootDocShellWeak)); if (rootShell) { nsCOMPtr<nsIDocShellTreeNode> rootAsNode(do_QueryInterface(rootShell)); nsCOMPtr<nsIDocShellTreeItem> msgDocShellItem; if(rootAsNode) rootAsNode->FindChildWithName(NS_LITERAL_STRING("messagepane").get(), true, false, nsnull, nsnull, getter_AddRefs(msgDocShellItem)); NS_ENSURE_TRUE(msgDocShellItem, NS_ERROR_FAILURE); docShell = do_QueryInterface(msgDocShellItem); // we don't own mMessageWindowDocShell so don't try to keep a reference to it! mMessageWindowDocShellWeak = do_GetWeakReference(docShell); } } docShell.swap(*aDocShell); return NS_OK; }
NS_IMETHODIMP nsMsgPrintEngine::SetWindow(nsIDOMWindow *aWin) { if (!aWin) { // It isn't an error to pass in null for aWin, in fact it means we are shutting // down and we should start cleaning things up... return NS_OK; } mWindow = aWin; nsCOMPtr<nsPIDOMWindow> win( do_QueryInterface(aWin) ); NS_ENSURE_TRUE(win, NS_ERROR_FAILURE); win->GetDocShell()->SetAppType(nsIDocShell::APP_TYPE_MAIL); nsCOMPtr<nsIDocShellTreeItem> docShellAsItem = do_QueryInterface(win->GetDocShell()); NS_ENSURE_TRUE(docShellAsItem, NS_ERROR_FAILURE); nsCOMPtr<nsIDocShellTreeItem> rootAsItem; docShellAsItem->GetSameTypeRootTreeItem(getter_AddRefs(rootAsItem)); nsCOMPtr<nsIDocShellTreeNode> rootAsNode(do_QueryInterface(rootAsItem)); NS_ENSURE_TRUE(rootAsNode, NS_ERROR_FAILURE); nsCOMPtr<nsIDocShellTreeItem> childItem; rootAsNode->FindChildWithName(NS_LITERAL_STRING("content").get(), true, false, nsnull, nsnull, getter_AddRefs(childItem)); mDocShell = do_QueryInterface(childItem); if(mDocShell) SetupObserver(); return NS_OK; }