Add a Clone() method to SessionDescriptionInterface

This should allow us to remove some SDP parsing in Chromium.

Bug: webrtc:12215
Change-Id: Ib85593d1c9226b29f2ec18617f945c76eca3b2d7
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/197806
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#32840}
diff --git a/api/jsep.h b/api/jsep.h
index cf8aeb0..7ef4c53 100644
--- a/api/jsep.h
+++ b/api/jsep.h
@@ -136,6 +136,13 @@
 
   virtual ~SessionDescriptionInterface() {}
 
+  // Create a new SessionDescriptionInterface object
+  // with the same values as the old object.
+  // TODO(bugs.webrtc.org:12215): Remove default implementation
+  virtual std::unique_ptr<SessionDescriptionInterface> Clone() {
+    return nullptr;
+  }
+
   // Only for use internally.
   virtual cricket::SessionDescription* description() = 0;
   virtual const cricket::SessionDescription* description() const = 0;
diff --git a/api/jsep_session_description.h b/api/jsep_session_description.h
index 79e15e2..0ba3807 100644
--- a/api/jsep_session_description.h
+++ b/api/jsep_session_description.h
@@ -49,6 +49,8 @@
                   const std::string& session_id,
                   const std::string& session_version);
 
+  virtual std::unique_ptr<SessionDescriptionInterface> Clone();
+
   virtual cricket::SessionDescription* description() {
     return description_.get();
   }
diff --git a/pc/jsep_session_description.cc b/pc/jsep_session_description.cc
index 7f30b50..2334e92 100644
--- a/pc/jsep_session_description.cc
+++ b/pc/jsep_session_description.cc
@@ -215,6 +215,13 @@
   return true;
 }
 
+std::unique_ptr<SessionDescriptionInterface> JsepSessionDescription::Clone() {
+  auto new_description = std::make_unique<JsepSessionDescription>(type_);
+  new_description->Initialize(description_->Clone(), session_id_,
+                              session_version_);
+  return new_description;
+}
+
 bool JsepSessionDescription::AddCandidate(
     const IceCandidateInterface* candidate) {
   if (!candidate)
diff --git a/pc/jsep_session_description_unittest.cc b/pc/jsep_session_description_unittest.cc
index 8caac94..7f83c08 100644
--- a/pc/jsep_session_description_unittest.cc
+++ b/pc/jsep_session_description_unittest.cc
@@ -117,6 +117,18 @@
   std::unique_ptr<JsepSessionDescription> jsep_desc_;
 };
 
+TEST_F(JsepSessionDescriptionTest, CloneDefault) {
+  auto new_desc = jsep_desc_->Clone();
+  EXPECT_EQ(jsep_desc_->type(), new_desc->type());
+  std::string old_desc_string;
+  std::string new_desc_string;
+  EXPECT_TRUE(jsep_desc_->ToString(&old_desc_string));
+  EXPECT_TRUE(new_desc->ToString(&new_desc_string));
+  EXPECT_EQ(old_desc_string, new_desc_string);
+  EXPECT_EQ(jsep_desc_->session_id(), new_desc->session_id());
+  EXPECT_EQ(jsep_desc_->session_version(), new_desc->session_version());
+}
+
 // Test that number_of_mediasections() returns the number of media contents in
 // a session description.
 TEST_F(JsepSessionDescriptionTest, CheckSessionDescription) {