void NetworkJob::sendMultipartResponseIfNeeded() { if (m_multipartResponse && isClientAvailable()) { m_handle->client()->didReceiveResponse(m_handle.get(), *m_multipartResponse); m_multipartResponse = nullptr; } }
bool NetworkJob::startNewJobWithRequest(ResourceRequest& newRequest, bool increasRedirectCount) { if (isClientAvailable()) { RecursionGuard guard(m_callingClient); m_handle->client()->willSendRequest(m_handle.get(), newRequest, m_response); // m_cancelled can become true if the url fails the policy check. // newRequest can be cleared when the redirect is rejected. if (m_cancelled || newRequest.isEmpty()) return false; } // Pass the ownership of the ResourceHandle to the new NetworkJob. RefPtr<ResourceHandle> handle = m_handle; m_handle = 0; m_multipartResponse = nullptr; NetworkManager::instance()->startJob(m_playerId, m_pageGroupName, handle, newRequest, m_streamFactory, *m_frame, m_deferLoadingCount, increasRedirectCount ? m_redirectCount + 1 : m_redirectCount); return true; }
void NetworkJob::handleNotifyDataReceived(const char* buf, size_t len) { // Check for messages out of order or after cancel. if ((!m_isFile && !m_statusReceived) || m_cancelled) return; if (!buf || !len) return; m_dataReceived = true; // Protect against reentrancy. updateDeferLoadingCount(1); if (shouldSendClientData()) { sendResponseIfNeeded(); sendMultipartResponseIfNeeded(); if (isClientAvailable()) { RecursionGuard guard(m_callingClient); m_handle->client()->didReceiveData(m_handle.get(), buf, len, len); } } updateDeferLoadingCount(-1); }
// Implements the getUserMedia method from http://www.whatwg.org/specs/web-apps/current-work/#dom-navigator-getusermedia. void MediaStreamFrameController::generateStream(const String& options, PassRefPtr<NavigatorUserMediaSuccessCallback> successCallback, PassRefPtr<NavigatorUserMediaErrorCallback> errorCallback, ExceptionCode& ec) { ec = 0; if (!successCallback) return; GenerateStreamOptionFlags flags = parseGenerateStreamOptions(options); if (!flags) { ec = NOT_SUPPORTED_ERR; return; } int requestId = m_requests.getNextId(); m_requests.add(requestId, GenerateStreamRequest::create(scriptExecutionContext(), successCallback, errorCallback)); if (!isClientAvailable()) { // This makes sure to call the error callback if provided. m_requests.abort(requestId); return; } pageController()->generateStream(this, requestId, flags, securityOrigin()); }
MediaStreamFrameController::MediaStreamFrameController(Frame* frame) : m_frame(frame) , m_isInDetachedState(false) { if (!isClientAvailable()) enterDetachedState(); }
void MediaStreamFrameController::stopGeneratedStream(const String& streamLabel) { ASSERT(m_streams.contains(streamLabel)); ASSERT(m_streams.get(streamLabel)->isLocalMediaStream()); if (isClientAvailable()) pageController()->stopGeneratedStream(streamLabel); }
void NetworkJob::handleNotifyDataSent(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) { if (m_cancelled) return; // Protect against reentrancy. updateDeferLoadingCount(1); if (isClientAvailable()) { RecursionGuard guard(m_callingClient); m_handle->client()->didSendData(m_handle.get(), bytesSent, totalBytesToBeSent); } updateDeferLoadingCount(-1); }
void NetworkJob::handleNotifyClose(int status) { #ifndef NDEBUG m_isRunning = false; #endif if (!m_cancelled) { if (!m_statusReceived) { // Connection failed before sending notifyStatusReceived: use generic NetworkError. notifyStatusReceived(BlackBerry::Platform::FilterStream::StatusNetworkError, 0); } // If an HTTP authentication-enabled request is successful, save // the credentials for later reuse. If the request fails, delete // the saved credentials. if (!isError(m_extendedStatusCode)) storeCredentials(); else if (isUnauthorized(m_extendedStatusCode)) purgeCredentials(); if (shouldNotifyClientFinished()) { if (isRedirect(m_extendedStatusCode) && (m_redirectCount >= s_redirectMaximum)) m_extendedStatusCode = BlackBerry::Platform::FilterStream::StatusTooManyRedirects; sendResponseIfNeeded(); if (isClientAvailable()) { RecursionGuard guard(m_callingClient); if (isError(m_extendedStatusCode) && !m_dataReceived) { String domain = m_extendedStatusCode < 0 ? ResourceError::platformErrorDomain : ResourceError::httpErrorDomain; ResourceError error(domain, m_extendedStatusCode, m_response.url().string(), m_response.httpStatusText()); m_handle->client()->didFail(m_handle.get(), error); } else m_handle->client()->didFinishLoading(m_handle.get(), 0); } } } // Whoever called notifyClose still have a reference to the job, so // schedule the deletion with a timer. m_deleteJobTimer.startOneShot(0); // Detach from the ResourceHandle in any case. m_handle = 0; m_multipartResponse = nullptr; }
void NetworkJob::sendResponseIfNeeded() { if (m_responseSent) return; m_responseSent = true; if (isError(m_extendedStatusCode) && !m_dataReceived) return; String urlFilename = m_response.url().lastPathComponent(); // Get the MIME type that was set by the content sniffer // if there's no custom sniffer header, try to set it from the Content-Type header // if this fails, guess it from extension. String mimeType; if (m_isFTP && m_isFTPDir) mimeType = "application/x-ftp-directory"; else mimeType = m_response.httpHeaderField(BlackBerry::Platform::NetworkRequest::HEADER_RIM_SNIFFED_MIME_TYPE); if (mimeType.isNull()) mimeType = extractMIMETypeFromMediaType(m_contentType); if (mimeType.isNull()) mimeType = MIMETypeRegistry::getMIMETypeForPath(urlFilename); m_response.setMimeType(mimeType); // Set encoding from Content-Type header. m_response.setTextEncodingName(extractCharsetFromMediaType(m_contentType)); // Set content length from header. String contentLength = m_response.httpHeaderField("Content-Length"); if (!contentLength.isNull()) m_response.setExpectedContentLength(contentLength.toInt64()); // Set suggested filename for downloads from the Content-Disposition header; if this fails, // fill it in from the url and sniffed mime type;Skip this for data and about URLs, // because they have no Content-Disposition header and the format is wrong to be a filename. if (!m_isData && !m_isAbout) { String suggestedFilename = filenameFromHTTPContentDisposition(m_contentDisposition); if (suggestedFilename.isEmpty()) { // Check and see if an extension already exists. String mimeExtension = MIMETypeRegistry::getPreferredExtensionForMIMEType(mimeType); if (urlFilename.isEmpty()) { if (mimeExtension.isEmpty()) // No extension found for the mimeType. suggestedFilename = String("Untitled"); else suggestedFilename = String("Untitled") + "." + mimeExtension; } else { if (urlFilename.reverseFind('.') == notFound && !mimeExtension.isEmpty()) suggestedFilename = urlFilename + '.' + mimeExtension; else suggestedFilename = urlFilename; } } m_response.setSuggestedFilename(suggestedFilename); } // Make sure local files aren't cached, since this just duplicates them. if (m_isFile || m_isData || m_isAbout) m_response.setHTTPHeaderField("Cache-Control", "no-cache"); if (isClientAvailable()) { RecursionGuard guard(m_callingClient); m_handle->client()->didReceiveResponse(m_handle.get(), m_response); } }
void MediaStreamFrameController::setMediaStreamTrackEnabled(const String& trackId, bool enabled) { if (isClientAvailable()) pageController()->setMediaStreamTrackEnabled(trackId, enabled); }