void XMLHttpRequest::setReadyState(int state) { Logger::log("XMLHttpRequest::setReadyState(): readyState: " + QString::number(state)); if (state != readyState()) { m_readyState = state; m_onReadyStateChange.call(QScriptValue()); } }
void LocalMediaStream::stopTimerFired(Timer<LocalMediaStream>* timer) { ASSERT_UNUSED(timer, timer == &m_stopTimer); if (readyState() == ENDED) return; MediaStreamCenter::instance().didStopLocalMediaStream(descriptor()); streamEnded(); }
void XMLHttpRequest::onReplyMetaDataChanged() { if (readyState() > OPENED) { return; } setReadyState(HEADERS_RECEIVED); foreach (const QByteArray &header, m_reply->rawHeaderList()) { m_responseHeaders[QString::fromUtf8(header)] = QString::fromUtf8(m_reply->rawHeader(header)); } setReadyState(LOADING); }
std::unique_ptr<PlatformTimeRanges> MediaSource::buffered() const { if (m_buffered && m_activeSourceBuffers->length() && std::all_of(m_activeSourceBuffers->begin(), m_activeSourceBuffers->end(), [] (RefPtr<SourceBuffer>& buffer) { return !buffer->isBufferedDirty(); })) return std::make_unique<PlatformTimeRanges>(*m_buffered); m_buffered = std::make_unique<PlatformTimeRanges>(); for (auto& sourceBuffer : *m_activeSourceBuffers) sourceBuffer->setBufferedDirty(false); // Implements MediaSource algorithm for HTMLMediaElement.buffered. // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-source.html#htmlmediaelement-extensions Vector<PlatformTimeRanges> activeRanges = this->activeRanges(); // 1. If activeSourceBuffers.length equals 0 then return an empty TimeRanges object and abort these steps. if (activeRanges.isEmpty()) return std::make_unique<PlatformTimeRanges>(*m_buffered); // 2. Let active ranges be the ranges returned by buffered for each SourceBuffer object in activeSourceBuffers. // 3. Let highest end time be the largest range end time in the active ranges. MediaTime highestEndTime = MediaTime::zeroTime(); for (auto& ranges : activeRanges) { unsigned length = ranges.length(); if (length) highestEndTime = std::max(highestEndTime, ranges.end(length - 1)); } // Return an empty range if all ranges are empty. if (!highestEndTime) return std::make_unique<PlatformTimeRanges>(*m_buffered); // 4. Let intersection ranges equal a TimeRange object containing a single range from 0 to highest end time. m_buffered->add(MediaTime::zeroTime(), highestEndTime); // 5. For each SourceBuffer object in activeSourceBuffers run the following steps: bool ended = readyState() == endedKeyword(); for (auto& sourceRanges : activeRanges) { // 5.1 Let source ranges equal the ranges returned by the buffered attribute on the current SourceBuffer. // 5.2 If readyState is "ended", then set the end time on the last range in source ranges to highest end time. if (ended && sourceRanges.length()) sourceRanges.add(sourceRanges.start(sourceRanges.length() - 1), highestEndTime); // 5.3 Let new intersection ranges equal the the intersection between the intersection ranges and the source ranges. // 5.4 Replace the ranges in intersection ranges with the new intersection ranges. m_buffered->intersectWith(sourceRanges); } return std::make_unique<PlatformTimeRanges>(*m_buffered); }
void MediaSource::setReadyState(const AtomicString& state) { ASSERT(state == openKeyword() || state == closedKeyword() || state == endedKeyword()); AtomicString oldState = readyState(); LOG(Media, "MediaSource::setReadyState() %p : %s -> %s", this, oldState.string().ascii().data(), state.string().ascii().data()); if (state == closedKeyword()) { m_private.clear(); m_mediaElement = 0; } if (oldState == state) return; m_readyState = state; onReadyStateChange(oldState, state); }
std::unique_ptr<PlatformTimeRanges> MediaSource::buffered() const { // Implements MediaSource algorithm for HTMLMediaElement.buffered. // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-source.html#htmlmediaelement-extensions Vector<RefPtr<TimeRanges>> ranges = activeRanges(); // 1. If activeSourceBuffers.length equals 0 then return an empty TimeRanges object and abort these steps. if (ranges.isEmpty()) return PlatformTimeRanges::create(); // 2. Let active ranges be the ranges returned by buffered for each SourceBuffer object in activeSourceBuffers. // 3. Let highest end time be the largest range end time in the active ranges. double highestEndTime = -1; for (size_t i = 0; i < ranges.size(); ++i) { unsigned length = ranges[i]->length(); if (length) highestEndTime = std::max(highestEndTime, ranges[i]->end(length - 1, ASSERT_NO_EXCEPTION)); } // Return an empty range if all ranges are empty. if (highestEndTime < 0) return PlatformTimeRanges::create(); // 4. Let intersection ranges equal a TimeRange object containing a single range from 0 to highest end time. RefPtr<TimeRanges> intersectionRanges = TimeRanges::create(0, highestEndTime); // 5. For each SourceBuffer object in activeSourceBuffers run the following steps: bool ended = readyState() == endedKeyword(); for (size_t i = 0; i < ranges.size(); ++i) { // 5.1 Let source ranges equal the ranges returned by the buffered attribute on the current SourceBuffer. TimeRanges* sourceRanges = ranges[i].get(); // 5.2 If readyState is "ended", then set the end time on the last range in source ranges to highest end time. if (ended && sourceRanges->length()) sourceRanges->add(sourceRanges->start(sourceRanges->length() - 1, ASSERT_NO_EXCEPTION), highestEndTime); // 5.3 Let new intersection ranges equal the the intersection between the intersection ranges and the source ranges. // 5.4 Replace the ranges in intersection ranges with the new intersection ranges. intersectionRanges->intersectWith(*sourceRanges); } return PlatformTimeRanges::create(intersectionRanges->ranges()); }
void MediaSource::setReadyState(const AtomicString& state) { ASSERT(state == openKeyword() || state == closedKeyword() || state == endedKeyword()); AtomicString oldState = readyState(); LOG(MediaSource, "MediaSource::setReadyState(%p) : %s -> %s", this, oldState.string().ascii().data(), state.string().ascii().data()); if (state == closedKeyword()) { m_private = nullptr; m_mediaElement = nullptr; m_duration = MediaTime::invalidTime(); } if (oldState == state) return; m_readyState = state; onReadyStateChange(oldState, state); }
void XMLHttpRequest::send(const QString &body) { Logger::log("XMLHttpRequest::send(): Body: " + body); switch (readyState()) { case HEADERS_RECEIVED: case LOADING: return; default: break; } m_redirects = 0; QBuffer *buffer = new QBuffer; buffer->setData(body.toUtf8()); buffer->open(QBuffer::ReadOnly); m_reply = networkAccessManager()->sendCustomRequest(m_request, m_method, buffer); buffer->setParent(m_reply); connect(m_reply, SIGNAL(metaDataChanged()), this, SLOT(onReplyMetaDataChanged())); connect(m_reply, SIGNAL(readyRead()), this, SLOT(onReplyReadyRead())); connect(m_reply, SIGNAL(finished()), this, SLOT(onReplyFinished())); }
void XMLHttpRequest::open(const QString &method, const QString &url, const QString &username, const QString &password) { Logger::log(QString("XMLHttpRequest::open(). Method: %1, URL: %2, Username: %3, Password: %4") .arg(method).arg(url).arg(username).arg(password)); switch (readyState()) { case OPENED: case HEADERS_RECEIVED: case LOADING: return; default: break; } m_method = method.toUtf8(); m_request.setUrl(QUrl::fromUserInput(url)); if ((!username.isEmpty()) || (!password.isEmpty())) { m_request.setRawHeader("Authorization", "Basic " + QString("%1:%2").arg(username).arg(password).toUtf8() .toBase64()); } setReadyState(OPENED); }
bool MediaSource::isEnded() const { return readyState() == endedKeyword(); }
bool MediaSource::isClosed() const { return readyState() == closedKeyword(); }
bool MediaSource::isOpen() const { return readyState() == openKeyword(); }
QString XMLHttpRequest::responseXML() const { return readyState() == DONE ? QString::fromUtf8(m_response) : QString(); }