| Index: net/quic/quic_framer_test.cc
 | 
| diff --git a/net/quic/quic_framer_test.cc b/net/quic/quic_framer_test.cc
 | 
| index 0fa4ce97359dc1c30af30d57c7170881cf454690..69373e0590d98bc4c3d6e5c4fa103384372cd342 100644
 | 
| --- a/net/quic/quic_framer_test.cc
 | 
| +++ b/net/quic/quic_framer_test.cc
 | 
| @@ -113,13 +113,18 @@ class TestEncrypter : public QuicEncrypter {
 | 
|      CHECK(false) << "Not implemented";
 | 
|      return false;
 | 
|    }
 | 
| -  QuicData* EncryptPacket(QuicPacketSequenceNumber sequence_number,
 | 
| -                          StringPiece associated_data,
 | 
| -                          StringPiece plaintext) override {
 | 
| +  bool EncryptPacket(QuicPacketSequenceNumber sequence_number,
 | 
| +                     StringPiece associated_data,
 | 
| +                     StringPiece plaintext,
 | 
| +                     char* output,
 | 
| +                     size_t* output_length,
 | 
| +                     size_t max_output_length) override {
 | 
|      sequence_number_ = sequence_number;
 | 
|      associated_data_ = associated_data.as_string();
 | 
|      plaintext_ = plaintext.as_string();
 | 
| -    return new QuicData(plaintext.data(), plaintext.length());
 | 
| +    memcpy(output, plaintext.data(), plaintext.length());
 | 
| +    *output_length = plaintext.length();
 | 
| +    return true;
 | 
|    }
 | 
|    size_t GetKeySize() const override { return 0; }
 | 
|    size_t GetNoncePrefixSize() const override { return 0; }
 | 
| @@ -141,13 +146,18 @@ class TestDecrypter : public QuicDecrypter {
 | 
|    ~TestDecrypter() override {}
 | 
|    bool SetKey(StringPiece key) override { return true; }
 | 
|    bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; }
 | 
| -  QuicData* DecryptPacket(QuicPacketSequenceNumber sequence_number,
 | 
| -                          StringPiece associated_data,
 | 
| -                          StringPiece ciphertext) override {
 | 
| +  bool DecryptPacket(QuicPacketSequenceNumber sequence_number,
 | 
| +                     const StringPiece& associated_data,
 | 
| +                     const StringPiece& ciphertext,
 | 
| +                     char* output,
 | 
| +                     size_t* output_length,
 | 
| +                     size_t max_output_length) override {
 | 
|      sequence_number_ = sequence_number;
 | 
|      associated_data_ = associated_data.as_string();
 | 
|      ciphertext_ = ciphertext.as_string();
 | 
| -    return new QuicData(ciphertext.data(), ciphertext.length());
 | 
| +    memcpy(output, ciphertext.data(), ciphertext.length());
 | 
| +    *output_length = ciphertext.length();
 | 
| +    return true;
 | 
|    }
 | 
|    StringPiece GetKey() const override { return StringPiece(); }
 | 
|    StringPiece GetNoncePrefix() const override { return StringPiece(); }
 | 
| @@ -176,6 +186,8 @@ class TestQuicVisitor : public ::net::QuicFramerVisitorInterface {
 | 
|      STLDeleteElements(&stop_waiting_frames_);
 | 
|      STLDeleteElements(&ping_frames_);
 | 
|      STLDeleteElements(&fec_data_);
 | 
| +    STLDeleteElements(&stream_data_);
 | 
| +    STLDeleteElements(&fec_data_redundancy_);
 | 
|    }
 | 
|  
 | 
|    void OnError(QuicFramer* f) override {
 | 
| @@ -223,7 +235,14 @@ class TestQuicVisitor : public ::net::QuicFramerVisitorInterface {
 | 
|  
 | 
|    bool OnStreamFrame(const QuicStreamFrame& frame) override {
 | 
|      ++frame_count_;
 | 
| -    stream_frames_.push_back(new QuicStreamFrame(frame));
 | 
| +    // Save a copy of the data so it is valid after the packet is processed.
 | 
| +    stream_data_.push_back(frame.GetDataAsString());
 | 
| +    QuicStreamFrame* stream_frame = new QuicStreamFrame(frame);
 | 
| +    // Make sure that the stream frame points to this data.
 | 
| +    stream_frame->data.Clear();
 | 
| +    stream_frame->data.Append(const_cast<char*>(stream_data_.back()->data()),
 | 
| +                              stream_data_.back()->size());
 | 
| +    stream_frames_.push_back(stream_frame);
 | 
|      return true;
 | 
|    }
 | 
|  
 | 
| @@ -251,7 +270,13 @@ class TestQuicVisitor : public ::net::QuicFramerVisitorInterface {
 | 
|  
 | 
|    void OnFecData(const QuicFecData& fec) override {
 | 
|      ++fec_count_;
 | 
| -    fec_data_.push_back(new QuicFecData(fec));
 | 
| +    QuicFecData* fec_data = new QuicFecData();
 | 
| +    fec_data->fec_group = fec.fec_group;
 | 
| +    // Save a copy of the data so it is valid after the packet is processed.
 | 
| +    string* redundancy = new string(fec.redundancy.as_string());
 | 
| +    fec_data_redundancy_.push_back(redundancy);
 | 
| +    fec_data->redundancy = StringPiece(*redundancy);
 | 
| +    fec_data_.push_back(fec_data);
 | 
|    }
 | 
|  
 | 
|    void OnPacketComplete() override { ++complete_packets_; }
 | 
| @@ -307,6 +332,8 @@ class TestQuicVisitor : public ::net::QuicFramerVisitorInterface {
 | 
|    QuicGoAwayFrame goaway_frame_;
 | 
|    QuicWindowUpdateFrame window_update_frame_;
 | 
|    QuicBlockedFrame blocked_frame_;
 | 
| +  vector<string*> stream_data_;
 | 
| +  vector<string*> fec_data_redundancy_;
 | 
|  };
 | 
|  
 | 
|  class QuicFramerTest : public ::testing::TestWithParam<QuicVersion> {
 | 
| @@ -449,7 +476,13 @@ class QuicFramerTest : public ::testing::TestWithParam<QuicVersion> {
 | 
|  
 | 
|    QuicPacket* BuildDataPacket(const QuicPacketHeader& header,
 | 
|                                const QuicFrames& frames) {
 | 
| -    return BuildUnsizedDataPacket(&framer_, header, frames).packet;
 | 
| +    return BuildUnsizedDataPacket(&framer_, header, frames);
 | 
| +  }
 | 
| +
 | 
| +  QuicPacket* BuildDataPacket(const QuicPacketHeader& header,
 | 
| +                              const QuicFrames& frames,
 | 
| +                              size_t packet_size) {
 | 
| +    return BuildUnsizedDataPacket(&framer_, header, frames, packet_size);
 | 
|    }
 | 
|  
 | 
|    test::TestEncrypter* encrypter_;
 | 
| @@ -1312,8 +1345,7 @@ TEST_P(QuicFramerTest, StreamFrame3ByteStreamId) {
 | 
|  
 | 
|    ASSERT_EQ(1u, visitor_.stream_frames_.size());
 | 
|    EXPECT_EQ(0u, visitor_.ack_frames_.size());
 | 
| -  EXPECT_EQ(GG_UINT64_C(0x00020304),
 | 
| -            visitor_.stream_frames_[0]->stream_id);
 | 
| +  EXPECT_EQ(GG_UINT64_C(0x00020304), visitor_.stream_frames_[0]->stream_id);
 | 
|    EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
 | 
|    EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654),
 | 
|              visitor_.stream_frames_[0]->offset);
 | 
| @@ -3367,8 +3399,7 @@ TEST_P(QuicFramerTest, BuildTruncatedAckFrameLargePacket) {
 | 
|        0x00,
 | 
|    };
 | 
|  
 | 
| -  scoped_ptr<QuicPacket> data(
 | 
| -      framer_.BuildDataPacket(header, frames, kMaxPacketSize).packet);
 | 
| +  scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames));
 | 
|    ASSERT_TRUE(data != nullptr);
 | 
|  
 | 
|    test::CompareCharArraysWithHexError("constructed packet",
 | 
| @@ -3430,8 +3461,7 @@ TEST_P(QuicFramerTest, BuildTruncatedAckFrameSmallPacket) {
 | 
|        0x00,
 | 
|    };
 | 
|  
 | 
| -  scoped_ptr<QuicPacket> data(
 | 
| -      framer_.BuildDataPacket(header, frames, 37u).packet);
 | 
| +  scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames, 37u));
 | 
|    ASSERT_TRUE(data != nullptr);
 | 
|    // Expect 1 byte unused since at least 2 bytes are needed to fit more nacks.
 | 
|    EXPECT_EQ(36u, data->length());
 | 
| @@ -3904,8 +3934,7 @@ TEST_P(QuicFramerTest, BuildFecPacket) {
 | 
|      'm',  'n',  'o',  'p',
 | 
|    };
 | 
|  
 | 
| -  scoped_ptr<QuicPacket> data(
 | 
| -      framer_.BuildFecPacket(header, fec_data).packet);
 | 
| +  scoped_ptr<QuicPacket> data(framer_.BuildFecPacket(header, fec_data));
 | 
|    ASSERT_TRUE(data != nullptr);
 | 
|  
 | 
|    test::CompareCharArraysWithHexError("constructed packet",
 | 
| @@ -3936,10 +3965,9 @@ TEST_P(QuicFramerTest, EncryptPacket) {
 | 
|      'm',  'n',  'o',  'p',
 | 
|    };
 | 
|  
 | 
| -  scoped_ptr<QuicPacket> raw(
 | 
| -      QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false,
 | 
| -                                PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
 | 
| -                                PACKET_6BYTE_SEQUENCE_NUMBER));
 | 
| +  scoped_ptr<QuicPacket> raw(new QuicPacket(
 | 
| +      AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID,
 | 
| +      !kIncludeVersion, PACKET_6BYTE_SEQUENCE_NUMBER));
 | 
|    scoped_ptr<QuicEncryptedPacket> encrypted(
 | 
|        framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw));
 | 
|  
 | 
| @@ -3972,10 +4000,9 @@ TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) {
 | 
|      'm',  'n',  'o',  'p',
 | 
|    };
 | 
|  
 | 
| -  scoped_ptr<QuicPacket> raw(
 | 
| -      QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false,
 | 
| -                                PACKET_8BYTE_CONNECTION_ID, kIncludeVersion,
 | 
| -                                PACKET_6BYTE_SEQUENCE_NUMBER));
 | 
