Index: third_party/WebKit/Source/modules/mediastream/RTCDataChannel.cpp |
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.cpp b/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.cpp |
deleted file mode 100644 |
index a3e9296d62beed77132f4f9de44078ee1962c726..0000000000000000000000000000000000000000 |
--- a/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.cpp |
+++ /dev/null |
@@ -1,400 +0,0 @@ |
-/* |
- * Copyright (C) 2012 Google Inc. All rights reserved. |
- * |
- * Redistribution and use in source and binary forms, with or without |
- * modification, are permitted provided that the following conditions |
- * are met: |
- * 1. Redistributions of source code must retain the above copyright |
- * notice, this list of conditions and the following disclaimer. |
- * 2. Redistributions in binary form must reproduce the above copyright |
- * notice, this list of conditions and the following disclaimer in the |
- * documentation and/or other materials provided with the distribution. |
- * |
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY |
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
- * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY |
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- */ |
- |
-#include "modules/mediastream/RTCDataChannel.h" |
- |
-#include "bindings/core/v8/ExceptionState.h" |
-#include "core/dom/DOMArrayBuffer.h" |
-#include "core/dom/DOMArrayBufferView.h" |
-#include "core/dom/ExceptionCode.h" |
-#include "core/dom/ExecutionContext.h" |
-#include "core/events/MessageEvent.h" |
-#include "core/fileapi/Blob.h" |
-#include "modules/mediastream/RTCPeerConnection.h" |
-#include "public/platform/WebRTCPeerConnectionHandler.h" |
-#include "wtf/PtrUtil.h" |
-#include <memory> |
- |
-namespace blink { |
- |
-static void throwNotOpenException(ExceptionState& exceptionState) |
-{ |
- exceptionState.throwDOMException(InvalidStateError, "RTCDataChannel.readyState is not 'open'"); |
-} |
- |
-static void throwCouldNotSendDataException(ExceptionState& exceptionState) |
-{ |
- exceptionState.throwDOMException(NetworkError, "Could not send data"); |
-} |
- |
-static void throwNoBlobSupportException(ExceptionState& exceptionState) |
-{ |
- exceptionState.throwDOMException(NotSupportedError, "Blob support not implemented yet"); |
-} |
- |
-RTCDataChannel* RTCDataChannel::create(ExecutionContext* context, std::unique_ptr<WebRTCDataChannelHandler> handler) |
-{ |
- DCHECK(handler); |
- RTCDataChannel* channel = new RTCDataChannel(context, std::move(handler)); |
- channel->suspendIfNeeded(); |
- |
- return channel; |
-} |
- |
-RTCDataChannel* RTCDataChannel::create(ExecutionContext* context, WebRTCPeerConnectionHandler* peerConnectionHandler, const String& label, const WebRTCDataChannelInit& init, ExceptionState& exceptionState) |
-{ |
- std::unique_ptr<WebRTCDataChannelHandler> handler = wrapUnique(peerConnectionHandler->createDataChannel(label, init)); |
- if (!handler) { |
- exceptionState.throwDOMException(NotSupportedError, "RTCDataChannel is not supported"); |
- return nullptr; |
- } |
- RTCDataChannel* channel = new RTCDataChannel(context, std::move(handler)); |
- channel->suspendIfNeeded(); |
- |
- return channel; |
-} |
- |
-RTCDataChannel::RTCDataChannel(ExecutionContext* context, std::unique_ptr<WebRTCDataChannelHandler> handler) |
- : ActiveScriptWrappable(this) |
- , ActiveDOMObject(context) |
- , m_handler(std::move(handler)) |
- , m_readyState(ReadyStateConnecting) |
- , m_binaryType(BinaryTypeArrayBuffer) |
- , m_scheduledEventTimer(this, &RTCDataChannel::scheduledEventTimerFired) |
- , m_bufferedAmountLowThreshold(0U) |
- , m_stopped(false) |
-{ |
- ThreadState::current()->registerPreFinalizer(this); |
- m_handler->setClient(this); |
-} |
- |
-RTCDataChannel::~RTCDataChannel() |
-{ |
-} |
- |
-void RTCDataChannel::dispose() |
-{ |
- if (m_stopped) |
- return; |
- |
- // Promptly clears a raw reference from content/ to an on-heap object |
- // so that content/ doesn't access it in a lazy sweeping phase. |
- m_handler->setClient(nullptr); |
- m_handler.reset(); |
-} |
- |
-RTCDataChannel::ReadyState RTCDataChannel::getHandlerState() const |
-{ |
- return m_handler->state(); |
-} |
- |
-String RTCDataChannel::label() const |
-{ |
- return m_handler->label(); |
-} |
- |
-bool RTCDataChannel::reliable() const |
-{ |
- return m_handler->isReliable(); |
-} |
- |
-bool RTCDataChannel::ordered() const |
-{ |
- return m_handler->ordered(); |
-} |
- |
-unsigned short RTCDataChannel::maxRetransmitTime() const |
-{ |
- return m_handler->maxRetransmitTime(); |
-} |
- |
-unsigned short RTCDataChannel::maxRetransmits() const |
-{ |
- return m_handler->maxRetransmits(); |
-} |
- |
-String RTCDataChannel::protocol() const |
-{ |
- return m_handler->protocol(); |
-} |
- |
-bool RTCDataChannel::negotiated() const |
-{ |
- return m_handler->negotiated(); |
-} |
- |
-unsigned short RTCDataChannel::id() const |
-{ |
- return m_handler->id(); |
-} |
- |
-String RTCDataChannel::readyState() const |
-{ |
- switch (m_readyState) { |
- case ReadyStateConnecting: |
- return "connecting"; |
- case ReadyStateOpen: |
- return "open"; |
- case ReadyStateClosing: |
- return "closing"; |
- case ReadyStateClosed: |
- return "closed"; |
- } |
- |
- NOTREACHED(); |
- return String(); |
-} |
- |
-unsigned RTCDataChannel::bufferedAmount() const |
-{ |
- return m_handler->bufferedAmount(); |
-} |
- |
-unsigned RTCDataChannel::bufferedAmountLowThreshold() const |
-{ |
- return m_bufferedAmountLowThreshold; |
-} |
- |
-void RTCDataChannel::setBufferedAmountLowThreshold(unsigned threshold) |
-{ |
- m_bufferedAmountLowThreshold = threshold; |
-} |
- |
-String RTCDataChannel::binaryType() const |
-{ |
- switch (m_binaryType) { |
- case BinaryTypeBlob: |
- return "blob"; |
- case BinaryTypeArrayBuffer: |
- return "arraybuffer"; |
- } |
- NOTREACHED(); |
- return String(); |
-} |
- |
-void RTCDataChannel::setBinaryType(const String& binaryType, ExceptionState& exceptionState) |
-{ |
- if (binaryType == "blob") |
- throwNoBlobSupportException(exceptionState); |
- else if (binaryType == "arraybuffer") |
- m_binaryType = BinaryTypeArrayBuffer; |
- else |
- exceptionState.throwDOMException(TypeMismatchError, "Unknown binary type : " + binaryType); |
-} |
- |
-void RTCDataChannel::send(const String& data, ExceptionState& exceptionState) |
-{ |
- if (m_readyState != ReadyStateOpen) { |
- throwNotOpenException(exceptionState); |
- return; |
- } |
- if (!m_handler->sendStringData(data)) { |
- // FIXME: This should not throw an exception but instead forcefully close the data channel. |
- throwCouldNotSendDataException(exceptionState); |
- } |
-} |
- |
-void RTCDataChannel::send(DOMArrayBuffer* data, ExceptionState& exceptionState) |
-{ |
- if (m_readyState != ReadyStateOpen) { |
- throwNotOpenException(exceptionState); |
- return; |
- } |
- |
- size_t dataLength = data->byteLength(); |
- if (!dataLength) |
- return; |
- |
- if (!m_handler->sendRawData(static_cast<const char*>((data->data())), dataLength)) { |
- // FIXME: This should not throw an exception but instead forcefully close the data channel. |
- throwCouldNotSendDataException(exceptionState); |
- } |
-} |
- |
-void RTCDataChannel::send(DOMArrayBufferView* data, ExceptionState& exceptionState) |
-{ |
- if (!m_handler->sendRawData(static_cast<const char*>(data->baseAddress()), data->byteLength())) { |
- // FIXME: This should not throw an exception but instead forcefully close the data channel. |
- throwCouldNotSendDataException(exceptionState); |
- } |
-} |
- |
-void RTCDataChannel::send(Blob* data, ExceptionState& exceptionState) |
-{ |
- // FIXME: implement |
- throwNoBlobSupportException(exceptionState); |
-} |
- |
-void RTCDataChannel::close() |
-{ |
- m_handler->close(); |
-} |
- |
-void RTCDataChannel::didChangeReadyState(WebRTCDataChannelHandlerClient::ReadyState newState) |
-{ |
- if (m_readyState == ReadyStateClosed) |
- return; |
- |
- m_readyState = newState; |
- |
- switch (m_readyState) { |
- case ReadyStateOpen: |
- scheduleDispatchEvent(Event::create(EventTypeNames::open)); |
- break; |
- case ReadyStateClosed: |
- scheduleDispatchEvent(Event::create(EventTypeNames::close)); |
- break; |
- default: |
- break; |
- } |
-} |
- |
-void RTCDataChannel::didDecreaseBufferedAmount(unsigned previousAmount) |
-{ |
- if (previousAmount > m_bufferedAmountLowThreshold |
- && bufferedAmount() <= m_bufferedAmountLowThreshold) { |
- scheduleDispatchEvent(Event::create(EventTypeNames::bufferedamountlow)); |
- } |
-} |
- |
-void RTCDataChannel::didReceiveStringData(const WebString& text) |
-{ |
- scheduleDispatchEvent(MessageEvent::create(text)); |
-} |
- |
-void RTCDataChannel::didReceiveRawData(const char* data, size_t dataLength) |
-{ |
- if (m_binaryType == BinaryTypeBlob) { |
- // FIXME: Implement. |
- return; |
- } |
- if (m_binaryType == BinaryTypeArrayBuffer) { |
- DOMArrayBuffer* buffer = DOMArrayBuffer::create(data, dataLength); |
- scheduleDispatchEvent(MessageEvent::create(buffer)); |
- return; |
- } |
- NOTREACHED(); |
-} |
- |
-void RTCDataChannel::didDetectError() |
-{ |
- scheduleDispatchEvent(Event::create(EventTypeNames::error)); |
-} |
- |
-const AtomicString& RTCDataChannel::interfaceName() const |
-{ |
- return EventTargetNames::RTCDataChannel; |
-} |
- |
-ExecutionContext* RTCDataChannel::getExecutionContext() const |
-{ |
- return ActiveDOMObject::getExecutionContext(); |
-} |
- |
-// ActiveDOMObject |
-void RTCDataChannel::suspend() |
-{ |
- m_scheduledEventTimer.stop(); |
-} |
- |
-void RTCDataChannel::resume() |
-{ |
- if (!m_scheduledEvents.isEmpty() && !m_scheduledEventTimer.isActive()) |
- m_scheduledEventTimer.startOneShot(0, BLINK_FROM_HERE); |
-} |
- |
-void RTCDataChannel::stop() |
-{ |
- if (m_stopped) |
- return; |
- |
- m_stopped = true; |
- m_handler->setClient(nullptr); |
- m_handler.reset(); |
-} |
- |
-// ActiveScriptWrappable |
-bool RTCDataChannel::hasPendingActivity() const |
-{ |
- if (m_stopped) |
- return false; |
- |
- // A RTCDataChannel object must not be garbage collected if its |
- // * readyState is connecting and at least one event listener is registered |
- // for open events, message events, error events, or close events. |
- // * readyState is open and at least one event listener is registered for |
- // message events, error events, or close events. |
- // * readyState is closing and at least one event listener is registered for |
- // error events, or close events. |
- // * underlying data transport is established and data is queued to be |
- // transmitted. |
- bool hasValidListeners = false; |
- switch (m_readyState) { |
- case ReadyStateConnecting: |
- hasValidListeners |= hasEventListeners(EventTypeNames::open); |
- // fallthrough intended |
- case ReadyStateOpen: |
- hasValidListeners |= hasEventListeners(EventTypeNames::message); |
- // fallthrough intended |
- case ReadyStateClosing: |
- hasValidListeners |= hasEventListeners(EventTypeNames::error) || hasEventListeners(EventTypeNames::close); |
- break; |
- default: |
- break; |
- } |
- |
- if (hasValidListeners) |
- return true; |
- |
- return m_readyState != ReadyStateClosed && bufferedAmount() > 0; |
-} |
- |
-void RTCDataChannel::scheduleDispatchEvent(Event* event) |
-{ |
- m_scheduledEvents.append(event); |
- |
- if (!m_scheduledEventTimer.isActive()) |
- m_scheduledEventTimer.startOneShot(0, BLINK_FROM_HERE); |
-} |
- |
-void RTCDataChannel::scheduledEventTimerFired(Timer<RTCDataChannel>*) |
-{ |
- HeapVector<Member<Event>> events; |
- events.swap(m_scheduledEvents); |
- |
- HeapVector<Member<Event>>::iterator it = events.begin(); |
- for (; it != events.end(); ++it) |
- dispatchEvent((*it).release()); |
- |
- events.clear(); |
-} |
- |
-DEFINE_TRACE(RTCDataChannel) |
-{ |
- visitor->trace(m_scheduledEvents); |
- EventTargetWithInlineData::trace(visitor); |
- ActiveDOMObject::trace(visitor); |
-} |
- |
-} // namespace blink |