Code cleanup: Make JsepSessionDescription::Initialize take std::unique_ptr

Bug: none
Change-Id: I5e03ff6a6f16bd2e67fa4830e218b510b702d1d4
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/132321
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27577}
diff --git a/api/jsep_session_description.h b/api/jsep_session_description.h
index 75ae0cd..2797c88 100644
--- a/api/jsep_session_description.h
+++ b/api/jsep_session_description.h
@@ -44,8 +44,10 @@
   virtual ~JsepSessionDescription();
 
   // Takes ownership of |description|.
-  // TODO(deadbeef): Make this use an std::unique_ptr<>, so ownership logic is
-  // more clear.
+  bool Initialize(std::unique_ptr<cricket::SessionDescription> description,
+                  const std::string& session_id,
+                  const std::string& session_version);
+  // Backwards compatible version. To be deprecated.
   bool Initialize(cricket::SessionDescription* description,
                   const std::string& session_id,
                   const std::string& session_version);
diff --git a/pc/jsep_session_description.cc b/pc/jsep_session_description.cc
index 88db174..90b12a4 100644
--- a/pc/jsep_session_description.cc
+++ b/pc/jsep_session_description.cc
@@ -150,7 +150,7 @@
     std::unique_ptr<cricket::SessionDescription> description) {
   auto jsep_description = absl::make_unique<JsepSessionDescription>(type);
   bool initialize_success = jsep_description->Initialize(
-      description.release(), session_id, session_version);
+      std::move(description), session_id, session_version);
   RTC_DCHECK(initialize_success);
   return std::move(jsep_description);
 }
@@ -185,7 +185,7 @@
 JsepSessionDescription::~JsepSessionDescription() {}
 
 bool JsepSessionDescription::Initialize(
-    cricket::SessionDescription* description,
+    std::unique_ptr<cricket::SessionDescription> description,
     const std::string& session_id,
     const std::string& session_version) {
   if (!description)
@@ -193,11 +193,18 @@
 
   session_id_ = session_id;
   session_version_ = session_version;
-  description_.reset(description);
+  description_ = std::move(description);
   candidate_collection_.resize(number_of_mediasections());
   return true;
 }
 
