nsresult nsDocLoader::Init() { if (!mRequestInfoHash.IsInitialized()) { return NS_ERROR_OUT_OF_MEMORY; } nsresult rv = NS_NewLoadGroup(getter_AddRefs(mLoadGroup), this); if (NS_FAILED(rv)) return rv; PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, ("DocLoader:%p: load group %x.\n", this, mLoadGroup.get())); return NS_OK; }
mozXMLTermStream::mozXMLTermStream() : mUTF8Buffer(""), mUTF8Offset(0), mMaxResizeHeight(0), mDOMWindow( nsnull ), #ifdef NO_WORKAROUND mDOMIFrameElement( nsnull ), mContext( nsnull ), mLoadGroup( nsnull ), mChannel( nsnull ), mStreamListener( nsnull ) #else // !NO_WORKAROUND mDOMHTMLDocument( nsnull ) #endif // !NO_WORKAROUND { } mozXMLTermStream::~mozXMLTermStream() { } // mozIXMLTermStream interface /** Open stream in specified frame, or in current frame if frameName is null * @param aDOMWindow parent window * @param frameName name of child frame in which to display stream, or null * to display in parent window * @param contentURL URL of stream content * @param contentType MIME type of stream content * @param maxResizeHeight maximum resize height (0=> do not resize) * @return NS_OK on success */ NS_IMETHODIMP mozXMLTermStream::Open(nsIDOMWindowInternal* aDOMWindow, const char* frameName, const char* contentURL, const char* contentType, PRInt32 maxResizeHeight) { nsresult result; XMLT_LOG(mozXMLTermStream::Open,20,("contentURL=%s, contentType=%s\n", contentURL, contentType)); mMaxResizeHeight = maxResizeHeight; if (frameName && *frameName) { // Open stream in named subframe of current frame XMLT_LOG(mozXMLTermStream::Open,22,("frameName=%s\n", frameName)); nsAutoString innerFrameName; innerFrameName.AssignASCII(frameName); // Get DOM IFRAME element nsCOMPtr<nsIDOMDocument> domDoc; result = aDOMWindow->GetDocument(getter_AddRefs(domDoc)); if (NS_FAILED(result) || !domDoc) return NS_ERROR_FAILURE; nsCOMPtr<nsIDOMHTMLDocument> domHTMLDoc = do_QueryInterface(domDoc); if (!domHTMLDoc) return NS_ERROR_FAILURE; nsCOMPtr<nsIDOMNodeList> nodeList; result = domHTMLDoc->GetElementsByName(innerFrameName, getter_AddRefs(nodeList)); if (NS_FAILED(result) || !nodeList) return NS_ERROR_FAILURE; PRUint32 count; nodeList->GetLength(&count); PR_ASSERT(count==1); nsCOMPtr<nsIDOMNode> domNode; result = nodeList->Item(0, getter_AddRefs(domNode)); if (NS_FAILED(result) || !domNode) return NS_ERROR_FAILURE; mDOMIFrameElement = do_QueryInterface(domNode); if (!mDOMIFrameElement) return NS_ERROR_FAILURE; // Ensure that it is indeed an IFRAME element nsAutoString tagName; result = mDOMIFrameElement->GetTagName(tagName); if (NS_FAILED(result)) return NS_ERROR_FAILURE; if (!tagName.LowerCaseEqualsLiteral("iframe")) return NS_ERROR_FAILURE; if (mMaxResizeHeight > 0) { // Set initial IFRAME size to be as wide as the window, but very short nsAutoString attWidth(NS_LITERAL_STRING("width")); nsAutoString valWidth(NS_LITERAL_STRING("100%")); mDOMIFrameElement->SetAttribute(attWidth,valWidth); nsAutoString attHeight(NS_LITERAL_STRING("height")); nsAutoString valHeight(NS_LITERAL_STRING("10")); mDOMIFrameElement->SetAttribute(attHeight,valHeight); } // Get inner DOM window by looking up the frames list nsCOMPtr<nsIDOMWindowInternal> innerDOMWindow; result = mozXMLTermUtils::GetInnerDOMWindow(aDOMWindow, innerFrameName, getter_AddRefs(innerDOMWindow)); if (NS_FAILED(result) || !innerDOMWindow) return NS_ERROR_FAILURE; mDOMWindow = innerDOMWindow; } else { // Open stream in current frame mDOMIFrameElement = nsnull; mDOMWindow = aDOMWindow; } // Get docshell for DOM window nsCOMPtr<nsIDocShell> docShell; result = mozXMLTermUtils::ConvertDOMWindowToDocShell(mDOMWindow, getter_AddRefs(docShell)); if (NS_FAILED(result) || !docShell) return NS_ERROR_FAILURE; #ifdef NO_WORKAROUND XMLT_WARNING("mozXMLTermStream::Open, NO_WORKAROUND, url=%s\n", contentURL); nsCOMPtr<nsIInputStream> inputStream = this; // Create a simple URI nsCOMPtr<nsIURI> uri = do_CreateInstance(kSimpleURICID, &result); if (NS_FAILED(result)) return result; result = uri->SetSpec(nsDependentCString(contentURL)); if (NS_FAILED(result)) return result; // Create a new load group result = NS_NewLoadGroup(getter_AddRefs(mLoadGroup), nsnull); if (NS_FAILED(result)) return result; // Create an input stream channel result = NS_NewInputStreamChannel(getter_AddRefs(mChannel), uri, inputStream, nsDependentCString(contentType), EmptyCString()); if (NS_FAILED(result)) return result; // Set channel's load group result = mChannel->SetLoadGroup(mLoadGroup); if (NS_FAILED(result)) return result; // Create document loader for specified command and content type nsCOMPtr<nsICategoryManager> catMan(do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &result)); if (NS_FAILED(result)) return result; nsXPIDLCString contractID; result = catMan->GetCategoryEntry("Gecko-Content-Viewers", contentType, getter_Copies(contractID)); if (NS_FAILED(result)) return result; nsCOMPtr<nsIDocumentLoaderFactory> docLoaderFactory; docLoaderFactory = do_GetService(contractID.get(), &result); if (NS_FAILED(result)) return result; nsCOMPtr<nsIContentViewerContainer> contViewContainer = do_QueryInterface(docShell); nsCOMPtr<nsIContentViewer> contentViewer; result = docLoaderFactory->CreateInstance("view", mChannel, mLoadGroup, contentType, contViewContainer, nsnull, getter_AddRefs(mStreamListener), getter_AddRefs(contentViewer) ); if (NS_FAILED(result)) return result; // Set container for content view result = contentViewer->SetContainer(contViewContainer); if (NS_FAILED(result)) return result; // Embed contentViewer in containing docShell result = contViewContainer->Embed(contentViewer, "view", nsnull); if (NS_FAILED(result)) return result; // Start request result = mStreamListener->OnStartRequest(mChannel, mContext); if (NS_FAILED(result)) return result; #else // !NO_WORKAROUND XMLT_WARNING("mozXMLTermStream::Open, WORKAROUND\n"); nsCOMPtr<nsIDOMDocument> innerDOMDoc; result = mDOMWindow->GetDocument(getter_AddRefs(innerDOMDoc)); XMLT_WARNING("mozXMLTermStream::Open,check1, 0x%x, 0x%x\n", result, (int) innerDOMDoc.get()); if (NS_FAILED(result) || !innerDOMDoc) return NS_ERROR_FAILURE; mDOMHTMLDocument = do_QueryInterface(innerDOMDoc); XMLT_WARNING("mozXMLTermStream::Open,check2, 0x%x\n", result); if (!mDOMHTMLDocument) return NS_ERROR_FAILURE; result = mDOMHTMLDocument->Open(); XMLT_WARNING("mozXMLTermStream::Open,check3, 0x%x\n", result); if (NS_FAILED(result)) return result; #endif // !NO_WORKAROUND XMLT_LOG(mozXMLTermStream::Open,21,("returning\n")); return NS_OK; }