NS_IMETHODIMP PluginStreamListener::OnStartRequest(nsIRequest* request, nsISupports *ctxt) { SAMPLE_LABEL("PluginStreamListener", "OnStartRequest"); nsCOMPtr<nsIContent> embed = mPluginDoc->GetPluginContent(); nsCOMPtr<nsIObjectLoadingContent> objlc = do_QueryInterface(embed); nsCOMPtr<nsIStreamListener> objListener = do_QueryInterface(objlc); if (!objListener) { NS_NOTREACHED("PluginStreamListener without appropriate content node"); return NS_BINDING_ABORTED; } SetStreamListener(objListener); // Sets up the ObjectLoadingContent tag as if it is waiting for a // channel, so it can proceed with a load normally once it gets OnStartRequest nsresult rv = objlc->InitializeFromChannel(request); if (NS_FAILED(rv)) { NS_NOTREACHED("InitializeFromChannel failed"); return rv; } // Note that because we're now hooked up to a plugin listener, this will // likely spawn a plugin, which may re-enter. return MediaDocumentStreamListener::OnStartRequest(request, ctxt); }
nsresult PluginStreamListener::SetupPlugin() { NS_ENSURE_TRUE(mDocument, NS_ERROR_FAILURE); mPluginDoc->StartLayout(); nsCOMPtr<nsIContent> embed = mPluginDoc->GetPluginContent(); // Now we have a frame for our <embed>, start the load nsCOMPtr<nsIPresShell> shell = mDocument->GetShell(); if (!shell) { // Can't instantiate w/o a shell mPluginDoc->AllowNormalInstantiation(); return NS_BINDING_ABORTED; } // Flush out layout before we go to instantiate, because some // plug-ins depend on NPP_SetWindow() being called early enough and // nsObjectFrame does that at the end of reflow. shell->FlushPendingNotifications(Flush_Layout); nsIFrame* frame = embed->GetPrimaryFrame(); if (!frame) { mPluginDoc->AllowNormalInstantiation(); return NS_OK; } nsIObjectFrame* objFrame = do_QueryFrame(frame); if (!objFrame) { mPluginDoc->AllowNormalInstantiation(); return NS_ERROR_UNEXPECTED; } nsresult rv = objFrame->Instantiate(mPluginDoc->GetType().get(), mDocument->nsIDocument::GetDocumentURI()); if (NS_FAILED(rv)) { return rv; } // Now that we're done, allow normal instantiation in the future // (say if there's a reframe of this entire presentation). mPluginDoc->AllowNormalInstantiation(); return NS_OK; }