Make CopyOnWriteBuffer keep capacity
for SetData and Clear functions too.

This way result of all functions is same
for shared and non-shared buffer cases

R=kwiberg@webrtc.org

Review URL: https://codereview.webrtc.org/2328553002 .

Cr-Commit-Position: refs/heads/master@{#14196}
diff --git a/webrtc/base/copyonwritebuffer.h b/webrtc/base/copyonwritebuffer.h
index 108aaa1..70833d6 100644
--- a/webrtc/base/copyonwritebuffer.h
+++ b/webrtc/base/copyonwritebuffer.h
@@ -153,9 +153,10 @@
                 internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
   void SetData(const T* data, size_t size) {
     RTC_DCHECK(IsConsistent());
-    if (!buffer_ || !buffer_->HasOneRef()) {
-      buffer_ = size > 0 ? new RefCountedObject<Buffer>(data, size)
-                         : nullptr;
+    if (!buffer_) {
+      buffer_ = size > 0 ? new RefCountedObject<Buffer>(data, size) : nullptr;
+    } else if (!buffer_->HasOneRef()) {
+      buffer_ = new RefCountedObject<Buffer>(data, size, buffer_->capacity());
     } else {
       buffer_->SetData(data, size);
     }
@@ -253,13 +254,16 @@
     RTC_DCHECK(IsConsistent());
   }
 
-  // Resets the buffer to zero size and capacity.
+  // Resets the buffer to zero size without altering capacity. Works even if the
+  // buffer has been moved from.
   void Clear() {
-    RTC_DCHECK(IsConsistent());
-    if (!buffer_ || !buffer_->HasOneRef()) {
-      buffer_ = nullptr;
-    } else {
+    if (!buffer_)
+      return;
+
+    if (buffer_->HasOneRef()) {
       buffer_->Clear();
+    } else {
+      buffer_ = new RefCountedObject<Buffer>(0, buffer_->capacity());
     }
     RTC_DCHECK(IsConsistent());
   }