void OnVideoEOS() { // End of stream. See if we can switch to another video decoder. MSE_DEBUG("%p MSR::OnVideoEOS %d (%p) (readers=%u)", this, mActiveVideoDecoder, mDecoders[mActiveVideoDecoder].get(), mDecoders.Length()); if (SwitchVideoReaders(SWITCH_FORCED)) { // Success! Resume decoding with next video decoder. RequestVideoData(false, mTimeThreshold); } else { // End of stream. MSE_DEBUG("%p MSR::OnVideoEOS %d (%p) EOS (readers=%u)", this, mActiveVideoDecoder, mDecoders[mActiveVideoDecoder].get(), mDecoders.Length()); GetCallback()->OnVideoEOS(); } }
void MediaSourceReader::OnAudioEOS() { MSE_DEBUG("MediaSourceReader(%p)::OnAudioEOS reader=%p (decoders=%u)", this, mAudioReader.get(), mAudioTrack->Decoders().Length()); if (SwitchAudioReader(mLastAudioTime)) { // Success! Resume decoding with next audio decoder. RequestAudioData(); } else if (IsEnded()) { // End of stream. MSE_DEBUG("MediaSourceReader(%p)::OnAudioEOS reader=%p EOS (decoders=%u)", this, mAudioReader.get(), mAudioTrack->Decoders().Length()); GetCallback()->OnAudioEOS(); } }
void MediaSourceReader::OnSeekCompleted(nsresult aResult) { mPendingSeeks--; // Keep the most recent failed result (if any) if (NS_FAILED(aResult)) { mSeekResult = aResult; } // Only dispatch the final event onto the state machine // since it's only expecting one response. if (!mPendingSeeks) { GetCallback()->OnSeekCompleted(mSeekResult); mSeekResult = NS_OK; } }
void MediaSourceReader::OnVideoEOS() { // End of stream. See if we can switch to another video decoder. MSE_DEBUG("MediaSourceReader(%p)::OnVideoEOS reader=%p (decoders=%u)", this, mVideoReader.get(), mVideoTrack->Decoders().Length()); if (SwitchVideoReader(mLastVideoTime)) { // Success! Resume decoding with next video decoder. RequestVideoData(false, 0); } else if (IsEnded()) { // End of stream. MSE_DEBUG("MediaSourceReader(%p)::OnVideoEOS reader=%p EOS (decoders=%u)", this, mVideoReader.get(), mVideoTrack->Decoders().Length()); GetCallback()->OnVideoEOS(); } }
nsresult nsBaseChannel::ContinueRedirect() { // Backwards compat for non-internal redirects from a HTTP channel. // XXX Is our http channel implementation going to derive from nsBaseChannel? // If not, this code can be removed. if (!(mRedirectFlags & nsIChannelEventSink::REDIRECT_INTERNAL)) { nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(); if (httpChannel) { nsCOMPtr<nsIHttpEventSink> httpEventSink; GetCallback(httpEventSink); if (httpEventSink) { nsresult rv = httpEventSink->OnRedirect(httpChannel, mRedirectChannel); if (NS_FAILED(rv)) { return rv; } } } } // Make sure to do this _after_ making all the OnChannelRedirect calls mRedirectChannel->SetOriginalURI(OriginalURI()); // If we fail to open the new channel, then we want to leave this channel // unaffected, so we defer tearing down our channel until we have succeeded // with the redirect. if (mOpenRedirectChannel) { nsresult rv = NS_OK; if (mLoadInfo && mLoadInfo->GetEnforceSecurity()) { MOZ_ASSERT(!mListenerContext, "mListenerContext should be null!"); rv = mRedirectChannel->AsyncOpen2(mListener); } else { rv = mRedirectChannel->AsyncOpen(mListener, mListenerContext); } NS_ENSURE_SUCCESS(rv, rv); } mRedirectChannel = nullptr; // close down this channel Cancel(NS_BINDING_REDIRECTED); ChannelDone(); return NS_OK; }
/* Set up the callbacks for the scene graph parser. In our case this is just one read helper with a switch statement. */ trpgPrintGraphParser::trpgPrintGraphParser(trpgr_Archive *inArch,trpgrImageHelper *inImg,trpgPrintBuffer *inBuf):printBuf(inBuf), archive(inArch), imageHelp(inImg), childRefCB(0) { // Register the readers AddCallback(TRPG_GEOMETRY,new ReadHelper(this,printBuf)); AddCallback(TRPG_GROUP,new ReadHelper(this,printBuf)); AddCallback(TRPG_ATTACH,new ReadHelper(this,printBuf)); AddCallback(TRPG_CHILDREF,new ReadHelper(this,printBuf)); AddCallback(TRPG_BILLBOARD,new ReadHelper(this,printBuf)); AddCallback(TRPG_LOD,new ReadHelper(this,printBuf)); AddCallback(TRPG_TRANSFORM,new ReadHelper(this,printBuf)); AddCallback(TRPG_MODELREF,new ReadHelper(this,printBuf)); AddCallback(TRPG_LAYER,new ReadHelper(this,printBuf)); AddCallback(TRPG_LIGHT,new ReadHelper(this,printBuf)); AddCallback(TRPG_LABEL,new ReadHelper(this,printBuf)); AddCallback(TRPGTILEHEADER,new ReadHelper(this,printBuf)); childRefCB = dynamic_cast<ReadHelper *>(GetCallback(TRPG_CHILDREF)); }
// for SlotObserver::SlotDisconnected void BaseSignal::SlotDisconnected( CallbackBase* callback ) { for( std::size_t i=0; i < mSignalConnections.size(); ++i ) { const CallbackBase* connectionCallback = GetCallback( i ); // Pointer comparison i.e. SignalConnection contains pointer to same callback instance if( connectionCallback && connectionCallback == callback ) { DeleteConnection( i ); // Disconnection complete return; } } DALI_ASSERT_ALWAYS( false && "Callback lost in SlotDisconnected()" ); }
void MediaSourceReader::RequestVideoData(bool aSkipToNextKeyframe, int64_t aTimeThreshold) { MSE_DEBUGV("MediaSourceReader(%p)::RequestVideoData(%d, %lld)", this, aSkipToNextKeyframe, aTimeThreshold); if (!mVideoReader) { MSE_DEBUG("MediaSourceReader(%p)::RequestVideoData called with no video reader", this); GetCallback()->OnNotDecoded(MediaData::VIDEO_DATA, RequestSampleCallback::DECODE_ERROR); return; } if (aSkipToNextKeyframe) { mTimeThreshold = aTimeThreshold; mDropAudioBeforeThreshold = true; mDropVideoBeforeThreshold = true; } mVideoIsSeeking = false; SwitchVideoReader(mLastVideoTime); mVideoReader->RequestVideoData(aSkipToNextKeyframe, aTimeThreshold); }
void HttpChannelChild::OnStatus(const nsresult& status, const nsString& statusArg) { LOG(("HttpChannelChild::OnStatus [this=%p status=%x]\n", this, status)); if (mCanceled) return; // cache the progress sink so we don't have to query for it each time. if (!mProgressSink) GetCallback(mProgressSink); AutoEventEnqueuer ensureSerialDispatch(this); // block socket status event after Cancel or OnStopRequest has been called. if (mProgressSink && NS_SUCCEEDED(mStatus) && mIsPending && !(mLoadFlags & LOAD_BACKGROUND)) { mProgressSink->OnStatus(this, nsnull, status, statusArg.get()); } }
NS_IMETHODIMP HttpChannelChild::ConnectParent(PRUint32 id) { mozilla::dom::TabChild* tabChild = nsnull; nsCOMPtr<nsITabChild> iTabChild; GetCallback(iTabChild); if (iTabChild) { tabChild = static_cast<mozilla::dom::TabChild*>(iTabChild.get()); } // The socket transport in the chrome process now holds a logical ref to us // until OnStopRequest, or we do a redirect, or we hit an IPDL error. AddIPDLReference(); if (!gNeckoChild->SendPHttpChannelConstructor(this, tabChild)) return NS_ERROR_FAILURE; if (!SendConnectChannel(id)) return NS_ERROR_FAILURE; return NS_OK; }
void MediaSourceReader::Seek(int64_t aTime, int64_t aStartTime, int64_t aEndTime, int64_t aCurrentTime) { MSE_DEBUG("MediaSourceReader(%p)::Seek(aTime=%lld, aStart=%lld, aEnd=%lld, aCurrent=%lld)", this, aTime, aStartTime, aEndTime, aCurrentTime); if (IsShutdown()) { GetCallback()->OnSeekCompleted(NS_ERROR_FAILURE); return; } // Store pending seek target in case the track buffers don't contain // the desired time and we delay doing the seek. mPendingSeekTime = aTime; mPendingStartTime = aStartTime; mPendingEndTime = aEndTime; mPendingCurrentTime = aCurrentTime; // Only increment the number of expected OnSeekCompleted // notifications if we weren't already waiting for AttemptSeek // to complete (and they would have been accounted for already). { ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); if (!mWaitingForSeekData) { mWaitingForSeekData = true; if (mAudioTrack) { mPendingSeeks++; } if (mVideoTrack) { mPendingSeeks++; } } } AttemptSeek(); }
int BaseSignal::FindCallback( CallbackBase* callback ) { int index( INVALID_CALLBACK_INDEX ); // A signal can have multiple slots connected to it. // We need to search for the slot which has the same call back function (if it's static) // Or the same object / member function (for non-static) for( std::size_t i=0; i < mSignalConnections.size(); ++i ) { const CallbackBase* connectionCallback = GetCallback( i ); // Note that values are set to NULL in DeleteConnection if( connectionCallback && ( *connectionCallback == *callback ) ) { index = i; break; } } return index; }
NS_IMETHODIMP nsBaseChannel::OnTransportStatus(nsITransport *transport, nsresult status, int64_t progress, int64_t progressMax) { // In some cases, we may wish to suppress transport-layer status events. if (!mPump || NS_FAILED(mStatus)) { return NS_OK; } SUSPEND_PUMP_FOR_SCOPE(); // Lazily fetch mProgressSink if (!mProgressSink) { if (mQueriedProgressSink) { return NS_OK; } GetCallback(mProgressSink); mQueriedProgressSink = true; if (!mProgressSink) { return NS_OK; } } if (!HasLoadFlag(LOAD_BACKGROUND)) { nsAutoString statusArg; if (GetStatusArg(status, statusArg)) { mProgressSink->OnStatus(this, mListenerContext, status, statusArg.get()); } } if (progress) { mProgressSink->OnProgress(this, mListenerContext, progress, progressMax); } return NS_OK; }
void MediaSourceReader::OnVideoDecoded(VideoData* aSample) { MSE_DEBUGV("MediaSourceReader(%p)::OnVideoDecoded [mTime=%lld mDuration=%lld mDiscontinuity=%d]", this, aSample->mTime, aSample->mDuration, aSample->mDiscontinuity); if (mDropVideoBeforeThreshold) { if (aSample->mTime < mTimeThreshold) { MSE_DEBUG("MediaSourceReader(%p)::OnVideoDecoded mTime=%lld < mTimeThreshold=%lld", this, aSample->mTime, mTimeThreshold); delete aSample; mVideoReader->RequestVideoData(false, 0); return; } mDropVideoBeforeThreshold = false; } // Any OnVideoDecoded callbacks received while mVideoIsSeeking must be not // update our last used timestamp, as these are emitted by the reader we're // switching away from. if (!mVideoIsSeeking) { mLastVideoTime = aSample->mTime + aSample->mDuration; } GetCallback()->OnVideoDecoded(aSample); }
void CInputProviderMacOsHid::OnDeviceMatched(IOReturn result, void* sender, IOHIDDeviceRef device) { m_devices.push_back(DEVICE_INFO()); auto& deviceInfo = *m_devices.rbegin(); deviceInfo.provider = this; deviceInfo.device = device; deviceInfo.deviceId = GetDeviceID(device); auto InputReportCallbackStub = GetCallback(device); if(InputReportCallbackStub) { uint32_t max_input_report_size = GetIntProperty(device, CFSTR(kIOHIDMaxInputReportSizeKey)); uint8_t* report_buffer = static_cast<uint8_t*>(calloc(max_input_report_size, sizeof(uint8_t))); IOHIDDeviceRegisterInputReportCallback(device, report_buffer, max_input_report_size, InputReportCallbackStub, &deviceInfo); } else { if(OnInput) { SetInitialBindValues(device); } IOHIDDeviceRegisterInputValueCallback(device, &InputValueCallbackStub, &deviceInfo); } }
void OnAudioEOS() { MSE_DEBUG("%p OnAudioEOS %d (%p) EOS (readers=%u)", this, mActiveAudioDecoder, mDecoders[mActiveAudioDecoder].get(), mDecoders.Length()); GetCallback()->OnAudioEOS(); }
void OnDecodeError() { GetCallback()->OnDecodeError(); }
void LoadHandler::OnLoadStart(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame) { if (GetCallback() && frame->IsMain()) GetCallback()->onPageLoadStart(); }
void LoadHandler::OnLoadEnd(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, int httpStatusCode) { if (GetCallback() && frame->IsMain()) GetCallback()->onPageLoadEnd(); }
void MediaSourceReader::OnDecodeError() { MSE_DEBUG("MediaSourceReader(%p)::OnDecodeError", this); GetCallback()->OnDecodeError(); }
NS_IMETHODIMP HttpChannelChild::AsyncOpen(nsIStreamListener *listener, nsISupports *aContext) { LOG(("HttpChannelChild::AsyncOpen [this=%x uri=%s]\n", this, mSpec.get())); if (mCanceled) return mStatus; NS_ENSURE_TRUE(gNeckoChild != nsnull, NS_ERROR_FAILURE); NS_ENSURE_ARG_POINTER(listener); NS_ENSURE_TRUE(!mIsPending, NS_ERROR_IN_PROGRESS); NS_ENSURE_TRUE(!mWasOpened, NS_ERROR_ALREADY_OPENED); // Port checked in parent, but duplicate here so we can return with error // immediately nsresult rv; rv = NS_CheckPortSafety(mURI); if (NS_FAILED(rv)) return rv; const char *cookieHeader = mRequestHead.PeekHeader(nsHttp::Cookie); if (cookieHeader) { mUserSetCookieHeader = cookieHeader; } AddCookiesToRequest(); // // NOTE: From now on we must return NS_OK; all errors must be handled via // OnStart/OnStopRequest // // notify "http-on-modify-request" observers gHttpHandler->OnModifyRequest(this); mIsPending = true; mWasOpened = true; mListener = listener; mListenerContext = aContext; // add ourselves to the load group. if (mLoadGroup) mLoadGroup->AddRequest(this, nsnull); if (mCanceled) { // We may have been canceled already, either by on-modify-request // listeners or by load group observers; in that case, don't create IPDL // connection. See nsHttpChannel::AsyncOpen(). AsyncAbort(mStatus); return NS_OK; } nsCString appCacheClientId; if (mInheritApplicationCache) { // Pick up an application cache from the notification // callbacks if available nsCOMPtr<nsIApplicationCacheContainer> appCacheContainer; GetCallback(appCacheContainer); if (appCacheContainer) { nsCOMPtr<nsIApplicationCache> appCache; rv = appCacheContainer->GetApplicationCache(getter_AddRefs(appCache)); if (NS_SUCCEEDED(rv) && appCache) { appCache->GetClientID(appCacheClientId); } } } // // Send request to the chrome process... // // FIXME: bug 558623: Combine constructor and SendAsyncOpen into one IPC msg mozilla::dom::TabChild* tabChild = nsnull; nsCOMPtr<nsITabChild> iTabChild; GetCallback(iTabChild); if (iTabChild) { tabChild = static_cast<mozilla::dom::TabChild*>(iTabChild.get()); } // The socket transport in the chrome process now holds a logical ref to us // until OnStopRequest, or we do a redirect, or we hit an IPDL error. AddIPDLReference(); gNeckoChild->SendPHttpChannelConstructor(this, tabChild); SendAsyncOpen(IPC::URI(mURI), IPC::URI(mOriginalURI), IPC::URI(mDocumentURI), IPC::URI(mReferrer), mLoadFlags, mClientSetRequestHeaders, mRequestHead.Method(), IPC::InputStream(mUploadStream), mUploadStreamHasHeaders, mPriority, mRedirectionLimit, mAllowPipelining, mForceAllowThirdPartyCookie, mSendResumeAt, mStartPos, mEntityID, mChooseApplicationCache, appCacheClientId, mAllowSpdy, UsePrivateBrowsing()); return NS_OK; }
void HttpChannelChild::OnTransportAndData(const nsresult& status, const PRUint64 progress, const PRUint64& progressMax, const nsCString& data, const PRUint32& offset, const PRUint32& count) { LOG(("HttpChannelChild::OnTransportAndData [this=%x]\n", this)); if (mCanceled) return; // cache the progress sink so we don't have to query for it each time. if (!mProgressSink) GetCallback(mProgressSink); // Hold queue lock throughout all three calls, else we might process a later // necko msg in between them. AutoEventEnqueuer ensureSerialDispatch(mEventQ); // block status/progress after Cancel or OnStopRequest has been called, // or if channel has LOAD_BACKGROUND set. // - JDUELL: may not need mStatus/mIsPending checks, given this is always called // during OnDataAvailable, and we've already checked mCanceled. Code // dupe'd from nsHttpChannel if (mProgressSink && NS_SUCCEEDED(mStatus) && mIsPending && !(mLoadFlags & LOAD_BACKGROUND)) { // OnStatus // NS_ASSERTION(status == nsISocketTransport::STATUS_RECEIVING_FROM || status == nsITransport::STATUS_READING, "unexpected status code"); nsCAutoString host; mURI->GetHost(host); mProgressSink->OnStatus(this, nsnull, status, NS_ConvertUTF8toUTF16(host).get()); // OnProgress // if (progress > 0) { NS_ASSERTION(progress <= progressMax, "unexpected progress values"); mProgressSink->OnProgress(this, nsnull, progress, progressMax); } } // OnDataAvailable // // NOTE: the OnDataAvailable contract requires the client to read all the data // in the inputstream. This code relies on that ('data' will go away after // this function). Apparently the previous, non-e10s behavior was to actually // support only reading part of the data, allowing later calls to read the // rest. nsCOMPtr<nsIInputStream> stringStream; nsresult rv = NS_NewByteInputStream(getter_AddRefs(stringStream), data.get(), count, NS_ASSIGNMENT_DEPEND); if (NS_FAILED(rv)) { Cancel(rv); return; } rv = mListener->OnDataAvailable(this, mListenerContext, stringStream, offset, count); stringStream->Close(); if (NS_FAILED(rv)) { Cancel(rv); } }
NS_IMETHODIMP HttpChannelChild::AsyncOpen(nsIStreamListener *listener, nsISupports *aContext) { LOG(("HttpChannelChild::AsyncOpen [this=%x uri=%s]\n", this, mSpec.get())); if (mCanceled) return mStatus; NS_ENSURE_TRUE(gNeckoChild != nsnull, NS_ERROR_FAILURE); NS_ENSURE_ARG_POINTER(listener); NS_ENSURE_TRUE(!mIsPending, NS_ERROR_IN_PROGRESS); NS_ENSURE_TRUE(!mWasOpened, NS_ERROR_ALREADY_OPENED); // Port checked in parent, but duplicate here so we can return with error // immediately nsresult rv; rv = NS_CheckPortSafety(mURI); if (NS_FAILED(rv)) return rv; // Prepare uploadStream for POST data nsCAutoString uploadStreamData; PRInt32 uploadStreamInfo; if (mUploadStream) { // Read entire POST stream into string: // This is a temporary measure until bug 564553 is implemented: we're doing // a blocking read of a potentially arbitrarily large stream, so this isn't // performant/safe for large file uploads. PRUint32 bytes; mUploadStream->Available(&bytes); if (bytes > 0) { rv = NS_ReadInputStreamToString(mUploadStream, uploadStreamData, bytes); if (NS_FAILED(rv)) return rv; } uploadStreamInfo = mUploadStreamHasHeaders ? eUploadStream_hasHeaders : eUploadStream_hasNoHeaders; } else { uploadStreamInfo = eUploadStream_null; } const char *cookieHeader = mRequestHead.PeekHeader(nsHttp::Cookie); if (cookieHeader) { mUserSetCookieHeader = cookieHeader; } AddCookiesToRequest(); // // NOTE: From now on we must return NS_OK; all errors must be handled via // OnStart/OnStopRequest // // notify "http-on-modify-request" observers gHttpHandler->OnModifyRequest(this); mIsPending = PR_TRUE; mWasOpened = PR_TRUE; mListener = listener; mListenerContext = aContext; // add ourselves to the load group. if (mLoadGroup) mLoadGroup->AddRequest(this, nsnull); if (mCanceled) { // We may have been canceled already, either by on-modify-request // listeners or by load group observers; in that case, don't create IPDL // connection. See nsHttpChannel::AsyncOpen(). // Clear mCanceled here, or we will bail out at top of OnCancel(). mCanceled = false; OnCancel(mStatus); return NS_OK; } // // Send request to the chrome process... // // FIXME: bug 558623: Combine constructor and SendAsyncOpen into one IPC msg mozilla::dom::TabChild* tabChild = nsnull; nsCOMPtr<nsITabChild> iTabChild; GetCallback(iTabChild); if (iTabChild) { tabChild = static_cast<mozilla::dom::TabChild*>(iTabChild.get()); } // The socket transport in the chrome process now holds a logical ref to us // until OnStopRequest, or we do a redirect, or we hit an IPDL error. AddIPDLReference(); gNeckoChild->SendPHttpChannelConstructor(this, tabChild); SendAsyncOpen(IPC::URI(mURI), IPC::URI(mOriginalURI), IPC::URI(mDocumentURI), IPC::URI(mReferrer), mLoadFlags, mRequestHeaders, mRequestHead.Method(), uploadStreamData, uploadStreamInfo, mPriority, mRedirectionLimit, mAllowPipelining, mForceAllowThirdPartyCookie, mSendResumeAt, mStartPos, mEntityID); return NS_OK; }
nsresult nsBaseChannel::Redirect(nsIChannel *newChannel, PRUint32 redirectFlags) { SUSPEND_PUMP_FOR_SCOPE(); // Transfer properties newChannel->SetOriginalURI(OriginalURI()); newChannel->SetLoadGroup(mLoadGroup); newChannel->SetNotificationCallbacks(mCallbacks); newChannel->SetLoadFlags(mLoadFlags | LOAD_REPLACE); nsCOMPtr<nsIWritablePropertyBag> bag = ::do_QueryInterface(newChannel); if (bag) mPropertyHash.EnumerateRead(CopyProperties, bag.get()); // Notify consumer, giving chance to cancel redirect. For backwards compat, // we support nsIHttpEventSink if we are an HTTP channel and if this is not // an internal redirect. // Global observers. These come first so that other observers don't see // redirects that get aborted for security reasons anyway. NS_ASSERTION(gIOService, "Must have an IO service"); nsresult rv = gIOService->OnChannelRedirect(this, newChannel, redirectFlags); if (NS_FAILED(rv)) return rv; // Backwards compat for non-internal redirects from a HTTP channel. if (!(redirectFlags & nsIChannelEventSink::REDIRECT_INTERNAL)) { nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(); if (httpChannel) { nsCOMPtr<nsIHttpEventSink> httpEventSink; GetCallback(httpEventSink); if (httpEventSink) { rv = httpEventSink->OnRedirect(httpChannel, newChannel); if (NS_FAILED(rv)) return rv; } } } nsCOMPtr<nsIChannelEventSink> channelEventSink; // Give our consumer a chance to observe/block this redirect. GetCallback(channelEventSink); if (channelEventSink) { rv = channelEventSink->OnChannelRedirect(this, newChannel, redirectFlags); if (NS_FAILED(rv)) return rv; } // If we fail to open the new channel, then we want to leave this channel // unaffected, so we defer tearing down our channel until we have succeeded // with the redirect. rv = newChannel->AsyncOpen(mListener, mListenerContext); if (NS_FAILED(rv)) return rv; // close down this channel Cancel(NS_BINDING_REDIRECTED); mListener = nsnull; mListenerContext = nsnull; return NS_OK; }
void TNodeTask::ExtractCallback(const v8::FunctionCallbackInfo<v8::Value>& Args) { v8::Isolate* Isolate = v8::Isolate::GetCurrent(); v8::HandleScope HandleScope(Isolate); Callback.Reset(Isolate, GetCallback(Args)); }
void LoadHandler::OnLoadError(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, ErrorCode errorCode, const CefString& errorText, const CefString& failedUrl) { if (errorCode == ERR_ABORTED) return; std::string errorMsg; std::map<int, std::string>::iterator it = g_mErrorMsgMap.find(errorCode); CefStringUTF8 strUrl = ConvertToUtf8(failedUrl); CefStringUTF8 et = ConvertToUtf8(errorText); cef3Trace("ErrId: %d, ErrMsg: [%s], Url: [%s]", errorCode, et.c_str(), strUrl.c_str()); if (it != g_mErrorMsgMap.end()) { std::stringstream stream; stream << g_mErrorMsgMap[errorCode] << " [" << errorCode << "]"; errorMsg = stream.str(); } else { std::stringstream stream; stream << "Error Code " << errorCode; errorMsg = stream.str(); } std::string out; //if no frame its the whole page if (GetCallback()) { const size_t size = 100*1024; char buff[size]; buff[0] = 0; if (GetCallback()->onLoadError(errorMsg.c_str(), strUrl.c_str(), buff, size) && buff[0]) { size_t nSize = strlen(buff); if (nSize > size) nSize = size; out = std::string(buff, nSize); } } if (out.empty()) { // All other messages. std::stringstream ss; ss << "<html><head><title>Load Failed</title></head>" "<body><h1>Load Failed</h1>" "<h2>Load of URL " << strUrl.c_str() << " failed: " << errorMsg << ".</h2></body>" "</html>"; out = ss.str(); } CefRefPtr<CefPostData> postData = CefPostData::Create(); CefRefPtr<CefPostDataElement> el = CefPostDataElement::Create(); el->SetToBytes(out.size(), out.c_str()); postData->AddElement(el); CefRefPtr<CefRequest> req = CefRequest::Create(); req->SetMethod("POST"); req->SetURL("internal://loaderror"); req->SetPostData(postData); frame->LoadRequest(req); }