--NOT PART OF DEFAULT BUILD--

XMLterm changes only.
Changed non-owning references in mozXMLTerminal to weak references to avoid
crash in mozXMLTerminal::Finalize when exiting xmlterm.
This commit is contained in:
svn%xmlterm.org 2000-11-08 22:20:18 +00:00
parent 629d3a5031
commit 877c0ee999
5 changed files with 225 additions and 73 deletions

View File

@ -131,6 +131,16 @@ public:
*/
NS_IMETHOD GetPresShell(nsIPresShell** aPresShell) = 0;
/** Gets DOM document associated with XMLterm
* @param aDOMDocumentl (output) DOM document
*/
NS_IMETHOD GetDOMDocument(nsIDOMDocument** aDOMDocument) = 0;
/** Gets selection controller associated with XMLterm
* @param aSelectionControllerl (output) DOM document
*/
NS_IMETHOD GetSelectionController(nsISelectionController** aSelectionController) = 0;
/** Gets flag denoting whether terminal is in full screen mode
* @param aFlag (output) screen mode flag
*/

View File

@ -108,8 +108,6 @@ const char* const mozXMLTermSession::treeActionNames[] = {
mozXMLTermSession::mozXMLTermSession() :
mInitialized(PR_FALSE),
mXMLTerminal(nsnull),
mPresShell(nsnull),
mDOMDocument(nsnull),
mBodyNode(nsnull),
mSessionNode(nsnull),
@ -177,6 +175,8 @@ NS_IMETHODIMP mozXMLTermSession::Init(mozIXMLTerminal* aXMLTerminal,
nsIDOMDocument* aDOMDocument,
PRInt32 nRows, PRInt32 nCols)
{
nsresult result = NS_OK;
XMLT_LOG(mozXMLTermSession::Init,30,("\n"));
if (mInitialized)
@ -186,8 +186,6 @@ NS_IMETHODIMP mozXMLTermSession::Init(mozIXMLTerminal* aXMLTerminal,
return NS_ERROR_NULL_POINTER;
mXMLTerminal = aXMLTerminal; // containing XMLTerminal; no addref
mPresShell = aPresShell; // presentation shell; no addref
mDOMDocument = aDOMDocument; // DOM document; no addref
mInitialized = PR_TRUE;
@ -196,10 +194,13 @@ NS_IMETHODIMP mozXMLTermSession::Init(mozIXMLTerminal* aXMLTerminal,
mTopScrollRow = mScreenRows - 1;
mBotScrollRow = 0;
nsresult result = NS_OK;
nsCOMPtr<nsIDOMDocument> domDoc;
result = mXMLTerminal->GetDOMDocument(getter_AddRefs(domDoc));
if (NS_FAILED(result) || !domDoc)
return NS_ERROR_FAILURE;
nsCOMPtr<nsIDOMHTMLDocument> vDOMHTMLDocument
(do_QueryInterface(mDOMDocument));
(do_QueryInterface(domDoc));
if (!vDOMHTMLDocument)
return NS_ERROR_FAILURE;
@ -283,8 +284,6 @@ NS_IMETHODIMP mozXMLTermSession::Finalize(void)
mCurrentDebugNode = nsnull;
mXMLTerminal = nsnull;
mPresShell = nsnull;
mDOMDocument = nsnull;
XMLT_LOG(mozXMLTermSession::Finalize,32,("END\n"));
@ -874,6 +873,11 @@ NS_IMETHODIMP mozXMLTermSession::ReadAll(mozILineTermAux* lineTermAux,
nsAutoString metaCommandOutput;
metaCommandOutput.SetLength(0);
nsCOMPtr<nsIDOMDocument> domDoc;
result = mXMLTerminal->GetDOMDocument(getter_AddRefs(domDoc));
if (NS_FAILED(result) || !domDoc)
break;
switch (mMetaCommandType) {
case DEFAULT_META_COMMAND:
@ -885,7 +889,7 @@ NS_IMETHODIMP mozXMLTermSession::ReadAll(mozILineTermAux* lineTermAux,
JSCommand.AppendWithConversion("\");");
// Execute JavaScript command
result = mozXMLTermUtils::ExecuteScript(mDOMDocument,
result = mozXMLTermUtils::ExecuteScript(domDoc,
JSCommand,
metaCommandOutput);
if (NS_FAILED(result))
@ -919,7 +923,7 @@ NS_IMETHODIMP mozXMLTermSession::ReadAll(mozILineTermAux* lineTermAux,
case JS_META_COMMAND:
{
// Execute JavaScript command
result = mozXMLTermUtils::ExecuteScript(mDOMDocument,
result = mozXMLTermUtils::ExecuteScript(domDoc,
commandArgs,
metaCommandOutput);
if (NS_FAILED(result))
@ -1091,9 +1095,13 @@ NS_IMETHODIMP mozXMLTermSession::ReadAll(mozILineTermAux* lineTermAux,
if (mEntryHasOutput)
PositionOutputCursor(lineTermAux);
nsCOMPtr<nsISelectionController> selCon = do_QueryInterface(mPresShell);
nsCOMPtr<nsISelectionController> selCon;
result = mXMLTerminal->GetSelectionController(getter_AddRefs(selCon));
if (NS_FAILED(result) || !selCon)
return NS_ERROR_FAILURE;
selCon->ScrollSelectionIntoView(nsISelectionController::SELECTION_NORMAL,
nsISelectionController::SELECTION_FOCUS_REGION);
nsISelectionController::SELECTION_FOCUS_REGION);
}
// Show caret
@ -1136,9 +1144,10 @@ NS_IMETHODIMP mozXMLTermSession::Abort(mozILineTermAux* lineTermAux,
// Collapse selection and position cursor
nsCOMPtr<nsISelectionController> selCon;
selCon = do_QueryInterface(mPresShell);
if (!selCon)
result = mXMLTerminal->GetSelectionController(getter_AddRefs(selCon));
if (NS_FAILED(result) || !selCon)
return NS_ERROR_FAILURE;
nsCOMPtr<nsISelection> selection;
result = selCon->GetSelection(nsISelectionController::SELECTION_NORMAL,
getter_AddRefs(selection));
@ -1179,9 +1188,10 @@ NS_IMETHODIMP mozXMLTermSession::DisplayInput(const nsString& aString,
// Collapse selection and position cursor
nsCOMPtr<nsISelectionController> selCon;
selCon = do_QueryInterface(mPresShell);
if (!selCon)
return NS_ERROR_FAILURE;
result = mXMLTerminal->GetSelectionController(getter_AddRefs(selCon));
if (NS_FAILED(result) || !selCon)
return NS_ERROR_FAILURE;
nsCOMPtr<nsISelection> selection;
result = selCon->GetSelection(nsISelectionController::SELECTION_NORMAL,
@ -1430,6 +1440,11 @@ NS_IMETHODIMP mozXMLTermSession::BreakOutput(PRBool positionCursorBelow)
if (!mEntryHasOutput)
return NS_OK;
nsCOMPtr<nsIDOMDocument> domDoc;
result = mXMLTerminal->GetDOMDocument(getter_AddRefs(domDoc));
if (NS_FAILED(result) || !domDoc)
return NS_ERROR_FAILURE;
switch (mOutputMarkupType) {
case INSECURE_FRAGMENT:
@ -1480,7 +1495,7 @@ NS_IMETHODIMP mozXMLTermSession::BreakOutput(PRBool positionCursorBelow)
// Execute JS fragment
nsAutoString jsOutput;
jsOutput.SetLength(0);
result = mozXMLTermUtils::ExecuteScript(mDOMDocument,
result = mozXMLTermUtils::ExecuteScript(domDoc,
mFragmentBuffer,
jsOutput);
if (NS_FAILED(result))
@ -2197,10 +2212,16 @@ NS_IMETHODIMP mozXMLTermSession::AppendLineLS(const nsString& aString,
result = InsertFragment(markupString, mOutputDisplayNode,
mCurrentEntryNumber, mOutputTextNode.get());
nsCOMPtr<nsIDOMDocument> domDoc;
result = mXMLTerminal->GetDOMDocument(getter_AddRefs(domDoc));
if (NS_FAILED(result) || !domDoc)
return NS_ERROR_FAILURE;
// Insert text node containing newline only
nsCOMPtr<nsIDOMText> newText;
nsAutoString newlineStr; newlineStr.AssignWithConversion("\n");
result = mDOMDocument->CreateTextNode(newlineStr, getter_AddRefs(newText));
result = domDoc->CreateTextNode(newlineStr, getter_AddRefs(newText));
if (NS_FAILED(result) || !newText)
return NS_ERROR_FAILURE;
@ -2253,9 +2274,10 @@ NS_IMETHODIMP mozXMLTermSession::AppendLineLS(const nsString& aString,
nsCOMPtr<nsISelection> selection;
nsCOMPtr<nsISelectionController> selCon;
selCon = do_QueryInterface(mPresShell);
if (!selCon)
result = mXMLTerminal->GetSelectionController(getter_AddRefs(selCon));
if (NS_FAILED(result) || !selCon)
return NS_ERROR_FAILURE;
result = selCon->GetSelection(nsISelectionController::SELECTION_NORMAL,
getter_AddRefs(selection));
if (NS_FAILED(result) || !selection)
@ -2852,9 +2874,10 @@ void mozXMLTermSession::PositionOutputCursor(mozILineTermAux* lineTermAux)
nsCOMPtr<nsISelection> selection;
nsCOMPtr<nsISelectionController> selCon;
selCon = do_QueryInterface(mPresShell);
if (!selCon)
return ;; // NS_ERROR_FAILURE;
result = mXMLTerminal->GetSelectionController(getter_AddRefs(selCon));
if (NS_FAILED(result) || !selCon)
return; // NS_ERROR_FAILURE
result = selCon->GetSelection(nsISelectionController::SELECTION_NORMAL,
getter_AddRefs(selection));
if (NS_SUCCEEDED(result) && selection) {
@ -2897,7 +2920,12 @@ NS_IMETHODIMP mozXMLTermSession::ScrollToBottomLeft(void)
if (NS_FAILED(result) || !domWindow)
return NS_ERROR_FAILURE;
mPresShell->FlushPendingNotifications();
nsCOMPtr<nsIPresShell> presShell;
result = mXMLTerminal->GetPresShell(getter_AddRefs(presShell));
if (NS_FAILED(result) || !presShell)
return NS_ERROR_FAILURE;
presShell->FlushPendingNotifications();
// Scroll to bottom left of screen
domWindow->ScrollBy(-99999,99999);
@ -3155,10 +3183,15 @@ NS_IMETHODIMP mozXMLTermSession::NewEntry(const nsString& aPrompt)
if (NS_FAILED(result))
return NS_ERROR_FAILURE;
nsCOMPtr<nsIDOMDocument> domDoc;
result = mXMLTerminal->GetDOMDocument(getter_AddRefs(domDoc));
if (NS_FAILED(result) || !domDoc)
return NS_ERROR_FAILURE;
// Create IMG element
tagName.AssignWithConversion("img");
nsCOMPtr<nsIDOMElement> imgElement;
result = mDOMDocument->CreateElement(tagName, getter_AddRefs(imgElement));
result = domDoc->CreateElement(tagName, getter_AddRefs(imgElement));
if (NS_FAILED(result) || !imgElement)
return NS_ERROR_FAILURE;
@ -3187,7 +3220,7 @@ NS_IMETHODIMP mozXMLTermSession::NewEntry(const nsString& aPrompt)
// Append text node containing single space
nsCOMPtr<nsIDOMText> stubText;
nsAutoString spaceStr; spaceStr.AssignWithConversion(" ");
result = mDOMDocument->CreateTextNode(spaceStr, getter_AddRefs(stubText));
result = domDoc->CreateTextNode(spaceStr, getter_AddRefs(stubText));
if (NS_FAILED(result) || !stubText)
return NS_ERROR_FAILURE;
@ -3296,9 +3329,11 @@ NS_IMETHODIMP mozXMLTermSession::NewScreen(void)
result = PositionScreenCursor(0, 0);
if (NS_SUCCEEDED(result)) {
nsCOMPtr<nsISelectionController> selCon = do_QueryInterface(mPresShell);
if (!selCon)
nsCOMPtr<nsISelectionController> selCon;
result = mXMLTerminal->GetSelectionController(getter_AddRefs(selCon));
if (NS_FAILED(result) || !selCon)
return NS_ERROR_FAILURE;
result = selCon->ScrollSelectionIntoView(nsISelectionController::SELECTION_NORMAL,
nsISelectionController::SELECTION_FOCUS_REGION);
}
@ -3428,9 +3463,10 @@ NS_IMETHODIMP mozXMLTermSession::PositionScreenCursor(PRInt32 aRow,
nsCOMPtr<nsISelection> selection;
nsCOMPtr<nsISelectionController> selCon;
selCon = do_QueryInterface(mPresShell);
if (!selCon)
result = mXMLTerminal->GetSelectionController(getter_AddRefs(selCon));
if (NS_FAILED(result) || !selCon)
return NS_ERROR_FAILURE;
result = selCon->GetSelection(nsISelectionController::SELECTION_NORMAL,
getter_AddRefs(selection));
@ -3728,9 +3764,14 @@ NS_IMETHODIMP mozXMLTermSession::NewAnchor(const nsString& classAttribute,
XMLT_LOG(mozXMLTermSession::NewAnchor,80,("\n"));
nsCOMPtr<nsIDOMDocument> domDoc;
result = mXMLTerminal->GetDOMDocument(getter_AddRefs(domDoc));
if (NS_FAILED(result) || !domDoc)
return NS_ERROR_FAILURE;
// Create anchor
nsCOMPtr<nsIDOMElement> newElement;
result = mDOMDocument->CreateElement(tagName, getter_AddRefs(newElement));
result = domDoc->CreateElement(tagName, getter_AddRefs(newElement));
if (NS_FAILED(result) || !newElement)
return NS_ERROR_FAILURE;
@ -3785,9 +3826,14 @@ NS_IMETHODIMP mozXMLTermSession::NewElement(const nsString& tagName,
XMLT_LOG(mozXMLTermSession::NewElement,80,("\n"));
nsCOMPtr<nsIDOMDocument> domDoc;
result = mXMLTerminal->GetDOMDocument(getter_AddRefs(domDoc));
if (NS_FAILED(result) || !domDoc)
return NS_ERROR_FAILURE;
// Create element
nsCOMPtr<nsIDOMElement> newElement;
result = mDOMDocument->CreateElement(tagName, getter_AddRefs(newElement));
result = domDoc->CreateElement(tagName, getter_AddRefs(newElement));
if (NS_FAILED(result) || !newElement)
return NS_ERROR_FAILURE;
@ -3841,10 +3887,15 @@ NS_IMETHODIMP mozXMLTermSession::NewTextNode( nsIDOMNode* parentNode,
XMLT_LOG(mozXMLTermSession::NewTextNode,80,("\n"));
nsCOMPtr<nsIDOMDocument> domDoc;
result = mXMLTerminal->GetDOMDocument(getter_AddRefs(domDoc));
if (NS_FAILED(result) || !domDoc)
return NS_ERROR_FAILURE;
// Create text node
nsCOMPtr<nsIDOMText> newText;
nsAutoString nullStr; nullStr.SetLength(0);
result = mDOMDocument->CreateTextNode(nullStr, getter_AddRefs(newText));
result = domDoc->CreateTextNode(nullStr, getter_AddRefs(newText));
if (NS_FAILED(result) || !newText)
return NS_ERROR_FAILURE;
@ -3881,6 +3932,11 @@ NS_IMETHODIMP mozXMLTermSession::NewIFrame(nsIDOMNode* parentNode,
XMLT_LOG(mozXMLTermSession::NewIFrame,80,("\n"));
nsCOMPtr<nsIDOMDocument> domDoc;
result = mXMLTerminal->GetDOMDocument(getter_AddRefs(domDoc));
if (NS_FAILED(result) || !domDoc)
return NS_ERROR_FAILURE;
#if 0
nsAutoString iframeFrag("<iframe name='iframe");
iframeFrag.Append(number,10);
@ -3898,7 +3954,7 @@ NS_IMETHODIMP mozXMLTermSession::NewIFrame(nsIDOMNode* parentNode,
// Create IFRAME element
nsCOMPtr<nsIDOMElement> newElement;
nsAutoString tagName; tagName.AssignWithConversion("iframe");
result = mDOMDocument->CreateElement(tagName, getter_AddRefs(newElement));
result = domDoc->CreateElement(tagName, getter_AddRefs(newElement));
if (NS_FAILED(result) || !newElement)
return NS_ERROR_FAILURE;

View File

@ -236,7 +236,8 @@ NS_IMETHODIMP mozXMLTerminal::Init(nsIDocShell* aDocShell,
// Initialization flag
mInitialized = PR_TRUE;
mDocShell = aDocShell; // containing docshell; no addref
// Containing docshell
mDocShell = getter_AddRefs(NS_GetWeakReference(aDocShell)); // weak ref
mXMLTermShell = aXMLTermShell; // containing xmlterm shell; no addref
@ -244,7 +245,7 @@ NS_IMETHODIMP mozXMLTerminal::Init(nsIDocShell* aDocShell,
printf("mozXMLTerminal::Init, check1\n");
nsCOMPtr<nsIContentViewer> contViewer;
result = mDocShell->GetContentViewer(getter_AddRefs(contViewer));
result = aDocShell->GetContentViewer(getter_AddRefs(contViewer));
printf("mozXMLTerminal::Init, check2, result=%x, contViewer=%x\n",
result, (unsigned int) contViewer.get());
@ -258,7 +259,7 @@ NS_IMETHODIMP mozXMLTerminal::Init(nsIDocShell* aDocShell,
XMLT_LOG(mozXMLTerminal::Init,22,("setting DocLoaderObs\n"));
// About to create owning reference to this
result = mDocShell->SetDocLoaderObserver((nsIDocumentLoaderObserver*)this);
result = aDocShell->SetDocLoaderObserver((nsIDocumentLoaderObserver*)this);
if (NS_FAILED(result))
return NS_ERROR_FAILURE;
@ -273,7 +274,7 @@ NS_IMETHODIMP mozXMLTerminal::Init(nsIDocShell* aDocShell,
if (NS_FAILED(result))
return NS_ERROR_FAILURE;
result = mDocShell->LoadURI(uri, nsnull, nsIWebNavigation::LOAD_FLAGS_NONE);
result = aDocShell->LoadURI(uri, nsnull, nsIWebNavigation::LOAD_FLAGS_NONE);
if (NS_FAILED(result))
return NS_ERROR_FAILURE;
@ -306,10 +307,12 @@ NS_IMETHODIMP mozXMLTerminal::Finalize(void)
mXMLTermSession = nsnull;
}
if (mDOMDocument) {
nsCOMPtr<nsIDOMDocument> domDoc = do_QueryReferent(mDOMDocument);
if (domDoc) {
// Release any event listeners for the document
nsCOMPtr<nsIDOMEventReceiver> eventReceiver;
nsresult result = mDOMDocument->QueryInterface(NS_GET_IID(nsIDOMEventReceiver), getter_AddRefs(eventReceiver));
nsresult result = domDoc->QueryInterface(NS_GET_IID(nsIDOMEventReceiver), getter_AddRefs(eventReceiver));
if (NS_SUCCEEDED(result) && eventReceiver) {
if (mKeyListener) {
@ -336,20 +339,22 @@ NS_IMETHODIMP mozXMLTerminal::Finalize(void)
mDragListener = nsnull;
}
}
mDOMDocument = nsnull;
}
mDOMDocument = nsnull;
if (mLineTermAux) {
// Finalize and release reference to LineTerm object owned by us
mLineTermAux->CloseAux();
mLineTermAux = nsnull;
}
if (mDocShell) {
nsCOMPtr<nsIDocShell> docShell = do_QueryReferent(mDocShell);
if (docShell) {
// Stop observing document loading
mDocShell->SetDocLoaderObserver((nsIDocumentLoaderObserver *)nsnull);
mDocShell = nsnull;
docShell->SetDocLoaderObserver((nsIDocumentLoaderObserver *)nsnull);
}
mDocShell = nsnull;
mPresShell = nsnull;
mXMLTermShell = nsnull;
@ -386,8 +391,12 @@ NS_IMETHODIMP mozXMLTerminal::Activate(void)
return result;
}
nsCOMPtr<nsIDocShell> docShell = do_QueryReferent(mDocShell);
if (!docShell)
return NS_ERROR_FAILURE;
nsCOMPtr<nsIDOMWindowInternal> outerDOMWindow;
result = mozXMLTermUtils::ConvertDocShellToDOMWindow(mDocShell,
result = mozXMLTermUtils::ConvertDocShellToDOMWindow(docShell,
getter_AddRefs(outerDOMWindow));
if (NS_FAILED(result) || !outerDOMWindow) {
@ -426,14 +435,18 @@ NS_IMETHODIMP mozXMLTerminal::Activate(void)
if ((mDOMDocument != nsnull) || (mPresShell != nsnull))
return NS_ERROR_FAILURE;
nsCOMPtr<nsIDocShell> docShell = do_QueryReferent(mDocShell);
if (!docShell)
return NS_ERROR_FAILURE;
// Get reference to presentation shell
nsCOMPtr<nsIPresContext> presContext;
result = mDocShell->GetPresContext(getter_AddRefs(presContext));
result = docShell->GetPresContext(getter_AddRefs(presContext));
if (NS_FAILED(result) || !presContext)
return NS_ERROR_FAILURE;
nsCOMPtr<nsIPresShell> presShell;
result = mDocShell->GetPresShell(getter_AddRefs(presShell));
result = docShell->GetPresShell(getter_AddRefs(presShell));
if (NS_FAILED(result) || !presShell)
return NS_ERROR_FAILURE;
@ -444,14 +457,13 @@ NS_IMETHODIMP mozXMLTerminal::Activate(void)
if (NS_FAILED(result) || !document)
return NS_ERROR_FAILURE;
nsCOMPtr<nsIDOMDocument> domDocument = do_QueryInterface(document);
if (!domDocument)
nsCOMPtr<nsIDOMDocument> domDoc = do_QueryInterface(document);
if (!domDoc)
return NS_ERROR_FAILURE;
// Save references to presentation shell and DOMDocument
// (SVN: Should these be addref'ed and released in the destructor?)
mPresShell = presShell; // no addref
mDOMDocument = domDocument; // no addref
// Save weak references to presentation shell and DOMDocument
mPresShell = getter_AddRefs(NS_GetWeakReference(presShell)); // weak ref
mDOMDocument = getter_AddRefs(NS_GetWeakReference(domDoc)); // weak ref
// Show caret
ShowCaret();
@ -477,7 +489,7 @@ NS_IMETHODIMP mozXMLTerminal::Activate(void)
return NS_ERROR_OUT_OF_MEMORY;
}
result = mXMLTermSession->Init(this, mPresShell, mDOMDocument, nRows, nCols);
result = mXMLTermSession->Init(this, presShell, domDoc, nRows, nCols);
if (NS_FAILED(result)) {
XMLT_WARNING("mozXMLTerminal::Activate: Warning - Failed to initialize XMLTermSession\n");
return NS_ERROR_FAILURE;
@ -507,7 +519,7 @@ NS_IMETHODIMP mozXMLTerminal::Activate(void)
mPromptExpr.GetUnicode(),
options, LTERM_DETERMINE_PROCESS,
nRows, nCols, xPixels, yPixels,
mDOMDocument, anObserver, cookie);
domDoc, anObserver, cookie);
if (NS_FAILED(result)) {
XMLT_WARNING("mozXMLTerminal::Activate: Warning - Failed to open LineTermAux\n");
@ -520,7 +532,7 @@ NS_IMETHODIMP mozXMLTerminal::Activate(void)
// Get the DOM event receiver for document
nsCOMPtr<nsIDOMEventReceiver> eventReceiver;
result = mDOMDocument->QueryInterface(NS_GET_IID(nsIDOMEventReceiver),
result = domDoc->QueryInterface(NS_GET_IID(nsIDOMEventReceiver),
getter_AddRefs(eventReceiver));
if (NS_FAILED(result)) {
XMLT_WARNING("mozXMLTerminal::Activate: Warning - Failed to get DOM receiver\n");
@ -605,9 +617,13 @@ NS_IMETHODIMP mozXMLTerminal::ScreenSize(PRInt32& rows, PRInt32& cols,
XMLT_LOG(mozXMLTerminal::ScreenSize,70,("\n"));
nsCOMPtr<nsIPresShell> presShell = do_QueryReferent(mPresShell);
if (!presShell)
return NS_ERROR_FAILURE;
// Get presentation context
nsCOMPtr<nsIPresContext> presContext;
result = mPresShell->GetPresContext( getter_AddRefs(presContext) );
result = presShell->GetPresContext( getter_AddRefs(presContext) );
if (NS_FAILED(result))
return result;
@ -724,7 +740,11 @@ NS_IMETHODIMP mozXMLTerminal::ShowCaret(void)
if (!mPresShell)
return NS_ERROR_FAILURE;
nsCOMPtr<nsISelectionController> selCon = do_QueryInterface(mPresShell);
nsCOMPtr<nsIPresShell> presShell = do_QueryReferent(mPresShell);
if (!presShell)
return NS_ERROR_FAILURE;
nsCOMPtr<nsISelectionController> selCon = do_QueryInterface(presShell);
if (!selCon) {
return NS_ERROR_FAILURE;
@ -746,7 +766,7 @@ NS_IMETHODIMP mozXMLTerminal::ShowCaret(void)
selCon->SetCaretReadOnly(PR_FALSE);
nsCOMPtr<nsICaret> caret;
if (NS_SUCCEEDED(mPresShell->GetCaret(getter_AddRefs(caret)))) {
if (NS_SUCCEEDED(presShell->GetCaret(getter_AddRefs(caret)))) {
caret->SetCaretVisible(PR_TRUE);
caret->SetCaretReadOnly(PR_FALSE);
@ -869,7 +889,12 @@ NS_IMETHODIMP mozXMLTerminal::GetDocument(nsIDOMDocument** aDoc)
NS_PRECONDITION(mDOMDocument, "bad state, null mDOMDocument");
if (!mDOMDocument)
return NS_ERROR_NOT_INITIALIZED;
return mDOMDocument->QueryInterface(NS_GET_IID(nsIDOMDocument),
nsCOMPtr<nsIDOMDocument> domDoc = do_QueryReferent(mDOMDocument);
if (!domDoc)
return NS_ERROR_FAILURE;
return domDoc->QueryInterface(NS_GET_IID(nsIDOMDocument),
(void **)aDoc);
}
@ -885,7 +910,14 @@ NS_IMETHODIMP mozXMLTerminal::GetDocShell(nsIDocShell** aDocShell)
NS_PRECONDITION(mDocShell, "bad state, null mDocShell");
if (!mDocShell)
return NS_ERROR_NOT_INITIALIZED;
return mDocShell->QueryInterface(NS_GET_IID(nsIDocShell),
nsCOMPtr<nsIDocShell> docShell = do_QueryReferent(mDocShell);
if (!docShell) {
XMLT_ERROR("mozXMLTerminal::GetDocShell: Error - Invalid weak reference\n");
return NS_ERROR_FAILURE;
}
return docShell->QueryInterface(NS_GET_IID(nsIDocShell),
(void **)aDocShell);
}
@ -901,11 +933,64 @@ NS_IMETHODIMP mozXMLTerminal::GetPresShell(nsIPresShell** aPresShell)
NS_PRECONDITION(mPresShell, "bad state, null mPresShell");
if (!mPresShell)
return NS_ERROR_NOT_INITIALIZED;
return mPresShell->QueryInterface(NS_GET_IID(nsIPresShell),
nsCOMPtr<nsIPresShell> presShell = do_QueryReferent(mPresShell);
if (!presShell) {
XMLT_ERROR("mozXMLTerminal::GetPresShell: Error - Invalid weak reference\n");
return NS_ERROR_FAILURE;
}
return presShell->QueryInterface(NS_GET_IID(nsIPresShell),
(void **)aPresShell);
}
// Returns DOMDocument associated with XMLTerm
NS_IMETHODIMP mozXMLTerminal::GetDOMDocument(nsIDOMDocument** aDOMDocument)
{
if (!aDOMDocument)
return NS_ERROR_NULL_POINTER;
*aDOMDocument = nsnull;
NS_PRECONDITION(mDOMDocument, "bad state, null mDOMDocument");
if (!mDOMDocument)
return NS_ERROR_NOT_INITIALIZED;
nsCOMPtr<nsIDOMDocument> domDoc = do_QueryReferent(mDOMDocument);
if (!domDoc) {
XMLT_ERROR("mozXMLTerminal::GetDOMDocument: Error - Invalid weak reference\n");
return NS_ERROR_FAILURE;
}
return domDoc->QueryInterface(NS_GET_IID(nsIDOMDocument),
(void **)aDOMDocument);
}
// Returns SelectionController associated with XMLTerm
NS_IMETHODIMP mozXMLTerminal::GetSelectionController(nsISelectionController** aSelectionController)
{
if (!aSelectionController)
return NS_ERROR_NULL_POINTER;
*aSelectionController = nsnull;
NS_PRECONDITION(mPresShell, "bad state, null mPresShell");
if (!mPresShell)
return NS_ERROR_NOT_INITIALIZED;
nsCOMPtr<nsIPresShell> presShell = do_QueryReferent(mPresShell);
if (!presShell) {
XMLT_ERROR("mozXMLTerminal::GetSelectionControlle: Error - Invalid weak reference\n");
return NS_ERROR_FAILURE;
}
return presShell->QueryInterface(NS_GET_IID(nsISelectionController),
(void **)aSelectionController);
}
/** Gets flag denoting whether terminal is in full screen mode
* @param aFlag (output) screen mode flag
*/

View File

@ -26,6 +26,7 @@
#include "nspr.h"
#include "nsCOMPtr.h"
#include "nsWeakReference.h"
#include "nsWeakPtr.h"
#include "nsString.h"
#include "mozXMLT.h"
@ -79,6 +80,10 @@ class mozXMLTerminal : public mozIXMLTerminal,
NS_IMETHOD GetPresShell(nsIPresShell** aPresShell);
NS_IMETHOD GetDOMDocument(nsIDOMDocument** aDOMDocument);
NS_IMETHOD GetSelectionController(nsISelectionController** aSelectionController);
NS_IMETHOD GetScreenMode(PRBool* aFlag);
NS_IMETHOD MatchesCookie(const PRUnichar* aCookie, PRBool *_retval);
@ -121,14 +126,14 @@ class mozXMLTerminal : public mozIXMLTerminal,
/** non-owning reference to containing XMLTermShell object */
mozIXMLTermShell* mXMLTermShell;
/** non-owning reference to containing doc shell */
nsIDocShell* mDocShell;
/** weak reference to containing doc shell */
nsWeakPtr mDocShell;
/** non-owning (??) reference to presentation shell for XMLterm */
nsIPresShell* mPresShell;
/** weak reference to presentation shell for XMLterm */
nsWeakPtr mPresShell;
/** non-owning (??) reference to DOM document containing XMLterm */
nsIDOMDocument* mDOMDocument;
/** weak reference to DOM document containing XMLterm */
nsWeakPtr mDOMDocument;
/** XMLTermSession object created by us (not reference counted) */
mozXMLTermSession* mXMLTermSession;

View File

@ -45,7 +45,3 @@ Known bugs
causes crash (seems to be related to GTK event callback)
Switching to XP event posting may remove this bug
13. xmlterm termination not clean, segfaults
in mozXMLTerminal, mPresShell and mDOMDocument need to addref'ed?