+bool JsepSessionDescription::Initialize(
+    cricket::SessionDescription* description,
+    const std::string& session_id,
+    const std::string& session_version) {
+  return Initialize(absl::WrapUnique(description), session_id, session_version);
+}
+
 bool JsepSessionDescription::AddCandidate(
     const IceCandidateInterface* candidate) {
   if (!candidate || candidate->sdp_mline_index() < 0)
diff --git a/pc/jsep_session_description_unittest.cc b/pc/jsep_session_description_unittest.cc
index 674b6e7..aca9dd8 100644
--- a/pc/jsep_session_description_unittest.cc
+++ b/pc/jsep_session_description_unittest.cc
@@ -53,15 +53,14 @@
 
 // This creates a session description with both audio and video media contents.
 // In SDP this is described by two m lines, one audio and one video.
-static cricket::SessionDescription* CreateCricketSessionDescription() {
-  cricket::SessionDescription* desc(new cricket::SessionDescription());
-  // AudioContentDescription
-  std::unique_ptr<cricket::AudioContentDescription> audio(
-      new cricket::AudioContentDescription());
+static std::unique_ptr<cricket::SessionDescription>
+CreateCricketSessionDescription() {
+  auto desc = absl::make_unique<cricket::SessionDescription>();
 
+  // AudioContentDescription
+  auto audio = absl::make_unique<cricket::AudioContentDescription>();
   // VideoContentDescription
-  std::unique_ptr<cricket::VideoContentDescription> video(
-      new cricket::VideoContentDescription());
+  auto video = absl::make_unique<cricket::VideoContentDescription>();
 
   audio->AddCodec(cricket::AudioCodec(103, "ISAC", 16000, 0, 0));
   desc->AddContent(cricket::CN_AUDIO, MediaProtocolType::kRtp, audio.release());
diff --git a/pc/jsep_transport_controller_unittest.cc b/pc/jsep_transport_controller_unittest.cc
index b18f85a..e81b667 100644
--- a/pc/jsep_transport_controller_unittest.cc
+++ b/pc/jsep_transport_controller_unittest.cc
@@ -2089,13 +2089,13 @@
                   .ok());
 
   std::unique_ptr<cricket::SessionDescription> remote_answer(
-      local_offer->Copy());
+      local_offer->Clone());
   EXPECT_TRUE(transport_controller_
                   ->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
                   .ok());
 
   std::unique_ptr<cricket::SessionDescription> local_reoffer(
-      local_offer->Copy());
+      local_offer->Clone());
   local_reoffer->contents()[0].rejected = true;
   AddVideoSection(local_reoffer.get(), kVideoMid1, kIceUfrag1, kIcePwd1,
                   cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_ACTPASS,
@@ -2110,7 +2110,7 @@
                   .ok());
 
   std::unique_ptr<cricket::SessionDescription> remote_reanswer(
-      local_reoffer->Copy());
+      local_reoffer->Clone());
   EXPECT_TRUE(
       transport_controller_
           ->SetRemoteDescription(SdpType::kAnswer, remote_reanswer.get())
diff --git a/pc/media_session_unittest.cc b/pc/media_session_unittest.cc
index efd2318..1136607 100644
--- a/pc/media_session_unittest.cc
+++ b/pc/media_session_unittest.cc
@@ -3191,7 +3191,7 @@
   vcd->AddLegacyStream(2);
   source.AddContent(cricket::CN_VIDEO, MediaProtocolType::kRtp, vcd);
 
-  std::unique_ptr<SessionDescription> copy(source.Copy());
+  std::unique_ptr<SessionDescription> copy = source.Clone();
   ASSERT_TRUE(copy.get() != NULL);
   EXPECT_TRUE(copy->HasGroup(cricket::CN_AUDIO));
   const ContentInfo* ac = copy->GetContentByName("audio");
diff --git a/pc/peer_connection_interface_unittest.cc b/pc/peer_connection_interface_unittest.cc
index 21f6a05..e69fc96 100644
--- a/pc/peer_connection_interface_unittest.cc
+++ b/pc/peer_connection_interface_unittest.cc
@@ -3175,8 +3175,7 @@
   std::unique_ptr<SessionDescriptionInterface> modified_offer =
       webrtc::CreateSessionDescription(
           webrtc::SdpType::kOffer, offer->session_id(),
-          offer->session_version(),
-          absl::WrapUnique(offer->description()->Copy()));
+          offer->session_version(), offer->description()->Clone());
   EXPECT_TRUE(DoSetLocalDescription(std::move(offer)));
 
   auto senders = pc_->GetSenders();
