diff --git a/spdy/core/http2_frame_decoder_adapter.cc b/spdy/core/http2_frame_decoder_adapter.cc
index c275422..b9989c8 100644
--- a/spdy/core/http2_frame_decoder_adapter.cc
+++ b/spdy/core/http2_frame_decoder_adapter.cc
@@ -272,10 +272,6 @@
   debug_visitor_ = debug_visitor;
 }
 
-void Http2DecoderAdapter::set_process_single_input_frame(bool v) {
-  process_single_input_frame_ = v;
-}
-
 void Http2DecoderAdapter::set_extension_visitor(
     ExtensionVisitorInterface* visitor) {
   extension_ = visitor;
@@ -307,7 +303,7 @@
     data += processed;
     len -= processed;
     total_processed += processed;
-    if (process_single_input_frame() || processed == 0) {
+    if (processed == 0) {
       break;
     }
   }
diff --git a/spdy/core/http2_frame_decoder_adapter.h b/spdy/core/http2_frame_decoder_adapter.h
index 44f3800..eec6958 100644
--- a/spdy/core/http2_frame_decoder_adapter.h
+++ b/spdy/core/http2_frame_decoder_adapter.h
@@ -131,20 +131,10 @@
   void SetDecoderHeaderTableDebugVisitor(
       std::unique_ptr<spdy::HpackHeaderTable::DebugVisitorInterface> visitor);
 
-  // Sets whether or not ProcessInput returns after finishing a frame, or
-  // continues processing additional frames. Normally ProcessInput processes
-  // all input, but this method enables the caller (and visitor) to work with
-  // a single frame at a time (or that portion of the frame which is provided
-  // as input). Reset() does not change the value of this flag.
-  void set_process_single_input_frame(bool v);
-  bool process_single_input_frame() const {
-    return process_single_input_frame_;
-  }
-
   // Decode the |len| bytes of encoded HTTP/2 starting at |*data|. Returns
   // the number of bytes consumed. It is safe to pass more bytes in than
   // may be consumed. Should process (or otherwise buffer) as much as
-  // available, unless process_single_input_frame is true.
+  // available.
   size_t ProcessInput(const char* data, size_t len);
 
   // Reset the decoder (used just for tests at this time).
@@ -350,8 +340,6 @@
 
   // Is the current frame payload destined for |extension_|?
   bool handling_extension_payload_ = false;
-
-  bool process_single_input_frame_ = false;
 };
 
 }  // namespace http2
diff --git a/spdy/core/spdy_framer_test.cc b/spdy/core/spdy_framer_test.cc
index d913a05..53bfc2c 100644
--- a/spdy/core/spdy_framer_test.cc
+++ b/spdy/core/spdy_framer_test.cc
@@ -4799,8 +4799,7 @@
              visitor.deframer_.spdy_framer_error());
 }
 
-// Test that SpdyFramer processes, by default, all passed input in one call
-// to ProcessInput (i.e. will not be calling set_process_single_input_frame()).
+// Test that SpdyFramer processes all passed input in one call to ProcessInput.
 TEST_P(SpdyFramerTest, ProcessAllInput) {
   auto visitor =
       std::make_unique<TestSpdyVisitor>(SpdyFramer::DISABLE_COMPRESSION);
@@ -4846,88 +4845,6 @@
   EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_));
 }
 
-// Test that SpdyFramer stops after processing a full frame if
-// process_single_input_frame is set. Input to ProcessInput has two frames, but
-// only processes the first when we give it the first frame split at any point,
-// or give it more than one frame in the input buffer.
-TEST_P(SpdyFramerTest, ProcessAtMostOneFrame) {
-  deframer_.set_process_single_input_frame(true);
-
-  // Create two input frames.
-  const char four_score[] = "Four score and ...";
-  SpdyDataIR four_score_ir(/* stream_id = */ 1, four_score);
-  SpdySerializedFrame four_score_frame(framer_.SerializeData(four_score_ir));
-
-  SpdyHeadersIR headers(/* stream_id = */ 2);
-  headers.SetHeader("alpha", "beta");
-  headers.SetHeader("gamma", "charlie");
-  headers.SetHeader("cookie", "key1=value1; key2=value2");
-  SpdySerializedFrame headers_frame(SpdyFramerPeer::SerializeHeaders(
-      &framer_, headers, use_output_ ? &output_ : nullptr));
-
-  // Put them in a single buffer (new variables here to make it easy to
-  // change the order and type of frames).
-  SpdySerializedFrame frame1 = std::move(four_score_frame);
-  SpdySerializedFrame frame2 = std::move(headers_frame);
-
-  const size_t frame1_size = frame1.size();
-  const size_t frame2_size = frame2.size();
-
-  SPDY_VLOG(1) << "frame1_size = " << frame1_size;
-  SPDY_VLOG(1) << "frame2_size = " << frame2_size;
-
-  std::string input_buffer;
-  input_buffer.append(frame1.data(), frame1_size);
-  input_buffer.append(frame2.data(), frame2_size);
-
-  const char* buf = input_buffer.data();
-  const size_t buf_size = input_buffer.size();
-
-  SPDY_VLOG(1) << "buf_size = " << buf_size;
-
-  for (size_t first_size = 0; first_size <= buf_size; ++first_size) {
-    SPDY_VLOG(1) << "first_size = " << first_size;
-    auto visitor =
-        std::make_unique<TestSpdyVisitor>(SpdyFramer::DISABLE_COMPRESSION);
-    deframer_.set_visitor(visitor.get());
-
-    EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
-
-    size_t processed_first = deframer_.ProcessInput(buf, first_size);
-    if (first_size < frame1_size) {
-      EXPECT_EQ(first_size, processed_first);
-
-      if (first_size == 0) {
-        EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
-      } else {
-        EXPECT_NE(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
-      }
-
-      const char* rest = buf + processed_first;
-      const size_t remaining = buf_size - processed_first;
-      SPDY_VLOG(1) << "remaining = " << remaining;
-
-      size_t processed_second = deframer_.ProcessInput(rest, remaining);
-
-      // Redundant tests just to make it easier to think about.
-      EXPECT_EQ(frame1_size - processed_first, processed_second);
-      size_t processed_total = processed_first + processed_second;
-      EXPECT_EQ(frame1_size, processed_total);
-    } else {
-      EXPECT_EQ(frame1_size, processed_first);
-    }
-
-    EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
-
-    // At this point should have processed the entirety of the first frame,
-    // and none of the second frame.
-
-    EXPECT_EQ(1, visitor->data_frame_count_);
-    EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_));
-    EXPECT_EQ(0, visitor->headers_frame_count_);
-  }
-}
-
 namespace {
 void CheckFrameAndIRSize(SpdyFrameIR* ir,
                          SpdyFramer* framer,
