다시.
나는
nsIChannel::asyncOpen()
에서 같은 물건을 인용하기 위하여려고하고있다 :
asyncOpen
하면 반환 성공적으로 채널이 aListener
에 onStopRequest
전화 또는 onChannelRedirect
라고 할 때까지 자신이 살아 을 유지하는 책임이있다.
다시 nsViewSourceChannel.cpp에 갈 경우, loadGroup->AddRequest
를 호출 한 곳과 loadGroup->RemoveRequest
가 호출되는 두 곳이있다.
nsViewSourceChannel::AsyncOpen(nsIStreamListener *aListener, nsISupports *ctxt)
{
NS_ENSURE_TRUE(mChannel, NS_ERROR_FAILURE);
mListener = aListener;
/*
* We want to add ourselves to the loadgroup before opening
* mChannel, since we want to make sure we're in the loadgroup
* when mChannel finishes and fires OnStopRequest()
*/
nsCOMPtr<nsILoadGroup> loadGroup;
mChannel->GetLoadGroup(getter_AddRefs(loadGroup));
if (loadGroup)
loadGroup->AddRequest(NS_STATIC_CAST(nsIViewSourceChannel*,
this), nsnull);
nsresult rv = mChannel->AsyncOpen(this, ctxt);
if (NS_FAILED(rv) && loadGroup)
loadGroup->RemoveRequest(NS_STATIC_CAST(nsIViewSourceChannel*,
this),
nsnull, rv);
if (NS_SUCCEEDED(rv)) {
mOpened = PR_TRUE;
}
return rv;
}
및
nsViewSourceChannel::OnStopRequest(nsIRequest *aRequest, nsISupports* aContext,
nsresult aStatus)
{
NS_ENSURE_TRUE(mListener, NS_ERROR_FAILURE);
if (mChannel)
{
nsCOMPtr<nsILoadGroup> loadGroup;
mChannel->GetLoadGroup(getter_AddRefs(loadGroup));
if (loadGroup)
{
loadGroup->RemoveRequest(NS_STATIC_CAST(nsIViewSourceChannel*,
this),
nsnull, aStatus);
}
}
return mListener->OnStopRequest(NS_STATIC_CAST(nsIViewSourceChannel*,
this),
aContext, aStatus);
}
편집 : 나는 모질라의 작동 방식에 대한 단서가 없다, 그래서 몇 가지 코드를 읽고 생각해야으로
. 채널의 관점에서 볼 때 원본 파일이로드되면 작업이 완료됩니다. 이미지처럼 파일에 링크 된 보조 항목을로드하려면 해당 항목을 수신기에 구현해야합니다. TestPageLoad.cpp을 참조하십시오. 그것은 원유 파서를 구현하고는 OnDataAvailable
에 하위 항목을 검색합니다
NS_IMETHODIMP
MyListener::OnDataAvailable(nsIRequest *req, nsISupports *ctxt,
nsIInputStream *stream,
PRUint32 offset, PRUint32 count)
{
//printf(">>> OnDataAvailable [count=%u]\n", count);
nsresult rv = NS_ERROR_FAILURE;
PRUint32 bytesRead=0;
char buf[1024];
if(ctxt == nsnull) {
bytesRead=0;
rv = stream->ReadSegments(streamParse, &offset, count, &bytesRead);
} else {
while (count) {
PRUint32 amount = PR_MIN(count, sizeof(buf));
rv = stream->Read(buf, amount, &bytesRead);
count -= bytesRead;
}
}
if (NS_FAILED(rv)) {
printf(">>> stream->Read failed with rv=%x\n", rv);
return rv;
}
return NS_OK;
}
중요한 것은 그것이 새로운 새로운 채널을 생성하는 img
및 script
요소의 src
속성에 보이는, streamParse()
을 호출하고 auxLoad()
를 호출하는 것입니다 청취자이며 전화는 AsyncOpen()
입니다. 또한 러시아 인형 상황처럼 광고 인해서 이상의 하위 항목을로드 할 수 있습니다
uriList->AppendElement(uri);
rv = NS_NewChannel(getter_AddRefs(chan), uri, nsnull, nsnull, callbacks);
RETURN_IF_FAILED(rv, "NS_NewChannel");
gKeepRunning++;
rv = chan->AsyncOpen(listener, myBool);
RETURN_IF_FAILED(rv, "AsyncOpen");
거기에 MyListener
개체의 다른 인스턴스를 전달 이후로.
이것은 매우 혼란 스럽습니다. 필자는 필자의 AddRequest/RemoveRequest 호출을 매우 비슷한 위치에두고 있지만 SetLoadGroup이나 AsyncOpen도 PNG의 채널에서 호출되지 않습니다. ViewSourceChannel은 nsIStreamListener.OnStartRequest 호출에서 설정된 "mChannel"을 사용하지만 내 채널에 nsIStreamListener를 추가하면 해당 메서드가 호출되지 않습니다. –
질문에 second update도 참조하십시오. –
@ Stijn Sanders, 답변을 업데이트했습니다. –