diff --git a/pc/sdp_utils.cc b/pc/sdp_utils.cc
index 6a899af..e6cd07f 100644
--- a/pc/sdp_utils.cc
+++ b/pc/sdp_utils.cc
@@ -29,7 +29,7 @@
     SdpType type) {
   RTC_DCHECK(sdesc);
   auto clone = absl::make_unique<JsepSessionDescription>(type);
-  clone->Initialize(sdesc->description()->Copy(), sdesc->session_id(),
+  clone->Initialize(sdesc->description()->Clone(), sdesc->session_id(),
                     sdesc->session_version());
   // As of writing, our version of GCC does not allow returning a unique_ptr of
   // a subclass as a unique_ptr of a base class. To get around this, we need to
diff --git a/pc/session_description.cc b/pc/session_description.cc
index a081f8a..d4ccb50 100644
--- a/pc/session_description.cc
+++ b/pc/session_description.cc
@@ -10,9 +10,11 @@
 
 #include "pc/session_description.h"
 
+#include <algorithm>
 #include <utility>
 
 #include "absl/algorithm/container.h"
+#include "absl/memory/memory.h"
 #include "rtc_base/checks.h"
 
 namespace cricket {
@@ -94,8 +96,9 @@
   }
 }
 
-SessionDescription* SessionDescription::Copy() const {
-  SessionDescription* copy = new SessionDescription(*this);
+std::unique_ptr<SessionDescription> SessionDescription::Clone() const {
+  // Copy the non-special portions using the private copy constructor.
+  auto copy = absl::WrapUnique(new SessionDescription(*this));
   // Copy all ContentDescriptions.
   for (ContentInfos::iterator content = copy->contents_.begin();
        content != copy->contents().end(); ++content) {
@@ -104,6 +107,10 @@
   return copy;
 }
 
+SessionDescription* SessionDescription::Copy() const {
+  return Clone().release();
+}
+
 const ContentInfo* SessionDescription::GetContentByName(
     const std::string& name) const {
   return FindContentInfoByName(contents_, name);
diff --git a/pc/session_description.h b/pc/session_description.h
index 4156683..7b70ddf 100644
--- a/pc/session_description.h
+++ b/pc/session_description.h
@@ -14,6 +14,7 @@
 #include <stddef.h>
 #include <stdint.h>
 #include <iosfwd>
+#include <memory>
 #include <string>
 #include <vector>
 
@@ -421,6 +422,8 @@
   SessionDescription();
   ~SessionDescription();
 
+  std::unique_ptr<SessionDescription> Clone() const;
+  // Older API - to be deprecated. Still expects caller to take ownership.
   SessionDescription* Copy() const;
 
   struct MediaTransportSetting;
diff --git a/pc/webrtc_sdp.cc b/pc/webrtc_sdp.cc
index a119503..b524a75 100644
--- a/pc/webrtc_sdp.cc
+++ b/pc/webrtc_sdp.cc
@@ -998,7 +998,7 @@
     return false;
   }
 
-  jdesc->Initialize(desc.release(), session_id, session_version);
+  jdesc->Initialize(std::move(desc), session_id, session_version);
 
   for (const auto& candidate : candidates) {
     jdesc->AddCandidate(candidate.get());
diff --git a/pc/webrtc_sdp_unittest.cc b/pc/webrtc_sdp_unittest.cc
index 1fa7ba4..3de2b60 100644
--- a/pc/webrtc_sdp_unittest.cc
+++ b/pc/webrtc_sdp_unittest.cc
@@ -10,6 +10,7 @@
 
 #include <stdio.h>
 #include <string.h>
+#include <algorithm>
 #include <cstdint>
 #include <map>
 #include <memory>
@@ -1130,7 +1131,7 @@
         new JsepIceCandidate(std::string("audio_content_name"), 0, candidate1));
 
     // Set up JsepSessionDescription.
-    jdesc_.Initialize(desc_.Copy(), kSessionId, kSessionVersion);
+    jdesc_.Initialize(desc_.Clone(), kSessionId, kSessionVersion);
     std::string mline_id;
     int mline_index = 0;
     for (size_t i = 0; i < candidates_.size(); ++i) {
@@ -1178,7 +1179,7 @@
     group.AddContentName(kVideoContentName);
     desc_.AddGroup(group);
 
-    ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
+    ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(),
                                   jdesc_.session_version()));
   }
 
@@ -1214,7 +1215,7 @@
     desc_.AddContent(kAudioContentName, MediaProtocolType::kRtp, audio_desc_);
     desc_.AddContent(kVideoContentName, MediaProtocolType::kRtp, video_desc_);
 
-    ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
+    ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(),
                                   jdesc_.session_version()));
   }
 
@@ -1263,7 +1264,7 @@
         kVideoContentName3, TransportDescription(kUfragVideo3, kPwdVideo3)));
     desc_.set_msid_signaling(cricket::kMsidSignalingMediaSection);
 
-    ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
+    ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(),
                                   jdesc_.session_version()));
   }
 
@@ -1318,7 +1319,7 @@
     desc_.AddTransportInfo(TransportInfo(
         kAudioContentName3, TransportDescription(kUfragVoice3, kPwdVoice3)));
     desc_.set_msid_signaling(msid_signaling);
-    ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
+    ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(),
                                   jdesc_.session_version()));
   }
 
@@ -1340,7 +1341,7 @@
 
     // Enable signaling a=msid lines.
     desc_.set_msid_signaling(cricket::kMsidSignalingMediaSection);
-    ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
+    ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(),
                                   jdesc_.session_version()));
   }
 
@@ -1724,7 +1725,7 @@
     std::string new_sdp = kSdpFullString;
     ReplaceDirection(direction, &new_sdp);
 
-    if (!jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
+    if (!jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(),
                            jdesc_.session_version())) {
       return false;
     }
@@ -1802,7 +1803,7 @@
 
     audio_desc_->set_direction(direction);
     video_desc_->set_direction(direction);
-    if (!jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
+    if (!jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(),
                            jdesc_.session_version())) {
       return false;
     }
@@ -1829,7 +1830,7 @@
     SetIceUfragPwd(kVideoContentName, video_rejected ? "" : kUfragVideo,
                    video_rejected ? "" : kPwdVideo);
     JsepSessionDescription jdesc_no_candidates(kDummyType);