| +  scoped_ptr<QuicPacket> raw(new QuicPacket(
 | 
| +      AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID,
 | 
| +      kIncludeVersion, PACKET_6BYTE_SEQUENCE_NUMBER));
 | 
|    scoped_ptr<QuicEncryptedPacket> encrypted(
 | 
|        framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw));
 | 
|  
 | 
| @@ -4002,8 +4029,7 @@ TEST_P(QuicFramerTest, AckTruncationLargePacket) {
 | 
|    frames.push_back(frame);
 | 
|  
 | 
|    // Build an ack packet with truncation due to limit in number of nack ranges.
 | 
| -  scoped_ptr<QuicPacket> raw_ack_packet(
 | 
| -      framer_.BuildDataPacket(header, frames, kMaxPacketSize).packet);
 | 
| +  scoped_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames));
 | 
|    ASSERT_TRUE(raw_ack_packet != nullptr);
 | 
|    scoped_ptr<QuicEncryptedPacket> ack_packet(
 | 
|        framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number,
 | 
| @@ -4042,8 +4068,7 @@ TEST_P(QuicFramerTest, AckTruncationSmallPacket) {
 | 
|    frames.push_back(frame);
 | 
|  
 | 
|    // Build an ack packet with truncation due to limit in number of nack ranges.
 | 
| -  scoped_ptr<QuicPacket> raw_ack_packet(
 | 
| -      framer_.BuildDataPacket(header, frames, 500).packet);
 | 
| +  scoped_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames, 500));
 | 
|    ASSERT_TRUE(raw_ack_packet != nullptr);
 | 
|    scoped_ptr<QuicEncryptedPacket> ack_packet(
 | 
|        framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number,
 | 
| 
 |