| Index: webrtc/pc/webrtcsdp_unittest.cc | 
| diff --git a/webrtc/pc/webrtcsdp_unittest.cc b/webrtc/pc/webrtcsdp_unittest.cc | 
| index 57a7bdb0c05117a3cece735704172c3a49641456..af6f2c91e615dadbd6926186d8bb9e9401db7355 100644 | 
| --- a/webrtc/pc/webrtcsdp_unittest.cc | 
| +++ b/webrtc/pc/webrtcsdp_unittest.cc | 
| @@ -94,6 +94,9 @@ static const char kExtmap[] = | 
| "a=extmap:1 http://example.com/082005/ext.htm#ttime\r\n"; | 
| static const char kExtmapWithDirectionAndAttribute[] = | 
| "a=extmap:1/sendrecv http://example.com/082005/ext.htm#ttime a1 a2\r\n"; | 
| +static const char kExtmapWithDirectionAndAttributeEncrypted[] = | 
| +    "a=extmap:1/sendrecv urn:ietf:params:rtp-hdrext:encrypt " | 
| +    "http://example.com/082005/ext.htm#ttime a1 a2\r\n"; | 
|  | 
| static const uint8_t kIdentityDigest[] = { | 
| 0x4A, 0xAD, 0xB9, 0xB1, 0x3F, 0x82, 0x18, 0x3B, 0x54, 0x02, | 
| @@ -1213,6 +1216,7 @@ class WebRtcSdpTest : public testing::Test { | 
| const RtpExtension ext2 = cd2->rtp_header_extensions().at(i); | 
| EXPECT_EQ(ext1.uri, ext2.uri); | 
| EXPECT_EQ(ext1.id, ext2.id); | 
| +      EXPECT_EQ(ext1.encrypt, ext2.encrypt); | 
| } | 
| } | 
|  | 
| @@ -1434,13 +1438,15 @@ class WebRtcSdpTest : public testing::Test { | 
| cricket::CONNECTIONROLE_NONE, &fingerprint)))); | 
| } | 
|  | 
| -  void AddExtmap() { | 
| +  void AddExtmap(bool encrypted) { | 
| audio_desc_ = static_cast<AudioContentDescription*>( | 
| audio_desc_->Copy()); | 
| video_desc_ = static_cast<VideoContentDescription*>( | 
| video_desc_->Copy()); | 
| -    audio_desc_->AddRtpHeaderExtension(RtpExtension(kExtmapUri, kExtmapId)); | 
| -    video_desc_->AddRtpHeaderExtension(RtpExtension(kExtmapUri, kExtmapId)); | 
| +    audio_desc_->AddRtpHeaderExtension( | 
| +        RtpExtension(kExtmapUri, kExtmapId, encrypted)); | 
| +    video_desc_->AddRtpHeaderExtension( | 
| +        RtpExtension(kExtmapUri, kExtmapId, encrypted)); | 
| desc_.RemoveContentByName(kAudioContentName); | 
| desc_.RemoveContentByName(kVideoContentName); | 
| desc_.AddContent(kAudioContentName, NS_JINGLE_RTP, audio_desc_); | 
| @@ -1576,8 +1582,9 @@ class WebRtcSdpTest : public testing::Test { | 
| return true; | 
| } | 
|  | 
| -  void TestDeserializeExtmap(bool session_level, bool media_level) { | 
| -    AddExtmap(); | 
| +  void TestDeserializeExtmap(bool session_level, bool media_level, | 
| +      bool encrypted) { | 
| +    AddExtmap(encrypted); | 
| JsepSessionDescription new_jdesc("dummy"); | 
| ASSERT_TRUE(new_jdesc.Initialize(desc_.Copy(), | 
| jdesc_.session_id(), | 
| @@ -1585,13 +1592,19 @@ class WebRtcSdpTest : public testing::Test { | 
| JsepSessionDescription jdesc_with_extmap("dummy"); | 
| std::string sdp_with_extmap = kSdpString; | 
| if (session_level) { | 
| -      InjectAfter(kSessionTime, kExtmapWithDirectionAndAttribute, | 
| +      InjectAfter(kSessionTime, | 
| +                  encrypted ? kExtmapWithDirectionAndAttributeEncrypted | 
| +                            : kExtmapWithDirectionAndAttribute, | 
| &sdp_with_extmap); | 
| } | 
| if (media_level) { | 
| -      InjectAfter(kAttributeIcePwdVoice, kExtmapWithDirectionAndAttribute, | 
| +      InjectAfter(kAttributeIcePwdVoice, | 
| +                  encrypted ? kExtmapWithDirectionAndAttributeEncrypted | 
| +                            : kExtmapWithDirectionAndAttribute, | 
| &sdp_with_extmap); | 
| -      InjectAfter(kAttributeIcePwdVideo, kExtmapWithDirectionAndAttribute, | 
| +      InjectAfter(kAttributeIcePwdVideo, | 
| +                  encrypted ? kExtmapWithDirectionAndAttributeEncrypted | 
| +                            : kExtmapWithDirectionAndAttribute, | 
| &sdp_with_extmap); | 
| } | 
| // The extmap can't be present at the same time in both session level and | 
| @@ -2016,7 +2029,8 @@ TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithDataChannelAndBandwidth) { | 
| } | 
|  | 
| TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithExtmap) { | 
| -  AddExtmap(); | 
| +  bool encrypted = false; | 
| +  AddExtmap(encrypted); | 
| JsepSessionDescription desc_with_extmap("dummy"); | 
| MakeDescriptionWithoutCandidates(&desc_with_extmap); | 
| std::string message = webrtc::SdpSerialize(desc_with_extmap, false); | 
| @@ -2030,6 +2044,15 @@ TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithExtmap) { | 
| EXPECT_EQ(sdp_with_extmap, message); | 
| } | 
|  | 
| +TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithExtmapEncrypted) { | 
| +  bool encrypted = true; | 
| +  AddExtmap(encrypted); | 
| +  JsepSessionDescription desc_with_extmap("dummy"); | 
| +  ASSERT_TRUE(desc_with_extmap.Initialize(desc_.Copy(), | 
| +                                          kSessionId, kSessionVersion)); | 
| +  TestSerialize(desc_with_extmap, false); | 
| +} | 
| + | 
| TEST_F(WebRtcSdpTest, SerializeCandidates) { | 
| std::string message = webrtc::SdpSerializeCandidate(*jcandidate_); | 
| EXPECT_EQ(std::string(kRawCandidate), message); | 
| @@ -2675,18 +2698,32 @@ TEST_F(WebRtcSdpTest, DeserializeSdpWithSctpDataChannelsAndBandwidth) { | 
| EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_with_bandwidth)); | 
| } | 
|  | 
| -TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithSessionLevelExtmap) { | 
| -  TestDeserializeExtmap(true, false); | 
| +class WebRtcSdpExtmapTest | 
| +  : public WebRtcSdpTest, public testing::WithParamInterface<bool> { | 
| +}; | 
| + | 
| +TEST_P(WebRtcSdpExtmapTest, | 
| +    DeserializeSessionDescriptionWithSessionLevelExtmap) { | 
| +  bool encrypted = GetParam(); | 
| +  TestDeserializeExtmap(true, false, encrypted); | 
| } | 
|  | 
| -TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithMediaLevelExtmap) { | 
| -  TestDeserializeExtmap(false, true); | 
| +TEST_P(WebRtcSdpExtmapTest, | 
| +    DeserializeSessionDescriptionWithMediaLevelExtmap) { | 
| +  bool encrypted = GetParam(); | 
| +  TestDeserializeExtmap(false, true, encrypted); | 
| } | 
|  | 
| -TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithInvalidExtmap) { | 
| -  TestDeserializeExtmap(true, true); | 
| +TEST_P(WebRtcSdpExtmapTest, | 
| +    DeserializeSessionDescriptionWithInvalidExtmap) { | 
| +  bool encrypted = GetParam(); | 
| +  TestDeserializeExtmap(true, true, encrypted); | 
| } | 
|  | 
| +INSTANTIATE_TEST_CASE_P(Encrypted, | 
| +                        WebRtcSdpExtmapTest, | 
| +                        ::testing::Values(false, true)); | 
| + | 
| TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutEndLineBreak) { | 
| JsepSessionDescription jdesc(kDummyString); | 
| std::string sdp = kSdpFullString; | 
|  |