-    if (!jdesc_no_candidates.Initialize(desc_.Copy(), jdesc_.session_id(),
+    if (!jdesc_no_candidates.Initialize(desc_.Clone(), jdesc_.session_id(),
                                         jdesc_.session_version())) {
       return false;
     }
@@ -1842,7 +1843,7 @@
                              bool encrypted) {
     AddExtmap(encrypted);
     JsepSessionDescription new_jdesc(SdpType::kOffer);
-    ASSERT_TRUE(new_jdesc.Initialize(desc_.Copy(), jdesc_.session_id(),
+    ASSERT_TRUE(new_jdesc.Initialize(desc_.Clone(), jdesc_.session_id(),
                                      jdesc_.session_version()));
     JsepSessionDescription jdesc_with_extmap(SdpType::kOffer);
     std::string sdp_with_extmap = kSdpString;
@@ -2035,7 +2036,7 @@
     rtc::SocketAddress video_addr("0.0.0.0", 9);
     audio_desc_->set_connection_address(audio_addr);
     video_desc_->set_connection_address(video_addr);
-    ASSERT_TRUE(jdesc->Initialize(desc_.Copy(), kSessionId, kSessionVersion));
+    ASSERT_TRUE(jdesc->Initialize(desc_.Clone(), kSessionId, kSessionVersion));
   }
 
  protected:
@@ -2119,7 +2120,7 @@
   group.AddContentName(kAudioContentName);
   group.AddContentName(kVideoContentName);
   desc_.AddGroup(group);
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
+  ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(),
                                 jdesc_.session_version()));
   std::string message = webrtc::SdpSerialize(jdesc_);
   std::string sdp_with_bundle = kSdpFullString;
@@ -2134,7 +2135,7 @@
   vcd->set_bandwidth(100 * 1000);
   AudioContentDescription* acd = GetFirstAudioContentDescription(&desc_);
   acd->set_bandwidth(50 * 1000);
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
+  ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(),
                                 jdesc_.session_version()));
   std::string message = webrtc::SdpSerialize(jdesc_);
   std::string sdp_with_bandwidth = kSdpFullString;
@@ -2154,7 +2155,7 @@
   transport_options.push_back(kIceOption2);
   transport_options.push_back(kIceOption3);
   AddIceOptions(kVideoContentName, transport_options);
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
+  ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(),
                                 jdesc_.session_version()));
   std::string message = webrtc::SdpSerialize(jdesc_);
   std::string sdp_with_ice_options = kSdpFullString;
@@ -2295,7 +2296,7 @@
   AddExtmap(encrypted);
   JsepSessionDescription desc_with_extmap(kDummyType);
   ASSERT_TRUE(
-      desc_with_extmap.Initialize(desc_.Copy(), kSessionId, kSessionVersion));
+      desc_with_extmap.Initialize(desc_.Clone(), kSessionId, kSessionVersion));
   TestSerialize(desc_with_extmap);
 }
 
@@ -2356,7 +2357,7 @@
   h264_codec.SetParam("packetization-mode", "1");
   video_desc_->AddCodec(h264_codec);
 
-  jdesc_.Initialize(desc_.Copy(), kSessionId, kSessionVersion);
+  jdesc_.Initialize(desc_.Clone(), kSessionId, kSessionVersion);
 
   std::string message = webrtc::SdpSerialize(jdesc_);
   size_t after_pt = message.find(" H264/90000");
@@ -2414,7 +2415,7 @@
 TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutCandidates) {
   // SessionDescription with desc but without candidates.
   JsepSessionDescription jdesc_no_candidates(kDummyType);
-  ASSERT_TRUE(jdesc_no_candidates.Initialize(desc_.Copy(), kSessionId,
+  ASSERT_TRUE(jdesc_no_candidates.Initialize(desc_.Clone(), kSessionId,
                                              kSessionVersion));
   JsepSessionDescription new_jdesc(kDummyType);
   EXPECT_TRUE(SdpDeserialize(kSdpString, &new_jdesc));
@@ -2481,7 +2482,7 @@
   // Add a DTLS a=fingerprint attribute to our session description.
   AddFingerprint();
   JsepSessionDescription new_jdesc(kDummyType);
-  ASSERT_TRUE(new_jdesc.Initialize(desc_.Copy(), jdesc_.session_id(),
+  ASSERT_TRUE(new_jdesc.Initialize(desc_.Clone(), jdesc_.session_id(),
                                    jdesc_.session_version()));
 
   JsepSessionDescription jdesc_with_fingerprint(kDummyType);
@@ -2503,7 +2504,7 @@
   group.AddContentName(kAudioContentName);
   group.AddContentName(kVideoContentName);
   desc_.AddGroup(group);
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
+  ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(),
                                 jdesc_.session_version()));
   EXPECT_TRUE(CompareSessionDescription(jdesc_, jdesc_with_bundle));
 }
@@ -2520,7 +2521,7 @@
   vcd->set_bandwidth(100 * 1000);
   AudioContentDescription* acd = GetFirstAudioContentDescription(&desc_);
   acd->set_bandwidth(50 * 1000);
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
+  ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(),
                                 jdesc_.session_version()));
   EXPECT_TRUE(CompareSessionDescription(jdesc_, jdesc_with_bandwidth));
 }
