| // Copyright 2019 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "third_party/blink/renderer/modules/peerconnection/rtc_error.h" | 
 |  | 
 | #include <utility> | 
 |  | 
 | #include "base/notreached.h" | 
 |  | 
 | namespace blink { | 
 |  | 
 | namespace { | 
 |  | 
 | V8RTCErrorDetailType::Enum RTCErrorDetailToEnum( | 
 |     webrtc::RTCErrorDetailType detail) { | 
 |   switch (detail) { | 
 |     case webrtc::RTCErrorDetailType::NONE: | 
 |       return V8RTCErrorDetailType::Enum::kNoInfo; | 
 |     case webrtc::RTCErrorDetailType::DATA_CHANNEL_FAILURE: | 
 |       return V8RTCErrorDetailType::Enum::kDataChannelFailure; | 
 |     case webrtc::RTCErrorDetailType::DTLS_FAILURE: | 
 |       return V8RTCErrorDetailType::Enum::kDtlsFailure; | 
 |     case webrtc::RTCErrorDetailType::FINGERPRINT_FAILURE: | 
 |       return V8RTCErrorDetailType::Enum::kFingerprintFailure; | 
 |     case webrtc::RTCErrorDetailType::SCTP_FAILURE: | 
 |       return V8RTCErrorDetailType::Enum::kSctpFailure; | 
 |     case webrtc::RTCErrorDetailType::SDP_SYNTAX_ERROR: | 
 |       return V8RTCErrorDetailType::Enum::kSdpSyntaxError; | 
 |     case webrtc::RTCErrorDetailType::HARDWARE_ENCODER_NOT_AVAILABLE: | 
 |       return V8RTCErrorDetailType::Enum::kHardwareEncoderNotAvailable; | 
 |     case webrtc::RTCErrorDetailType::HARDWARE_ENCODER_ERROR: | 
 |       return V8RTCErrorDetailType::Enum::kHardwareEncoderError; | 
 |     default: | 
 |       // Included to ease introduction of new errors at the webrtc layer. | 
 |       NOTREACHED(); | 
 |   } | 
 | } | 
 | }  // namespace | 
 |  | 
 | // static | 
 | RTCError* RTCError::Create(const RTCErrorInit* init, String message) { | 
 |   return MakeGarbageCollected<RTCError>(init, std::move(message)); | 
 | } | 
 |  | 
 | RTCError::RTCError(const RTCErrorInit* init, String message) | 
 |     : DOMException(DOMExceptionCode::kOperationError, std::move(message)), | 
 |       error_detail_(init->errorDetail().AsEnum()), | 
 |       sdp_line_number_(init->hasSdpLineNumber() | 
 |                            ? std::optional<int32_t>(init->sdpLineNumber()) | 
 |                            : std::nullopt), | 
 |       http_request_status_code_( | 
 |           init->hasHttpRequestStatusCode() | 
 |               ? std::optional<int32_t>(init->httpRequestStatusCode()) | 
 |               : std::nullopt), | 
 |       sctp_cause_code_(init->hasSctpCauseCode() | 
 |                            ? std::optional<int32_t>(init->sctpCauseCode()) | 
 |                            : std::nullopt), | 
 |       received_alert_(init->hasReceivedAlert() | 
 |                           ? std::optional<uint32_t>(init->receivedAlert()) | 
 |                           : std::nullopt), | 
 |       sent_alert_(init->hasSentAlert() | 
 |                       ? std::optional<uint32_t>(init->sentAlert()) | 
 |                       : std::nullopt) {} | 
 |  | 
 | RTCError::RTCError(webrtc::RTCError err) | 
 |     : DOMException(DOMExceptionCode::kOperationError, err.message()), | 
 |       error_detail_(RTCErrorDetailToEnum(err.error_detail())), | 
 |       sctp_cause_code_(err.sctp_cause_code() | 
 |                            ? std::optional<int32_t>(*err.sctp_cause_code()) | 
 |                            : std::nullopt) {} | 
 |  | 
 | V8RTCErrorDetailType RTCError::errorDetail() const { | 
 |   return V8RTCErrorDetailType(error_detail_); | 
 | } | 
 |  | 
 | }  // namespace blink |