@@ -2543,7 +2544,7 @@
   transport_options.push_back(kIceOption3);
   transport_options.push_back(kIceOption2);
   AddIceOptions(kVideoContentName, transport_options);
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
+  ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(),
                                 jdesc_.session_version()));
   EXPECT_TRUE(CompareSessionDescription(jdesc_, jdesc_with_ice_options));
 }
@@ -2771,7 +2772,7 @@
 TEST_F(WebRtcSdpTest, DeserializeSdpWithRtpDataChannels) {
   AddRtpDataChannel();
   JsepSessionDescription jdesc(kDummyType);
-  ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion));
+  ASSERT_TRUE(jdesc.Initialize(desc_.Clone(), kSessionId, kSessionVersion));
 
   std::string sdp_with_data = kSdpString;
   sdp_with_data.append(kSdpRtpDataChannelString);
@@ -2787,7 +2788,7 @@
   bool use_sctpmap = true;
   AddSctpDataChannel(use_sctpmap);
   JsepSessionDescription jdesc(kDummyType);
-  ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion));
+  ASSERT_TRUE(jdesc.Initialize(desc_.Clone(), kSessionId, kSessionVersion));
 
   std::string sdp_with_data = kSdpString;
   sdp_with_data.append(kSdpSctpDataChannelString);
@@ -2814,7 +2815,7 @@
   bool use_sctpmap = false;
   AddSctpDataChannel(use_sctpmap);
   JsepSessionDescription jdesc(kDummyType);
-  ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion));
+  ASSERT_TRUE(jdesc.Initialize(desc_.Clone(), kSessionId, kSessionVersion));
 
   std::string sdp_with_data = kSdpString;
   sdp_with_data.append(kSdpSctpDataChannelStringWithSctpPort);
@@ -2841,7 +2842,7 @@
   bool use_sctpmap = false;
   AddSctpDataChannel(use_sctpmap);
   JsepSessionDescription jdesc(kDummyType);
-  ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion));
+  ASSERT_TRUE(jdesc.Initialize(desc_.Clone(), kSessionId, kSessionVersion));
 
   std::string sdp_with_data = kSdpString;
   sdp_with_data.append(kSdpSctpDataChannelStringWithSctpColonPort);
@@ -2912,7 +2913,7 @@
   bool use_sctpmap = true;
   AddSctpDataChannel(use_sctpmap);
   JsepSessionDescription jdesc(kDummyType);
-  ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion));
+  ASSERT_TRUE(jdesc.Initialize(desc_.Clone(), kSessionId, kSessionVersion));
 
   std::string sdp_with_data = kSdpString;
   // Append m= attributes
@@ -2939,7 +2940,7 @@
 void MutateJsepSctpPort(JsepSessionDescription* jdesc,
                         const SessionDescription& desc) {
   // take our pre-built session description and change the SCTP port.
-  cricket::SessionDescription* mutant = desc.Copy();
+  std::unique_ptr<cricket::SessionDescription> mutant = desc.Clone();
   DataContentDescription* dcdesc =
       mutant->GetContentDescriptionByName(kDataContentName)->as_data();
   std::vector<cricket::DataCodec> codecs(dcdesc->codecs());
@@ -2948,9 +2949,8 @@
   codecs[0].SetParam(cricket::kCodecParamPort, kUnusualSctpPort);
   dcdesc->set_codecs(codecs);
 
-  // note: mutant's owned by jdesc now.
-  ASSERT_TRUE(jdesc->Initialize(mutant, kSessionId, kSessionVersion));
-  mutant = NULL;
+  ASSERT_TRUE(
+      jdesc->Initialize(std::move(mutant), kSessionId, kSessionVersion));
 }
 
 TEST_F(WebRtcSdpTest, DeserializeSdpWithSctpDataChannelAndUnusualPort) {
@@ -3017,7 +3017,7 @@
   JsepSessionDescription jdesc(kDummyType);
   DataContentDescription* dcd = GetFirstDataContentDescription(&desc_);
   dcd->set_bandwidth(100 * 1000);
-  ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion));
+  ASSERT_TRUE(jdesc.Initialize(desc_.Clone(), kSessionId, kSessionVersion));
 
   std::string sdp_with_bandwidth = kSdpString;
   sdp_with_bandwidth.append(kSdpSctpDataChannelString);
@@ -3374,7 +3374,7 @@
   codecs[0].params["unknown-future-parameter"] = "SomeFutureValue";
   acd->set_codecs(codecs);
 
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
+  ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(),
                                 jdesc_.session_version()));
   std::string message = webrtc::SdpSerialize(jdesc_);
   std::string sdp_with_fmtp = kSdpFullString;
@@ -3391,7 +3391,7 @@
   codecs[0].params["stereo"] = "1";
   acd->set_codecs(codecs);
 
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
+  ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(),
                                 jdesc_.session_version()));
   std::string message = webrtc::SdpSerialize(jdesc_);
   std::string sdp_with_fmtp = kSdpFullString;
@@ -3408,7 +3408,7 @@
   codecs[0].params["maxptime"] = "120";
   acd->set_codecs(codecs);
 
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
+  ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(),
                                 jdesc_.session_version()));
   std::string message = webrtc::SdpSerialize(jdesc_);
   std::string sdp_with_fmtp = kSdpFullString;
@@ -3426,7 +3426,7 @@
   codecs[0].params["x-google-min-bitrate"] = "10";
   vcd->set_codecs(codecs);
 
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
+  ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(),
                                 jdesc_.session_version()));
   std::string message = webrtc::SdpSerialize(jdesc_);
   std::string sdp_with_fmtp = kSdpFullString;
@@ -3497,7 +3497,7 @@
   desc_.AddTransportInfo(audio_transport_info);
   desc_.AddTransportInfo(video_transport_info);
 
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
+  ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(),
                                 jdesc_.session_version()));
   std::string message = webrtc::SdpSerialize(jdesc_);
   std::string sdp_with_dtlssetup = kSdpFullString;
@@ -4098,7 +4098,7 @@
   audio_desc_->set_connection_address(hostname_addr);
   video_desc_->set_connection_address(hostname_addr);
   ASSERT_TRUE(
-      expected_jsep.Initialize(desc_.Copy(), kSessionId, kSessionVersion));
+      expected_jsep.Initialize(desc_.Clone(), kSessionId, kSessionVersion));
   // Serialization.
   std::string message = webrtc::SdpSerialize(expected_jsep);
   // Deserialization.
@@ -4464,11 +4464,11 @@
 }
 
 TEST_F(WebRtcSdpTest, SerializeMediaTransportSettings) {
-  cricket::SessionDescription* description = new cricket::SessionDescription();
+  auto description = absl::make_unique<cricket::SessionDescription>();
 
   JsepSessionDescription output(SdpType::kOffer);
   // JsepSessionDescription takes ownership of the description.
-  output.Initialize(description, "session_id", "session_version");
+  output.Initialize(std::move(description), "session_id", "session_version");
   output.description()->AddMediaTransportSetting("foo", "bar");
   std::string serialized_out;
   output.ToString(&serialized_out);
@@ -4478,8 +4478,7 @@
 TEST_F(WebRtcSdpTest, SerializeMediaTransportSettingsTestCopy) {
   cricket::SessionDescription description;
   description.AddMediaTransportSetting("name", "setting");
-  std::unique_ptr<cricket::SessionDescription> copy =
-      absl::WrapUnique(description.Copy());
+  std::unique_ptr<cricket::SessionDescription> copy = description.Clone();
   ASSERT_EQ(1u, copy->MediaTransportSettings().size());
   EXPECT_EQ("name", copy->MediaTransportSettings()[0].transport_name);
   EXPECT_EQ("setting", copy->MediaTransportSettings()[0].transport_setting);